]> asedeno.scripts.mit.edu Git - 1ts-debian.git/blob - zephyr/lib/ZGetSender.c
f62619d8ce2137b19c15f9f35f993bd1e63b9697
[1ts-debian.git] / zephyr / lib / ZGetSender.c
1 /* This file is part of the Project Athena Zephyr Notification System.
2  * It contains source for the ZGetSender.c function.
3  *
4  *      Created by:     Robert French
5  *
6  *      $Id$
7  *
8  *      Copyright (c) 1987, 1991 by the Massachusetts Institute of Technology.
9  *      For copying and distribution information, see the file
10  *      "mit-copyright.h". 
11  */
12
13 #include <internal.h>
14
15 #ifndef lint
16 static const char rcsid_ZGetSender_c[] =
17     "$Id$";
18 #endif
19
20 #include <pwd.h>
21
22 char *ZGetSender()
23 {
24     struct passwd *pw;
25     static char *sender = NULL;
26 #ifdef HAVE_KRB5
27     krb5_ccache ccache;
28     krb5_principal principal;
29     char *prname;
30     int result;
31     char pname[ANAME_SZ], pinst[INST_SZ], prealm[REALM_SZ]; /*XXX*/
32 #else    
33 #ifdef HAVE_KRB4
34     char pname[ANAME_SZ], pinst[INST_SZ], prealm[REALM_SZ];
35 #endif 
36 #endif
37
38     /* Return it if already cached */
39     if (sender)
40         return (sender);
41
42 #ifdef HAVE_KRB5
43     result = krb5_cc_default(Z_krb5_ctx, &ccache);
44     if (!result) {
45       result = krb5_cc_get_principal(Z_krb5_ctx, ccache, &principal);
46       if (!result) {
47         krb5_unparse_name(Z_krb5_ctx, principal, &prname);
48         sender = strdup(prname);
49         krb5_free_principal(Z_krb5_ctx, principal);
50         return sender;
51       }
52       krb5_cc_close(Z_krb5_ctx, ccache);
53     } 
54 #else
55 #ifdef HAVE_KRB4
56     if (krb_get_tf_fullname((char *)TKT_FILE, pname, pinst, prealm) == KSUCCESS)
57     {
58         sender = malloc(ANAME_SZ+INST_SZ+REALM_SZ+3);
59         if (sender)
60           (void) sprintf(sender, "%s%s%s@%s", pname, (pinst[0]?".":""),
61                          pinst, prealm);
62         return (sender);
63     }
64 #endif
65 #endif
66
67     /* XXX a uid_t is a u_short (now),  but getpwuid
68      * wants an int. AARGH! */
69     pw = getpwuid((int) getuid());
70     if (!pw)
71         return ("unknown");
72     sender = malloc(strlen(pw->pw_name) + strlen(__Zephyr_realm) + 2);
73     if (sender)
74       (void) sprintf(sender, "%s@%s", pw->pw_name, __Zephyr_realm);
75     return (sender);
76 }