|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.