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