Annotation of 43BSDReno/kerberosIV/klist/klist.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * $Source: /usr/src/kerberosIV/klist/RCS/klist.c,v $
        !             3:  * $Author: kfall $ 
        !             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: /usr/src/kerberosIV/klist/RCS/klist.c,v 4.16 90/06/25 21:01:52 kfall Exp $";
        !            17: #endif lint
        !            18: 
        !            19: #include <mit-copyright.h>
        !            20: #include <stdio.h>
        !            21: #include <strings.h>
        !            22: #include <sys/file.h>
        !            23: #include <des.h>
        !            24: #include <krb.h>
        !            25: #include <prot.h>
        !            26: 
        !            27: char   *tkt_string();
        !            28: char   *short_date();
        !            29: char   *whoami;                        /* What was I invoked as?? */
        !            30: char   *getenv();
        !            31: 
        !            32: extern char *krb_err_txt[];
        !            33: 
        !            34: /* ARGSUSED */
        !            35: main(argc, argv)
        !            36:     int     argc;
        !            37:     char  **argv;
        !            38: {
        !            39:     int     long_form = 1;
        !            40:     int     tgt_test = 0;
        !            41:     int     do_srvtab = 0;
        !            42:     char   *tkt_file = NULL;
        !            43:     char   *cp;
        !            44: 
        !            45:     whoami = (cp = rindex(*argv, '/')) ? cp + 1 : *argv;
        !            46: 
        !            47:     while (*(++argv)) {
        !            48:        if (!strcmp(*argv, "-s")) {
        !            49:            long_form = 0;
        !            50:            continue;
        !            51:        }
        !            52:        if (!strcmp(*argv, "-t")) {
        !            53:            tgt_test = 1;
        !            54:            long_form = 0;
        !            55:            continue;
        !            56:        }
        !            57:        if (!strcmp(*argv, "-l")) {     /* now default */
        !            58:            continue;
        !            59:        }
        !            60:        if (!strcmp(*argv, "-file")) {
        !            61:            if (*(++argv)) {
        !            62:                tkt_file = *argv;
        !            63:                continue;
        !            64:            } else
        !            65:                usage();
        !            66:        }
        !            67:        if (!strcmp(*argv, "-srvtab")) {
        !            68:                if (tkt_file == NULL)   /* if no other file spec'ed,
        !            69:                                           set file to default srvtab */
        !            70:                    tkt_file = KEYFILE;
        !            71:                do_srvtab = 1;
        !            72:                continue;
        !            73:        }
        !            74:        usage();
        !            75:     }
        !            76: 
        !            77:     if (do_srvtab)
        !            78:        display_srvtab(tkt_file);
        !            79:     else
        !            80:        display_tktfile(tkt_file, tgt_test, long_form);
        !            81:     exit(0);
        !            82: }
        !            83: 
        !            84: 
        !            85: display_tktfile(file, tgt_test, long_form)
        !            86: char *file;
        !            87: int tgt_test, long_form;
        !            88: {
        !            89:     char    pname[ANAME_SZ];
        !            90:     char    pinst[INST_SZ];
        !            91:     char    prealm[REALM_SZ];
        !            92:     char    buf1[20], buf2[20];
        !            93:     int     k_errno;
        !            94:     CREDENTIALS c;
        !            95:     int     header = 1;
        !            96: 
        !            97:     if ((file == NULL) && ((file = getenv("KRBTKFILE")) == NULL))
        !            98:        file = TKT_FILE;
        !            99: 
        !           100:     if (long_form)
        !           101:        printf("Ticket file:    %s\n", file);
        !           102: 
        !           103:     /* 
        !           104:      * Since krb_get_tf_realm will return a ticket_file error, 
        !           105:      * we will call tf_init and tf_close first to filter out
        !           106:      * things like no ticket file.  Otherwise, the error that 
        !           107:      * the user would see would be 
        !           108:      * klist: can't find realm of ticket file: No ticket file (tf_util)
        !           109:      * instead of
        !           110:      * klist: No ticket file (tf_util)
        !           111:      */
        !           112: 
        !           113:     /* Open ticket file */
        !           114:     if (k_errno = tf_init(file, R_TKT_FIL)) {
        !           115:        if (!tgt_test)
        !           116:                fprintf(stderr, "%s: %s\n", whoami, krb_err_txt[k_errno]);
        !           117:        exit(1);
        !           118:     }
        !           119:     /* Close ticket file */
        !           120:     (void) tf_close();
        !           121: 
        !           122:     /* 
        !           123:      * We must find the realm of the ticket file here before calling
        !           124:      * tf_init because since the realm of the ticket file is not
        !           125:      * really stored in the principal section of the file, the
        !           126:      * routine we use must itself call tf_init and tf_close.
        !           127:      */
        !           128:     if ((k_errno = krb_get_tf_realm(file, prealm)) != KSUCCESS) {
        !           129:        if (!tgt_test)
        !           130:            fprintf(stderr, "%s: can't find realm of ticket file: %s\n",
        !           131:                    whoami, krb_err_txt[k_errno]);
        !           132:        exit(1);
        !           133:     }
        !           134: 
        !           135:     /* Open ticket file */
        !           136:     if (k_errno = tf_init(file, R_TKT_FIL)) {
        !           137:        if (!tgt_test)
        !           138:                fprintf(stderr, "%s: %s\n", whoami, krb_err_txt[k_errno]);
        !           139:        exit(1);
        !           140:     }
        !           141:     /* Get principal name and instance */
        !           142:     if ((k_errno = tf_get_pname(pname)) ||
        !           143:        (k_errno = tf_get_pinst(pinst))) {
        !           144:            if (!tgt_test)
        !           145:                    fprintf(stderr, "%s: %s\n", whoami, krb_err_txt[k_errno]);
        !           146:            exit(1);
        !           147:     }
        !           148: 
        !           149:     /* 
        !           150:      * You may think that this is the obvious place to get the
        !           151:      * realm of the ticket file, but it can't be done here as the
        !           152:      * routine to do this must open the ticket file.  This is why 
        !           153:      * it was done before tf_init.
        !           154:      */
        !           155:        
        !           156:     if (!tgt_test && long_form)
        !           157:        printf("Principal:\t%s%s%s%s%s\n\n", pname,
        !           158:               (pinst[0] ? "." : ""), pinst,
        !           159:               (prealm[0] ? "@" : ""), prealm);
        !           160:     while ((k_errno = tf_get_cred(&c)) == KSUCCESS) {
        !           161:        if (!tgt_test && long_form && header) {
        !           162:            printf("%-15s  %-15s  %s\n",
        !           163:                   "  Issued", "  Expires", "  Principal");
        !           164:            header = 0;
        !           165:        }
        !           166:        if (tgt_test) {
        !           167:            c.issue_date += ((unsigned char) c.lifetime) * 5 * 60;
        !           168:            if (!strcmp(c.service, TICKET_GRANTING_TICKET) &&
        !           169:                !strcmp(c.instance, prealm)) {
        !           170:                if (time(0) < c.issue_date)
        !           171:                    exit(0);            /* tgt hasn't expired */
        !           172:                else
        !           173:                    exit(1);            /* has expired */
        !           174:            }
        !           175:            continue;                   /* not a tgt */
        !           176:        }
        !           177:        if (long_form) {
        !           178:            (void) strcpy(buf1, short_date(&c.issue_date));
        !           179:            c.issue_date += ((unsigned char) c.lifetime) * 5 * 60;
        !           180:            (void) strcpy(buf2, short_date(&c.issue_date));
        !           181:            printf("%s  %s  ", buf1, buf2);
        !           182:        }
        !           183:        printf("%s%s%s%s%s\n",
        !           184:               c.service, (c.instance[0] ? "." : ""), c.instance,
        !           185:               (c.realm[0] ? "@" : ""), c.realm);
        !           186:     }
        !           187:     if (tgt_test)
        !           188:        exit(1);                        /* no tgt found */
        !           189:     if (header && long_form && k_errno == EOF) {
        !           190:        printf("No tickets in file.\n");
        !           191:     }
        !           192: }
        !           193: 
        !           194: char   *
        !           195: short_date(dp)
        !           196:     long   *dp;
        !           197: {
        !           198:     register char *cp;
        !           199:     extern char *ctime();
        !           200:     cp = ctime(dp) + 4;
        !           201:     cp[15] = '\0';
        !           202:     return (cp);
        !           203: }
        !           204: 
        !           205: usage()
        !           206: {
        !           207:     fprintf(stderr,
        !           208:         "Usage: %s [ -s | -t ] [ -file filename ] [ -srvtab ]\n", whoami);
        !           209:     exit(1);
        !           210: }
        !           211: 
        !           212: display_srvtab(file)
        !           213: char *file;
        !           214: {
        !           215:     int stab;
        !           216:     char serv[SNAME_SZ];
        !           217:     char inst[INST_SZ];
        !           218:     char rlm[REALM_SZ];
        !           219:     unsigned char key[8];
        !           220:     unsigned char vno;
        !           221:     int count;
        !           222: 
        !           223:     printf("Server key file:   %s\n", file);
        !           224:        
        !           225:     if ((stab = open(file, O_RDONLY, 0400)) < 0) {
        !           226:        perror(file);
        !           227:        exit(1);
        !           228:     }
        !           229:     printf("%-15s %-15s %-10s %s\n","Service","Instance","Realm",
        !           230:           "Key Version");
        !           231:     printf("------------------------------------------------------\n");
        !           232: 
        !           233:     /* argh. getst doesn't return error codes, it silently fails */
        !           234:     while (((count = ok_getst(stab, serv, SNAME_SZ)) > 0)
        !           235:           && ((count = ok_getst(stab, inst, INST_SZ)) > 0)
        !           236:           && ((count = ok_getst(stab, rlm, REALM_SZ)) > 0)) {
        !           237:        if (((count = read(stab,(char *) &vno,1)) != 1) ||
        !           238:             ((count = read(stab,(char *) key,8)) != 8)) {
        !           239:            if (count < 0)
        !           240:                perror("reading from key file");
        !           241:            else
        !           242:                fprintf(stderr, "key file truncated\n");
        !           243:            exit(1);
        !           244:        }
        !           245:        printf("%-15s %-15s %-15s %d\n",serv,inst,rlm,vno);
        !           246:     }
        !           247:     if (count < 0)
        !           248:        perror(file);
        !           249:     (void) close(stab);
        !           250: }
        !           251: 
        !           252: /* adapted from getst() in librkb */
        !           253: /*
        !           254:  * ok_getst() takes a file descriptor, a string and a count.  It reads
        !           255:  * from the file until either it has read "count" characters, or until
        !           256:  * it reads a null byte.  When finished, what has been read exists in
        !           257:  * the given string "s".  If "count" characters were actually read, the
        !           258:  * last is changed to a null, so the returned string is always null-
        !           259:  * terminated.  ok_getst() returns the number of characters read, including
        !           260:  * the null terminator.
        !           261:  *
        !           262:  * If there is a read error, it returns -1 (like the read(2) system call)
        !           263:  */
        !           264: 
        !           265: ok_getst(fd, s, n)
        !           266:     int fd;
        !           267:     register char *s;
        !           268: {
        !           269:     register count = n;
        !           270:     int err;
        !           271:     while ((err = read(fd, s, 1)) > 0 && --count)
        !           272:         if (*s++ == '\0')
        !           273:             return (n - count);
        !           274:     if (err < 0)
        !           275:        return(-1);
        !           276:     *s = '\0';
        !           277:     return (n - count);
        !           278: }

unix.superglobalmegacorp.com

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