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>
48 #include <afsconfig.h>
58 #include <sys/types.h>
65 afs_int32 krb_write_ticket_file (realm)
67 { char ticket_file[AFSDIR_PATH_MAX];
73 struct ktc_principal client, server;
74 struct ktc_token token;
76 if ((strlen(realm) >= sizeof(client.cell))) return KABADNAME;
77 strcpy (server.name, KA_TGS_NAME);
78 strcpy (server.instance, realm);
79 lcstring (server.cell, realm, sizeof(server.cell));
81 code = ktc_GetToken (&server, &token, sizeof(struct ktc_token), &client);
82 if (code) return code;
84 /* Use the KRBTKFILE environment variable if it exists, otherwise fall
85 * back upon /tmp/tkt(uid}.
87 if (tf_name = (char *) getenv("KRBTKFILE"))
88 (void) sprintf(ticket_file, "%s", tf_name);
90 (void) sprintf(ticket_file, "%s/tkt%d", gettmpdir(), getuid());
91 fd = open (ticket_file, O_WRONLY+O_CREAT+O_TRUNC, 0700);
92 if (fd <= 0) return errno;
94 /* write client name as file header */
96 count = strlen(client.name) + 1;
97 if (write(fd, client.name, count) != count)
100 count = strlen(client.instance) + 1;
101 if (write(fd, client.instance, count) != count)
104 /* Write the ticket and associated data */
106 count = strlen(server.name) + 1;
107 if (write(fd, server.name, count) != count)
110 count = strlen(server.instance) + 1;
111 if (write(fd, server.instance, count) != count)
114 ucstring (server.cell, server.cell, sizeof(server.cell));
115 count = strlen(server.cell) + 1;
116 if (write(fd, server.cell, count) != count)
119 if (write(fd, (char *) &token.sessionKey, 8) != 8)
122 lifetime = time_to_life (token.startTime, token.endTime);
123 if (write(fd, (char *) &lifetime, sizeof(int)) != sizeof(int))
127 if (write(fd, (char *) &kvno, sizeof(int)) != sizeof(int))
130 if (write(fd, (char *) &(token.ticketLen), sizeof(int)) !=
134 count = token.ticketLen;
135 if (write(fd, (char *) (token.ticket), count) != count)
138 if (write(fd, (char *) &token.startTime, sizeof(afs_int32))
139 != sizeof(afs_int32))