]>
Commit | Line | Data |
---|---|---|
d80d8d5a | 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 | } |