Annotation of 43BSDReno/old/athena/klist/klist.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * $Source: /mit/kerberos/src/kuser/RCS/klist.c,v $
                      3:  * $Author: jtkohl $ 
                      4:  *
                      5:  * Copyright 1987, 1988 by the Massachusetts Institute of Technology. 
                      6:  *
                      7:  * For copying and distribution information, please see the file
                      8:  * <mit-copyright.h>. 
                      9:  *
                     10:  * Lists your current Kerberos tickets.
                     11:  * Written by Bill Sommerfeld, MIT Project Athena.
                     12:  */
                     13: 
                     14: #ifndef        lint
                     15: static char rcsid_klist_c[] =
                     16: "$Header: klist.c,v 4.11 89/01/23 09:34:58 jtkohl Exp $";
                     17: #endif lint
                     18: 
                     19: #include <kerberos/mit-copyright.h>
                     20: #include <stdio.h>
                     21: #include <strings.h>
                     22: #include <sys/file.h>
                     23: #include <kerberos/krb.h>
                     24: #include <kerberos/prot.h>
                     25: 
                     26: char   *tkt_string();
                     27: char   *short_date();
                     28: char   *whoami;                        /* What was I invoked as?? */
                     29: char   *getenv();
                     30: 
                     31: extern char *krb_err_txt[];
                     32: 
                     33: /* ARGSUSED */
                     34: main(argc, argv)
                     35:     int     argc;
                     36:     char  **argv;
                     37: {
                     38:     int     long_form = 1;
                     39:     int     tgt_test = 0;
                     40:     int     do_srvtab = 0;
                     41:     char   *tkt_file = NULL;
                     42:     char   *cp;
                     43: 
                     44:     whoami = (cp = rindex(*argv, '/')) ? cp + 1 : *argv;
                     45: 
                     46:     while (*(++argv)) {
                     47:        if (!strcmp(*argv, "-s")) {
                     48:            long_form = 0;
                     49:            continue;
                     50:        }
                     51:        if (!strcmp(*argv, "-t")) {
                     52:            tgt_test = 1;
                     53:            long_form = 0;
                     54:            continue;
                     55:        }
                     56:        if (!strcmp(*argv, "-l")) {     /* now default */
                     57:            continue;
                     58:        }
                     59:        if (!strcmp(*argv, "-file")) {
                     60:            if (*(++argv)) {
                     61:                tkt_file = *argv;
                     62:                continue;
                     63:            } else
                     64:                usage();
                     65:        }
                     66:        if (!strcmp(*argv, "-srvtab")) {
                     67:                if (tkt_file == NULL)   /* if no other file spec'ed,
                     68:                                           set file to default srvtab */
                     69:                    tkt_file = KEYFILE;
                     70:                do_srvtab = 1;
                     71:                continue;
                     72:        }
                     73:        usage();
                     74:     }
                     75: 
                     76:     if (do_srvtab)
                     77:        display_srvtab(tkt_file);
                     78:     else
                     79:        display_tktfile(tkt_file, tgt_test, long_form);
                     80:     exit(0);
                     81: }
                     82: 
                     83: 
                     84: display_tktfile(file, tgt_test, long_form)
                     85: char *file;
                     86: int tgt_test, long_form;
                     87: {
                     88:     char    pname[ANAME_SZ];
                     89:     char    pinst[INST_SZ];
                     90:     char    prealm[REALM_SZ];
                     91:     char    buf1[20], buf2[20];
                     92:     int     k_errno;
                     93:     CREDENTIALS c;
                     94:     int     header = 1;
                     95: 
                     96:     if ((file == NULL) && ((file = getenv("KRBTKFILE")) == NULL))
                     97:        file = TKT_FILE;
                     98: 
                     99:     if (long_form)
                    100:        printf("Ticket file:    %s\n", file);
                    101: 
                    102:     /* Open ticket file */
                    103:     if (k_errno = tf_init(file, R_TKT_FIL)) {
                    104:        if (!tgt_test)
                    105:                fprintf(stderr, "%s: %s\n", whoami, krb_err_txt[k_errno]);
                    106:        exit(1);
                    107:     }
                    108:     /* Get principal name and instance */
                    109:     if ((k_errno = tf_get_pname(pname)) ||
                    110:        (k_errno = tf_get_pinst(pinst))) {
                    111:            if (!tgt_test)
                    112:                    fprintf(stderr, "%s: %s\n", whoami, krb_err_txt[k_errno]);
                    113:            exit(1);
                    114:     }
                    115:     if ((k_errno = krb_get_lrealm(prealm, 1)) != KSUCCESS) {
                    116:        fprintf(stderr, "%s: can't find local realm: %s\n",
                    117:                whoami, krb_err_txt[k_errno]);
                    118:        exit(1);
                    119:     }
                    120:     if (!tgt_test && long_form)
                    121:        printf("Principal:\t%s%s%s%s%s\n\n", pname,
                    122:               (pinst[0] ? "." : ""), pinst,
                    123:               (prealm[0] ? "@" : ""), prealm);
                    124:     while ((k_errno = tf_get_cred(&c)) == KSUCCESS) {
                    125:        if (!tgt_test && long_form && header) {
                    126:            printf("%-15s  %-15s  %s\n",
                    127:                   "  Issued", "  Expires", "  Principal");
                    128:            header = 0;
                    129:        }
                    130:        if (tgt_test) {
                    131:            c.issue_date += ((unsigned char) c.lifetime) * 5 * 60;
                    132:            if (!strcmp(c.service, TICKET_GRANTING_TICKET) &&
                    133:                !strcmp(c.instance, prealm)) {
                    134:                if (time(0) < c.issue_date)
                    135:                    exit(0);            /* tgt hasn't expired */
                    136:                else
                    137:                    exit(1);            /* has expired */
                    138:            }
                    139:            continue;                   /* not a tgt */
                    140:        }
                    141:        if (long_form) {
                    142:            (void) strcpy(buf1, short_date(&c.issue_date));
                    143:            c.issue_date += c.lifetime * 5 * 60;
                    144:            (void) strcpy(buf2, short_date(&c.issue_date));
                    145:            printf("%s  %s  ", buf1, buf2);
                    146:        }
                    147:        printf("%s%s%s%s%s\n",
                    148:               c.service, (c.instance[0] ? "." : ""), c.instance,
                    149:               (c.realm[0] ? "@" : ""), c.realm);
                    150:     }
                    151:     if (tgt_test)
                    152:        exit(1);                        /* no tgt found */
                    153:     if (header && long_form && k_errno == EOF) {
                    154:        printf("No tickets in file.\n");
                    155:     }
                    156: }
                    157: 
                    158: char   *
                    159: short_date(dp)
                    160:     long   *dp;
                    161: {
                    162:     register char *cp;
                    163:     extern char *ctime();
                    164:     cp = ctime(dp) + 4;
                    165:     cp[15] = '\0';
                    166:     return (cp);
                    167: }
                    168: 
                    169: usage()
                    170: {
                    171:     fprintf(stderr,
                    172:         "Usage: %s [ -s | -t ] [ -file filename ] [ -srvtab ]\n", whoami);
                    173:     exit(1);
                    174: }
                    175: 
                    176: display_srvtab(file)
                    177: char *file;
                    178: {
                    179:     int stab;
                    180:     char serv[SNAME_SZ];
                    181:     char inst[INST_SZ];
                    182:     char rlm[REALM_SZ];
                    183:     unsigned char key[8];
                    184:     unsigned char vno;
                    185:     int count;
                    186: 
                    187:     printf("Server key file:   %s\n", file);
                    188:        
                    189:     if ((stab = open(file, O_RDONLY, 0400)) < 0) {
                    190:        perror(file);
                    191:        exit(1);
                    192:     }
                    193:     printf("%-15s %-15s %-10s      %s\n","Service","Instance","Realm",
                    194:           "Key Version");
                    195:     printf("-----------------------------------------------------------\n");
                    196: 
                    197:     /* argh. getst doesn't return error codes, it silently fails */
                    198:     while (((count = ok_getst(stab, serv, SNAME_SZ)) > 0)
                    199:           && ((count = ok_getst(stab, inst, INST_SZ)) > 0)
                    200:           && ((count = ok_getst(stab, rlm, REALM_SZ)) > 0)) {
                    201:        if (((count = read(stab,(char *) &vno,1)) != 1) ||
                    202:             ((count = read(stab,(char *) key,8)) != 8)) {
                    203:            if (count < 0)
                    204:                perror("reading from key file");
                    205:            else
                    206:                fprintf(stderr, "key file truncated\n");
                    207:            exit(1);
                    208:        }
                    209:        printf("%-15s %-15s %-15s %d\n",serv,inst,rlm,vno);
                    210:     }
                    211:     if (count < 0)
                    212:        perror(file);
                    213:     (void) close(stab);
                    214: }
                    215: 
                    216: /* adapted from getst() in librkb */
                    217: /*
                    218:  * ok_getst() takes a file descriptor, a string and a count.  It reads
                    219:  * from the file until either it has read "count" characters, or until
                    220:  * it reads a null byte.  When finished, what has been read exists in
                    221:  * the given string "s".  If "count" characters were actually read, the
                    222:  * last is changed to a null, so the returned string is always null-
                    223:  * terminated.  ok_getst() returns the number of characters read, including
                    224:  * the null terminator.
                    225:  *
                    226:  * If there is a read error, it returns -1 (like the read(2) system call)
                    227:  */
                    228: 
                    229: ok_getst(fd, s, n)
                    230:     int fd;
                    231:     register char *s;
                    232: {
                    233:     register count = n;
                    234:     int err;
                    235:     while ((err = read(fd, s, 1)) > 0 && --count)
                    236:         if (*s++ == '\0')
                    237:             return (n - count);
                    238:     if (err < 0)
                    239:        return(-1);
                    240:     *s = '\0';
                    241:     return (n - count);
                    242: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.