Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/heimdal/appl/rcp/util.c
34870 views
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$";
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
}
185
186