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