1 /*-
2 * Copyright (c) 1992, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)util.c 8.2 (Berkeley) 04/02/94";
10 #endif /* not lint */
11
12 #include <sys/param.h>
13 #include <sys/stat.h>
14 #include <sys/wait.h>
15
16 #include <ctype.h>
17 #include <err.h>
18 #include <errno.h>
19 #include <paths.h>
20 #include <signal.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <unistd.h>
25
26 #include "extern.h"
27
28 char *
colon(cp)29 colon(cp)
30 char *cp;
31 {
32 if (*cp == ':') /* Leading colon is part of file name. */
33 return (0);
34
35 for (; *cp; ++cp) {
36 if (*cp == ':')
37 return (cp);
38 if (*cp == '/')
39 return (0);
40 }
41 return (0);
42 }
43
44 void
verifydir(cp)45 verifydir(cp)
46 char *cp;
47 {
48 struct stat stb;
49
50 if (!stat(cp, &stb)) {
51 if (S_ISDIR(stb.st_mode))
52 return;
53 errno = ENOTDIR;
54 }
55 run_err("%s: %s", cp, strerror(errno));
56 exit(1);
57 }
58
59 int
okname(cp0)60 okname(cp0)
61 char *cp0;
62 {
63 int c;
64 char *cp;
65
66 cp = cp0;
67 do {
68 c = *cp;
69 if (c & 0200)
70 goto bad;
71 if (!isalpha(c) && !isdigit(c) && c != '_' && c != '-')
72 goto bad;
73 } while (*++cp);
74 return (1);
75
76 bad: warnx("%s: invalid user name", cp0);
77 return (0);
78 }
79
80 int
susystem(s,userid)81 susystem(s, userid)
82 int userid;
83 char *s;
84 {
85 sig_t istat, qstat;
86 int status, w;
87 pid_t pid;
88
89 pid = vfork();
90 switch (pid) {
91 case -1:
92 return (127);
93
94 case 0:
95 (void)setuid(userid);
96 execl(_PATH_BSHELL, "sh", "-c", s, NULL);
97 _exit(127);
98 }
99 istat = signal(SIGINT, SIG_IGN);
100 qstat = signal(SIGQUIT, SIG_IGN);
101 if (waitpid(pid, &status, 0) < 0)
102 status = -1;
103 (void)signal(SIGINT, istat);
104 (void)signal(SIGQUIT, qstat);
105 return (status);
106 }
107
108 BUF *
allocbuf(bp,fd,blksize)109 allocbuf(bp, fd, blksize)
110 BUF *bp;
111 int fd, blksize;
112 {
113 struct stat stb;
114 size_t size;
115
116 if (fstat(fd, &stb) < 0) {
117 run_err("fstat: %s", strerror(errno));
118 return (0);
119 }
120 size = roundup(stb.st_blksize, blksize);
121 if (size == 0)
122 size = blksize;
123 if (bp->cnt >= size)
124 return (bp);
125 if ((bp->buf = realloc(bp->buf, size)) == NULL) {
126 bp->cnt = 0;
127 run_err("%s", strerror(errno));
128 return (0);
129 }
130 bp->cnt = size;
131 return (bp);
132 }
133
134 void
lostconn(signo)135 lostconn(signo)
136 int signo;
137 {
138 if (!iamremote)
139 warnx("lost connection");
140 exit(1);
141 }
142