2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
14 /* This modified from the code in kerberos/src/lib/krb/tf_util.c. */
17 * This file contains routines for manipulating the ticket cache file.
19 * The ticket file is in the following format:
21 * principal's name (null-terminated string)
22 * principal's instance (null-terminated string)
29 * Where "CREDENTIAL_x" consists of the following fixed-length
30 * fields from the CREDENTIALS structure (see "krb.h"):
32 * char service[ANAME_SZ]
33 * char instance[INST_SZ]
34 * char realm[REALM_SZ]
39 * afs_int32 issue_date
44 /* Inspite of what the above comment suggests the fields are not fixed length
45 but null terminated as you might figure, except for the ticket which is
46 preceded by a 4 byte length. All fields in host order. 890306 */
47 #include <afs/param.h>
54 #include <sys/types.h>
61 afs_int32 krb_write_ticket_file (realm)
63 { char ticket_file[AFSDIR_PATH_MAX];
69 struct ktc_principal client, server;
70 struct ktc_token token;
72 if ((strlen(realm) >= sizeof(client.cell))) return KABADNAME;
73 strcpy (server.name, KA_TGS_NAME);
74 strcpy (server.instance, realm);
75 lcstring (server.cell, realm, sizeof(server.cell));
77 code = ktc_GetToken (&server, &token, sizeof(struct ktc_token), &client);
78 if (code) return code;
80 /* Use the KRBTKFILE environment variable if it exists, otherwise fall
81 * back upon /tmp/tkt(uid}.
83 if (tf_name = (char *) getenv("KRBTKFILE"))
84 (void) sprintf(ticket_file, "%s", tf_name);
86 (void) sprintf(ticket_file, "%s/tkt%d", gettmpdir(), getuid());
87 fd = open (ticket_file, O_WRONLY+O_CREAT+O_TRUNC, 0700);
88 if (fd <= 0) return errno;
90 /* write client name as file header */
92 count = strlen(client.name) + 1;
93 if (write(fd, client.name, count) != count)
96 count = strlen(client.instance) + 1;
97 if (write(fd, client.instance, count) != count)
100 /* Write the ticket and associated data */
102 count = strlen(server.name) + 1;
103 if (write(fd, server.name, count) != count)
106 count = strlen(server.instance) + 1;
107 if (write(fd, server.instance, count) != count)
110 ucstring (server.cell, server.cell, sizeof(server.cell));
111 count = strlen(server.cell) + 1;
112 if (write(fd, server.cell, count) != count)
115 if (write(fd, (char *) &token.sessionKey, 8) != 8)
118 lifetime = time_to_life (token.startTime, token.endTime);
119 if (write(fd, (char *) &lifetime, sizeof(int)) != sizeof(int))
123 if (write(fd, (char *) &kvno, sizeof(int)) != sizeof(int))
126 if (write(fd, (char *) &(token.ticketLen), sizeof(int)) !=
130 count = token.ticketLen;
131 if (write(fd, (char *) (token.ticket), count) != count)
134 if (write(fd, (char *) &token.startTime, sizeof(afs_int32))
135 != sizeof(afs_int32))