xref: /minix3/bin/rcp/util.c (revision 93d36fc9d8fb766b78367bb140abfb114ba8c0b5)
1*93d36fc9SDavid van Moolenbroek /*	$NetBSD: util.c,v 1.11 2006/12/15 22:45:34 christos Exp $	*/
2*93d36fc9SDavid van Moolenbroek 
3*93d36fc9SDavid van Moolenbroek /*-
4*93d36fc9SDavid van Moolenbroek  * Copyright (c) 1992, 1993
5*93d36fc9SDavid van Moolenbroek  *	The Regents of the University of California.  All rights reserved.
6*93d36fc9SDavid van Moolenbroek  *
7*93d36fc9SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
8*93d36fc9SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
9*93d36fc9SDavid van Moolenbroek  * are met:
10*93d36fc9SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
11*93d36fc9SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
12*93d36fc9SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
13*93d36fc9SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
14*93d36fc9SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
15*93d36fc9SDavid van Moolenbroek  * 3. Neither the name of the University nor the names of its contributors
16*93d36fc9SDavid van Moolenbroek  *    may be used to endorse or promote products derived from this software
17*93d36fc9SDavid van Moolenbroek  *    without specific prior written permission.
18*93d36fc9SDavid van Moolenbroek  *
19*93d36fc9SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20*93d36fc9SDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*93d36fc9SDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*93d36fc9SDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23*93d36fc9SDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*93d36fc9SDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25*93d36fc9SDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26*93d36fc9SDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27*93d36fc9SDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28*93d36fc9SDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29*93d36fc9SDavid van Moolenbroek  * SUCH DAMAGE.
30*93d36fc9SDavid van Moolenbroek  */
31*93d36fc9SDavid van Moolenbroek 
32*93d36fc9SDavid van Moolenbroek #include <sys/cdefs.h>
33*93d36fc9SDavid van Moolenbroek #ifndef lint
34*93d36fc9SDavid van Moolenbroek #if 0
35*93d36fc9SDavid van Moolenbroek static char sccsid[] = "@(#)util.c	8.2 (Berkeley) 4/2/94";
36*93d36fc9SDavid van Moolenbroek #else
37*93d36fc9SDavid van Moolenbroek __RCSID("$NetBSD: util.c,v 1.11 2006/12/15 22:45:34 christos Exp $");
38*93d36fc9SDavid van Moolenbroek #endif
39*93d36fc9SDavid van Moolenbroek #endif /* not lint */
40*93d36fc9SDavid van Moolenbroek 
41*93d36fc9SDavid van Moolenbroek #include <sys/param.h>
42*93d36fc9SDavid van Moolenbroek #include <sys/stat.h>
43*93d36fc9SDavid van Moolenbroek #include <sys/wait.h>
44*93d36fc9SDavid van Moolenbroek 
45*93d36fc9SDavid van Moolenbroek #include <ctype.h>
46*93d36fc9SDavid van Moolenbroek #include <err.h>
47*93d36fc9SDavid van Moolenbroek #include <errno.h>
48*93d36fc9SDavid van Moolenbroek #include <paths.h>
49*93d36fc9SDavid van Moolenbroek #include <signal.h>
50*93d36fc9SDavid van Moolenbroek #include <stdio.h>
51*93d36fc9SDavid van Moolenbroek #include <stdlib.h>
52*93d36fc9SDavid van Moolenbroek #include <string.h>
53*93d36fc9SDavid van Moolenbroek #include <unistd.h>
54*93d36fc9SDavid van Moolenbroek 
55*93d36fc9SDavid van Moolenbroek #include "extern.h"
56*93d36fc9SDavid van Moolenbroek 
57*93d36fc9SDavid van Moolenbroek char *
colon(char * cp)58*93d36fc9SDavid van Moolenbroek colon(char *cp)
59*93d36fc9SDavid van Moolenbroek {
60*93d36fc9SDavid van Moolenbroek 	if (*cp == ':')		/* Leading colon is part of file name. */
61*93d36fc9SDavid van Moolenbroek 		return (0);
62*93d36fc9SDavid van Moolenbroek 
63*93d36fc9SDavid van Moolenbroek 	for (; *cp; ++cp) {
64*93d36fc9SDavid van Moolenbroek 		if (*cp == ':')
65*93d36fc9SDavid van Moolenbroek 			return (cp);
66*93d36fc9SDavid van Moolenbroek 		if (*cp == '/')
67*93d36fc9SDavid van Moolenbroek 			return (0);
68*93d36fc9SDavid van Moolenbroek 	}
69*93d36fc9SDavid van Moolenbroek 	return (0);
70*93d36fc9SDavid van Moolenbroek }
71*93d36fc9SDavid van Moolenbroek 
72*93d36fc9SDavid van Moolenbroek char *
unbracket(char * cp)73*93d36fc9SDavid van Moolenbroek unbracket(char *cp)
74*93d36fc9SDavid van Moolenbroek {
75*93d36fc9SDavid van Moolenbroek 	char *ep;
76*93d36fc9SDavid van Moolenbroek 
77*93d36fc9SDavid van Moolenbroek 	if (*cp == '[') {
78*93d36fc9SDavid van Moolenbroek 		ep = cp + (strlen(cp) - 1);
79*93d36fc9SDavid van Moolenbroek 		if (*ep == ']') {
80*93d36fc9SDavid van Moolenbroek 			*ep = '\0';
81*93d36fc9SDavid van Moolenbroek 			++cp;
82*93d36fc9SDavid van Moolenbroek 		}
83*93d36fc9SDavid van Moolenbroek 	}
84*93d36fc9SDavid van Moolenbroek 	return (cp);
85*93d36fc9SDavid van Moolenbroek }
86*93d36fc9SDavid van Moolenbroek 
87*93d36fc9SDavid van Moolenbroek void
verifydir(char * cp)88*93d36fc9SDavid van Moolenbroek verifydir(char *cp)
89*93d36fc9SDavid van Moolenbroek {
90*93d36fc9SDavid van Moolenbroek 	struct stat stb;
91*93d36fc9SDavid van Moolenbroek 
92*93d36fc9SDavid van Moolenbroek 	if (!stat(cp, &stb)) {
93*93d36fc9SDavid van Moolenbroek 		if (S_ISDIR(stb.st_mode))
94*93d36fc9SDavid van Moolenbroek 			return;
95*93d36fc9SDavid van Moolenbroek 		errno = ENOTDIR;
96*93d36fc9SDavid van Moolenbroek 	}
97*93d36fc9SDavid van Moolenbroek 	run_err("%s: %s", cp, strerror(errno));
98*93d36fc9SDavid van Moolenbroek 	exit(1);
99*93d36fc9SDavid van Moolenbroek 	/* NOTREACHED */
100*93d36fc9SDavid van Moolenbroek }
101*93d36fc9SDavid van Moolenbroek 
102*93d36fc9SDavid van Moolenbroek int
okname(char * cp0)103*93d36fc9SDavid van Moolenbroek okname(char *cp0)
104*93d36fc9SDavid van Moolenbroek {
105*93d36fc9SDavid van Moolenbroek 	int c;
106*93d36fc9SDavid van Moolenbroek 	char *cp;
107*93d36fc9SDavid van Moolenbroek 
108*93d36fc9SDavid van Moolenbroek 	cp = cp0;
109*93d36fc9SDavid van Moolenbroek 	do {
110*93d36fc9SDavid van Moolenbroek 		c = *cp;
111*93d36fc9SDavid van Moolenbroek 		if (c & 0200)
112*93d36fc9SDavid van Moolenbroek 			goto bad;
113*93d36fc9SDavid van Moolenbroek 		if (!isalpha(c) && !isdigit(c) && c != '_' && c != '-')
114*93d36fc9SDavid van Moolenbroek 			goto bad;
115*93d36fc9SDavid van Moolenbroek 	} while (*++cp);
116*93d36fc9SDavid van Moolenbroek 	return (1);
117*93d36fc9SDavid van Moolenbroek 
118*93d36fc9SDavid van Moolenbroek bad:	warnx("%s: invalid user name", cp0);
119*93d36fc9SDavid van Moolenbroek 	return (0);
120*93d36fc9SDavid van Moolenbroek }
121*93d36fc9SDavid van Moolenbroek 
122*93d36fc9SDavid van Moolenbroek int
susystem(char * s)123*93d36fc9SDavid van Moolenbroek susystem(char *s)
124*93d36fc9SDavid van Moolenbroek {
125*93d36fc9SDavid van Moolenbroek 	sig_t istat, qstat;
126*93d36fc9SDavid van Moolenbroek 	int status;
127*93d36fc9SDavid van Moolenbroek 	pid_t pid;
128*93d36fc9SDavid van Moolenbroek 
129*93d36fc9SDavid van Moolenbroek 	pid = vfork();
130*93d36fc9SDavid van Moolenbroek 	switch (pid) {
131*93d36fc9SDavid van Moolenbroek 	case -1:
132*93d36fc9SDavid van Moolenbroek 		return (127);
133*93d36fc9SDavid van Moolenbroek 
134*93d36fc9SDavid van Moolenbroek 	case 0:
135*93d36fc9SDavid van Moolenbroek 		(void)execl(_PATH_BSHELL, "sh", "-c", s, NULL);
136*93d36fc9SDavid van Moolenbroek 		_exit(127);
137*93d36fc9SDavid van Moolenbroek 		/* NOTREACHED */
138*93d36fc9SDavid van Moolenbroek 	}
139*93d36fc9SDavid van Moolenbroek 	istat = signal(SIGINT, SIG_IGN);
140*93d36fc9SDavid van Moolenbroek 	qstat = signal(SIGQUIT, SIG_IGN);
141*93d36fc9SDavid van Moolenbroek 	if (waitpid(pid, &status, 0) < 0)
142*93d36fc9SDavid van Moolenbroek 		status = -1;
143*93d36fc9SDavid van Moolenbroek 	(void)signal(SIGINT, istat);
144*93d36fc9SDavid van Moolenbroek 	(void)signal(SIGQUIT, qstat);
145*93d36fc9SDavid van Moolenbroek 	return (status);
146*93d36fc9SDavid van Moolenbroek }
147*93d36fc9SDavid van Moolenbroek 
148*93d36fc9SDavid van Moolenbroek BUF *
allocbuf(BUF * bp,int fd,int blksize)149*93d36fc9SDavid van Moolenbroek allocbuf(BUF *bp, int fd, int blksize)
150*93d36fc9SDavid van Moolenbroek {
151*93d36fc9SDavid van Moolenbroek 	struct stat stb;
152*93d36fc9SDavid van Moolenbroek 	size_t size;
153*93d36fc9SDavid van Moolenbroek 	char *nbuf;
154*93d36fc9SDavid van Moolenbroek 
155*93d36fc9SDavid van Moolenbroek 	if (fstat(fd, &stb) < 0) {
156*93d36fc9SDavid van Moolenbroek 		run_err("fstat: %s", strerror(errno));
157*93d36fc9SDavid van Moolenbroek 		return (0);
158*93d36fc9SDavid van Moolenbroek 	}
159*93d36fc9SDavid van Moolenbroek 	size = roundup(stb.st_blksize, blksize);
160*93d36fc9SDavid van Moolenbroek 	if (size == 0)
161*93d36fc9SDavid van Moolenbroek 		size = blksize;
162*93d36fc9SDavid van Moolenbroek 	if (bp->cnt >= size)
163*93d36fc9SDavid van Moolenbroek 		return (bp);
164*93d36fc9SDavid van Moolenbroek 	if ((nbuf = realloc(bp->buf, size)) == NULL) {
165*93d36fc9SDavid van Moolenbroek 		free(bp->buf);
166*93d36fc9SDavid van Moolenbroek 		bp->buf = NULL;
167*93d36fc9SDavid van Moolenbroek 		bp->cnt = 0;
168*93d36fc9SDavid van Moolenbroek 		run_err("%s", strerror(errno));
169*93d36fc9SDavid van Moolenbroek 		return (0);
170*93d36fc9SDavid van Moolenbroek 	}
171*93d36fc9SDavid van Moolenbroek 	bp->buf = nbuf;
172*93d36fc9SDavid van Moolenbroek 	bp->cnt = size;
173*93d36fc9SDavid van Moolenbroek 	return (bp);
174*93d36fc9SDavid van Moolenbroek }
175*93d36fc9SDavid van Moolenbroek 
176*93d36fc9SDavid van Moolenbroek void
177*93d36fc9SDavid van Moolenbroek /*ARGSUSED*/
lostconn(int signo __unused)178*93d36fc9SDavid van Moolenbroek lostconn(int signo __unused)
179*93d36fc9SDavid van Moolenbroek {
180*93d36fc9SDavid van Moolenbroek 	if (!iamremote)
181*93d36fc9SDavid van Moolenbroek 		warnx("lost connection");
182*93d36fc9SDavid van Moolenbroek 	exit(1);
183*93d36fc9SDavid van Moolenbroek 	/* NOTREACHED */
184*93d36fc9SDavid van Moolenbroek }
185