]> andersk Git - moira.git/blob - lib/kname_parse.c
Left out of original commit.
[moira.git] / lib / kname_parse.c
1 /* $Id$
2  *
3  * Provide a copy of kname_parse() from krb4 for when krb4 is no
4  * longer available.
5  *
6  * Copyright (C) 2009 by the Massachusetts Institute of Technology
7  * For copying and distribution information, please see the file
8  * <mit-copyright.h>.
9  */
10
11 #include <mit-copyright.h>
12 #include <moira.h>
13
14 #include <string.h>
15
16 #ifdef HAVE_KRB4
17 #include <krb.h>
18 #else
19 #include <mr_krb.h>
20
21 #define KRBET_KNAME_FMT                          (39525457L)
22 #define KNAME_FMT                                (KRBET_KNAME_FMT - ERROR_TABLE_BASE_krb)
23 #endif
24
25 RCSID("$Header$");
26
27 #define NAME    0               /* which field are we in? */
28 #define INST    1
29 #define REALM   2
30
31 int mr_kname_parse(char *np, char *ip, char *rp, char *fullname)
32 {
33   char buf[MAX_K_NAME_SZ];
34   char *rnext, *wnext;        /* next char to read, write */
35   register char c;
36   int backslash;
37   int field;
38
39   backslash = 0;
40   rnext = buf;
41   wnext = np;
42   field = NAME;
43
44   if (strlen(fullname) > MAX_K_NAME_SZ)
45     return KNAME_FMT;
46   (void) strcpy(buf, fullname);
47
48   while ((c = *rnext++)) {
49     if (backslash) {
50       *wnext++ = c;
51       backslash = 0;
52       continue;
53     }
54     switch (c) {
55     case '\\':
56       backslash++;
57       break;
58     case '.':
59       switch (field) {
60       case NAME:
61         if (wnext == np)
62           return KNAME_FMT;
63         *wnext = '\0';
64         field = INST;
65         wnext = ip;
66         break;
67       case INST:          /* We now allow period in instance */
68       case REALM:
69         *wnext++ = c;
70         break;
71       default:
72         return KNAME_FMT;
73       }
74       break;
75     case '@':
76       switch (field) {
77       case NAME:
78         if (wnext == np)
79           return KNAME_FMT;
80         *ip = '\0';
81         /* fall through */
82       case INST:
83         *wnext = '\0';
84         field = REALM;
85         wnext = rp;
86         break;
87       case REALM:
88         return KNAME_FMT;
89       default:
90         return KNAME_FMT;
91       }
92       break;
93     default:
94       *wnext++ = c;
95     }
96     /*
97      * Paranoia: check length each time through to ensure that we
98      * don't overwrite things.
99      */
100     switch (field) {
101     case NAME:
102       if (wnext - np >= ANAME_SZ)
103         return KNAME_FMT;
104       break;
105     case INST:
106       if (wnext - ip >= INST_SZ)
107         return KNAME_FMT;
108       break;
109     case REALM:
110       if (wnext - rp >= REALM_SZ)
111         return KNAME_FMT;
112       break;
113     default:
114       return KNAME_FMT;
115     }
116   }
117   *wnext = '\0';
118   return 0;
119 }
This page took 0.202229 seconds and 5 git commands to generate.