]> andersk Git - moira.git/blob - lib/kname_unparse.c
a694b20da8b5994c466b9b5a71c7352b8f93823f
[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(char *p, char *i, char *r)
17 {
18   static char name[MAX_K_NAME_SZ];
19   char *s;
20
21   s = name;
22   if (!p || strlen(p) > ANAME_SZ)
23     return NULL;
24   while (*p)
25     {
26       switch (*p)
27         {
28         case '@':
29           *s++ = '\\';
30           *s++ = '@';
31           break;
32         case '.':
33           *s++ = '\\';
34           *s++ = '.';
35           break;
36         case '\\':
37           *s++ = '\\';
38           *s++ = '\\';
39           break;
40         default:
41           *s++ = *p;
42         }
43       p++;
44     }
45   if (i && *i)
46     {
47       if (strlen(i) > INST_SZ)
48         return NULL;
49       *s++ = '.';
50       while (*i)
51         {
52           switch (*i)
53             {
54             case '@':
55               *s++ = '\\';
56               *s++ = '@';
57               break;
58             case '.':
59               *s++ = '\\';
60               *s++ = '.';
61               break;
62             case '\\':
63               *s++ = '\\';
64               *s++ = '\\';
65               break;
66             default:
67               *s++ = *i;
68             }
69           i++;
70         }
71     }
72   *s++ = '@';
73   if (!r || strlen(r) > REALM_SZ)
74     return NULL;
75   while (*r)
76     {
77       switch (*r)
78         {
79         case '@':
80           *s++ = '\\';
81           *s++ = '@';
82           break;
83         case '\\':
84           *s++ = '\\';
85           *s++ = '\\';
86           break;
87         default:
88           *s++ = *r;
89         }
90       r++;
91     }
92   *s = '\0';
93   return &name[0];
94 }
This page took 0.038661 seconds and 3 git commands to generate.