]> andersk Git - moira.git/blob - lib/kname_unparse.c
POSIX, ANSI, sanity fixes
[moira.git] / lib / kname_unparse.c
1 /* $Header$
2  *
3  * Don't know why this function is not in libkrb.a.  It's the inverse
4  * of kname_parse() which is there.
5  */
6
7 #include <stdio.h>
8 #include <des.h>
9 #include <krb.h>
10
11 /* Turn a principal, instance, realm triple into a single non-ambiguous 
12  * string.  This is the inverse of kname_parse().  It returns a pointer
13  * to a static buffer, or NULL on error.
14  */
15
16 char *kname_unparse(p, i, r)
17 char *p;
18 char *i;
19 char *r;
20 {
21     static char name[MAX_K_NAME_SZ];
22     char *s;
23
24     s = name;
25     if (!p || strlen(p) > ANAME_SZ)
26       return(NULL);
27     while (*p) {
28         switch (*p) {
29         case '@':
30             *s++ = '\\';
31             *s++ = '@';
32             break;
33         case '.':
34             *s++ = '\\';
35             *s++ = '.';
36             break;
37         case '\\':
38             *s++ = '\\';
39             *s++ = '\\';
40             break;
41         default:
42             *s++ = *p;
43         }
44         p++;
45     }
46     if (i && *i) {
47         if (strlen(i) > INST_SZ)
48           return(NULL);
49         *s++ = '.';
50         while (*i) {
51             switch (*i) {
52             case '@':
53                 *s++ = '\\';
54                 *s++ = '@';
55                 break;
56             case '.':
57                 *s++ = '\\';
58                 *s++ = '.';
59                 break;
60             case '\\':
61                 *s++ = '\\';
62                 *s++ = '\\';
63                 break;
64             default:
65                 *s++ = *i;
66             }
67             i++;
68         }
69     }
70     *s++ = '@';
71     if (!r || strlen(r) > REALM_SZ)
72       return(NULL);
73     while (*r) {
74         switch (*r) {
75         case '@':
76             *s++ = '\\';
77             *s++ = '@';
78             break;
79         case '\\':
80             *s++ = '\\';
81             *s++ = '\\';
82             break;
83         default:
84             *s++ = *r;
85         }
86         r++;
87     }
88     *s = '\0';
89     return(&name[0]);
90 }
This page took 0.041441 seconds and 5 git commands to generate.