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 <afsconfig.h>
48 #include <afs/param.h>
57 #include "kauth_internal.h"
60 krb_write_ticket_file(char *realm)
62 char ticket_file[AFSDIR_PATH_MAX];
68 struct ktc_principal client, server;
69 struct ktc_token token;
71 if ((strlen(realm) >= sizeof(client.cell)))
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);
81 /* Use the KRBTKFILE environment variable if it exists, otherwise fall
82 * back upon /tmp/tkt(uid}.
84 if ((tf_name = (char *)getenv("KRBTKFILE")))
85 (void)sprintf(ticket_file, "%s", tf_name);
87 (void)sprintf(ticket_file, "%s/tkt%d", gettmpdir(), getuid());
88 fd = open(ticket_file, O_WRONLY + O_CREAT + O_TRUNC, 0700);
92 /* write client name as file header */
94 count = strlen(client.name) + 1;
95 if (write(fd, client.name, count) != count)
98 count = strlen(client.instance) + 1;
99 if (write(fd, client.instance, count) != count)
102 /* Write the ticket and associated data */
104 count = strlen(server.name) + 1;
105 if (write(fd, server.name, count) != count)
108 count = strlen(server.instance) + 1;
109 if (write(fd, server.instance, count) != count)
112 ucstring(server.cell, server.cell, sizeof(server.cell));
113 count = strlen(server.cell) + 1;
114 if (write(fd, server.cell, count) != count)
117 if (write(fd, (char *)&token.sessionKey, 8) != 8)
120 lifetime = time_to_life(token.startTime, token.endTime);
121 if (write(fd, (char *)&lifetime, sizeof(int)) != sizeof(int))
125 if (write(fd, (char *)&kvno, sizeof(int)) != sizeof(int))
128 if (write(fd, (char *)&(token.ticketLen), sizeof(int)) != sizeof(int))
131 count = token.ticketLen;
132 if (write(fd, (char *)(token.ticket), count) != count)
135 if (write(fd, (char *)&(token.startTime), sizeof(afs_int32))
136 != sizeof(afs_int32))