154148Sbostic /*- 254148Sbostic * Copyright (c) 1992 The Regents of the University of California. 354148Sbostic * All rights reserved. 454148Sbostic * 554148Sbostic * %sccs.include.redist.c% 654148Sbostic */ 754148Sbostic 854148Sbostic #ifndef lint 9*59514Sbostic static char sccsid[] = "@(#)util.c 5.3 (Berkeley) 04/29/93"; 1054148Sbostic #endif /* not lint */ 1154148Sbostic 1254148Sbostic #include <sys/param.h> 1354148Sbostic #include <sys/stat.h> 1454148Sbostic #include <sys/wait.h> 1554148Sbostic 16*59514Sbostic #include <ctype.h> 17*59514Sbostic #include <err.h> 18*59514Sbostic #include <errno.h> 19*59514Sbostic #include <paths.h> 2054148Sbostic #include <signal.h> 21*59514Sbostic #include <stdio.h> 2254148Sbostic #include <stdlib.h> 2354148Sbostic #include <string.h> 24*59514Sbostic #include <unistd.h> 25*59514Sbostic 2654148Sbostic #include "extern.h" 2754148Sbostic 2854148Sbostic char * 2954148Sbostic colon(cp) 3054148Sbostic register 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 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 } 55*59514Sbostic run_err("%s: %s", cp, strerror(errno)); 5654148Sbostic exit(1); 5754148Sbostic } 5854148Sbostic 5954148Sbostic int 6054148Sbostic okname(cp0) 6154148Sbostic char *cp0; 6254148Sbostic { 6354148Sbostic register int c; 6454148Sbostic register 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 76*59514Sbostic bad: warnx("%s: invalid user name", cp0); 7754148Sbostic return (0); 7854148Sbostic } 7954148Sbostic 8054148Sbostic int 8154148Sbostic susystem(s, userid) 8254148Sbostic int userid; 8354148Sbostic char *s; 8454148Sbostic { 8554148Sbostic register sig_t istat, qstat; 8654148Sbostic int status, pid, w; 8754148Sbostic 8854148Sbostic if ((pid = vfork()) == 0) { 8954148Sbostic (void)setuid(userid); 9054148Sbostic execl(_PATH_BSHELL, "sh", "-c", s, NULL); 9154148Sbostic _exit(127); 9254148Sbostic } 9354148Sbostic istat = signal(SIGINT, SIG_IGN); 9454148Sbostic qstat = signal(SIGQUIT, SIG_IGN); 9554148Sbostic while ((w = wait(&status)) != pid && w != -1) 9654148Sbostic ; 9754148Sbostic if (w == -1) 9854148Sbostic status = -1; 9954148Sbostic (void)signal(SIGINT, istat); 10054148Sbostic (void)signal(SIGQUIT, qstat); 10154148Sbostic return (status); 10254148Sbostic } 10354148Sbostic 10454148Sbostic BUF * 10554148Sbostic allocbuf(bp, fd, blksize) 10654148Sbostic BUF *bp; 10754148Sbostic int fd, blksize; 10854148Sbostic { 10954148Sbostic struct stat stb; 11054148Sbostic size_t size; 11154148Sbostic 11254148Sbostic if (fstat(fd, &stb) < 0) { 113*59514Sbostic run_err("fstat: %s", strerror(errno)); 11454148Sbostic return (0); 11554148Sbostic } 11654148Sbostic size = roundup(stb.st_blksize, blksize); 11754148Sbostic if (size == 0) 11854148Sbostic size = blksize; 11954148Sbostic if (bp->cnt >= size) 12054148Sbostic return (bp); 12154148Sbostic if ((bp->buf = realloc(bp->buf, size)) == NULL) { 12254148Sbostic bp->cnt = 0; 123*59514Sbostic run_err("%s", strerror(errno)); 12454148Sbostic return (0); 12554148Sbostic } 12654148Sbostic bp->cnt = size; 12754148Sbostic return (bp); 12854148Sbostic } 12954148Sbostic 13054148Sbostic void 13154148Sbostic lostconn(signo) 13254148Sbostic int signo; 13354148Sbostic { 13454148Sbostic if (!iamremote) 135*59514Sbostic warnx("lost connection"); 13654148Sbostic exit(1); 13754148Sbostic } 138