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