xref: /csrg-svn/bin/rcp/util.c (revision 66618)
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