154148Sbostic /*-
260688Sbostic * Copyright (c) 1992, 1993
360688Sbostic * The Regents of the University of California. All rights reserved.
454148Sbostic *
554148Sbostic * %sccs.include.redist.c%
654148Sbostic */
754148Sbostic
854148Sbostic #ifndef lint
9*66618Spendry static char sccsid[] = "@(#)util.c 8.2 (Berkeley) 04/02/94";
1054148Sbostic #endif /* not lint */
1154148Sbostic
1254148Sbostic #include <sys/param.h>
1354148Sbostic #include <sys/stat.h>
1454148Sbostic #include <sys/wait.h>
1554148Sbostic
1659514Sbostic #include <ctype.h>
1759514Sbostic #include <err.h>
1859514Sbostic #include <errno.h>
1959514Sbostic #include <paths.h>
2054148Sbostic #include <signal.h>
2159514Sbostic #include <stdio.h>
2254148Sbostic #include <stdlib.h>
2354148Sbostic #include <string.h>
2459514Sbostic #include <unistd.h>
2559514Sbostic
2654148Sbostic #include "extern.h"
2754148Sbostic
2854148Sbostic char *
colon(cp)2954148Sbostic colon(cp)
30*66618Spendry char *cp;
3154148Sbostic {
3254571Sandrew if (*cp == ':') /* Leading colon is part of file name. */
3354571Sandrew return (0);
3454571Sandrew
3554148Sbostic for (; *cp; ++cp) {
3654148Sbostic if (*cp == ':')
3754148Sbostic return (cp);
3854148Sbostic if (*cp == '/')
3954148Sbostic return (0);
4054148Sbostic }
4154148Sbostic return (0);
4254148Sbostic }
4354148Sbostic
4454148Sbostic void
verifydir(cp)4554148Sbostic verifydir(cp)
4654148Sbostic char *cp;
4754148Sbostic {
4854148Sbostic struct stat stb;
4954148Sbostic
5054148Sbostic if (!stat(cp, &stb)) {
5154148Sbostic if (S_ISDIR(stb.st_mode))
5254148Sbostic return;
5354148Sbostic errno = ENOTDIR;
5454148Sbostic }
5559514Sbostic run_err("%s: %s", cp, strerror(errno));
5654148Sbostic exit(1);
5754148Sbostic }
5854148Sbostic
5954148Sbostic int
okname(cp0)6054148Sbostic okname(cp0)
6154148Sbostic char *cp0;
6254148Sbostic {
63*66618Spendry int c;
64*66618Spendry char *cp;
6554148Sbostic
6654148Sbostic cp = cp0;
6754148Sbostic do {
6854148Sbostic c = *cp;
6954148Sbostic if (c & 0200)
7054148Sbostic goto bad;
7154148Sbostic if (!isalpha(c) && !isdigit(c) && c != '_' && c != '-')
7254148Sbostic goto bad;
7354148Sbostic } while (*++cp);
7454148Sbostic return (1);
7554148Sbostic
7659514Sbostic bad: warnx("%s: invalid user name", cp0);
7754148Sbostic return (0);
7854148Sbostic }
7954148Sbostic
8054148Sbostic int
susystem(s,userid)8154148Sbostic susystem(s, userid)
8254148Sbostic int userid;
8354148Sbostic char *s;
8454148Sbostic {
85*66618Spendry sig_t istat, qstat;
86*66618Spendry int status, w;
87*66618Spendry pid_t pid;
8854148Sbostic
89*66618Spendry pid = vfork();
90*66618Spendry switch (pid) {
91*66618Spendry case -1:
92*66618Spendry return (127);
93*66618Spendry
94*66618Spendry case 0:
9554148Sbostic (void)setuid(userid);
9654148Sbostic execl(_PATH_BSHELL, "sh", "-c", s, NULL);
9754148Sbostic _exit(127);
9854148Sbostic }
9954148Sbostic istat = signal(SIGINT, SIG_IGN);
10054148Sbostic qstat = signal(SIGQUIT, SIG_IGN);
101*66618Spendry if (waitpid(pid, &status, 0) < 0)
10254148Sbostic status = -1;
10354148Sbostic (void)signal(SIGINT, istat);
10454148Sbostic (void)signal(SIGQUIT, qstat);
10554148Sbostic return (status);
10654148Sbostic }
10754148Sbostic
10854148Sbostic BUF *
allocbuf(bp,fd,blksize)10954148Sbostic allocbuf(bp, fd, blksize)
11054148Sbostic BUF *bp;
11154148Sbostic int fd, blksize;
11254148Sbostic {
11354148Sbostic struct stat stb;
11454148Sbostic size_t size;
11554148Sbostic
11654148Sbostic if (fstat(fd, &stb) < 0) {
11759514Sbostic run_err("fstat: %s", strerror(errno));
11854148Sbostic return (0);
11954148Sbostic }
12054148Sbostic size = roundup(stb.st_blksize, blksize);
12154148Sbostic if (size == 0)
12254148Sbostic size = blksize;
12354148Sbostic if (bp->cnt >= size)
12454148Sbostic return (bp);
12554148Sbostic if ((bp->buf = realloc(bp->buf, size)) == NULL) {
12654148Sbostic bp->cnt = 0;
12759514Sbostic run_err("%s", strerror(errno));
12854148Sbostic return (0);
12954148Sbostic }
13054148Sbostic bp->cnt = size;
13154148Sbostic return (bp);
13254148Sbostic }
13354148Sbostic
13454148Sbostic void
lostconn(signo)13554148Sbostic lostconn(signo)
13654148Sbostic int signo;
13754148Sbostic {
13854148Sbostic if (!iamremote)
13959514Sbostic warnx("lost connection");
14054148Sbostic exit(1);
14154148Sbostic }
142