Annotation of coherent/g/usr/lib/uucp/tay104/contrib/tstout.c, revision 1.1

1.1     ! root        1: /* tstout.c
        !             2:    Put together by Ian Lance Taylor <[email protected]>
        !             3: 
        !             4:    This program is used to logout a program run by the tstuu program.
        !             5:    I needed this because on Ultrix 4.0 I can't get the uucp program
        !             6:    to run without invoking it via /bin/login and having it start up
        !             7:    as a shell.  If I don't do it this way, it gets a SIGSEGV trap
        !             8:    for some reason.  Most systems probably don't need to do things
        !             9:    this way.  It will only work on BSD systems anyhow, I suspect.
        !            10: 
        !            11:    The code for this comes from "UNIX Network Programming" by W.
        !            12:    Richard Stevens, Prentice-Hall 1990.  Most of it is from 4.3BSD, as
        !            13:    noted in the comments.
        !            14: 
        !            15:    This program must run suid to root.
        !            16:    */
        !            17: 
        !            18: #include <stdio.h>
        !            19: #include <string.h>
        !            20: 
        !            21: #include <sys/types.h>
        !            22: #include <sys/file.h>
        !            23: #include <sys/time.h>
        !            24: #include <sys/stat.h>
        !            25: #include <utmp.h>
        !            26: 
        !            27: static int logout P((const char *zdev));
        !            28: static void logwtmp P((const char *zdev, const char *zname,
        !            29:                      const char *zhost));
        !            30: 
        !            31: int
        !            32: main (argc, argv)
        !            33:      int argc;
        !            34:      char **argv;
        !            35: {
        !            36:   char *z;
        !            37: 
        !            38:   if (argc != 2
        !            39:       || strncmp (argv[1], "/dev/", sizeof "/dev/" - 1) != 0)
        !            40:     {
        !            41:       fprintf (stderr, "Usage: tstout device\n");
        !            42:       exit (EXIT_FAILURE);
        !            43:     }
        !            44: 
        !            45:   z = argv[1] + 5;
        !            46: 
        !            47:   if (logout (z))
        !            48:     logwtmp (z, "", "");
        !            49: 
        !            50:   chmod (argv[1], 0666);
        !            51:   chown (argv[1], 0, 0);
        !            52: 
        !            53:   *z = 'p';
        !            54:   chmod (argv[1], 0666);
        !            55:   chown (argv[1], 0, 0);
        !            56: 
        !            57:   exit (EXIT_SUCCESS);
        !            58: }
        !            59: 
        !            60: /*
        !            61:  * Copyright (c) 1988 The Regents of the University of California.
        !            62:  * All rights reserved.
        !            63:  *
        !            64:  * Redistribution and use in source and binary forms are permitted
        !            65:  * provided that the above copyright notice and this paragraph are
        !            66:  * duplicated in all such forms and that any documentation,
        !            67:  * advertising materials, and other materials related to such
        !            68:  * distribution and use acknowledge that the software was developed
        !            69:  * by the University of California, Berkeley.  The name of the
        !            70:  * University may not be used to endorse or promote products derived
        !            71:  * from this software without specific prior written permission.
        !            72:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            73:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            74:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            75:  */
        !            76: 
        !            77: #if defined(LIBC_SCCS) && !defined(lint)
        !            78: static char sccsid[] = "@(#)logout.c   5.2 (Berkeley) 2/17/89";
        !            79: #endif /* LIBC_SCCS and not lint */
        !            80: 
        !            81: #define        UTMPFILE        "/etc/utmp"
        !            82: 
        !            83: /* 0 on failure, 1 on success */
        !            84: 
        !            85: static int
        !            86: logout(line)
        !            87:        register const char *line;
        !            88: {
        !            89:        register FILE *fp;
        !            90:        struct utmp ut;
        !            91:        int rval;
        !            92:        time_t time();
        !            93: 
        !            94:        if (!(fp = fopen(UTMPFILE, "r+")))
        !            95:                return(0);
        !            96:        rval = 0;
        !            97:        while (fread((char *)&ut, sizeof(struct utmp), 1, fp) == 1) {
        !            98:                if (!ut.ut_name[0] ||
        !            99:                    strncmp(ut.ut_line, line, sizeof(ut.ut_line)))
        !           100:                        continue;
        !           101:                bzero(ut.ut_name, sizeof(ut.ut_name));
        !           102:                bzero(ut.ut_host, sizeof(ut.ut_host));
        !           103:                (void)time((time_t *)&ut.ut_time);
        !           104:                (void)fseek(fp, (long)-sizeof(struct utmp), L_INCR);
        !           105:                (void)fwrite((char *)&ut, sizeof(struct utmp), 1, fp);
        !           106:                (void)fseek(fp, (long)0, L_INCR);
        !           107:                rval = 1;
        !           108:        }
        !           109:        (void)fclose(fp);
        !           110:        return(rval);
        !           111: }
        !           112: 
        !           113: /*
        !           114:  * Copyright (c) 1988 The Regents of the University of California.
        !           115:  * All rights reserved.
        !           116:  *
        !           117:  * Redistribution and use in source and binary forms are permitted
        !           118:  * provided that the above copyright notice and this paragraph are
        !           119:  * duplicated in all such forms and that any documentation,
        !           120:  * advertising materials, and other materials related to such
        !           121:  * distribution and use acknowledge that the software was developed
        !           122:  * by the University of California, Berkeley.  The name of the
        !           123:  * University may not be used to endorse or promote products derived
        !           124:  * from this software without specific prior written permission.
        !           125:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !           126:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !           127:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !           128:  */
        !           129: 
        !           130: #if defined(LIBC_SCCS) && !defined(lint)
        !           131: static char sccsid[] = "@(#)logwtmp.c  5.2 (Berkeley) 9/20/88";
        !           132: #endif /* LIBC_SCCS and not lint */
        !           133: 
        !           134: #define        WTMPFILE        "/usr/adm/wtmp"
        !           135: 
        !           136: static void
        !           137: logwtmp(line, name, host)
        !           138:      const char *line, *name, *host;
        !           139: {
        !           140:        struct utmp ut;
        !           141:        struct stat buf;
        !           142:        int fd;
        !           143:        time_t time();
        !           144:        char *strncpy();
        !           145: 
        !           146:        if ((fd = open(WTMPFILE, O_WRONLY|O_APPEND, 0)) < 0)
        !           147:                return;
        !           148:        if (!fstat(fd, &buf)) {
        !           149:                (void)strncpy(ut.ut_line, line, sizeof(ut.ut_line));
        !           150:                (void)strncpy(ut.ut_name, name, sizeof(ut.ut_name));
        !           151:                (void)strncpy(ut.ut_host, host, sizeof(ut.ut_host));
        !           152:                (void)time((time_t *)&ut.ut_time);
        !           153:                if (write(fd, (char *)&ut, sizeof(struct utmp)) !=
        !           154:                    sizeof(struct utmp))
        !           155:                        (void)ftruncate(fd, buf.st_size);
        !           156:        }
        !           157:        (void)close(fd);
        !           158: }

unix.superglobalmegacorp.com

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