mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-10-28 11:25:21 +01:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fcc0587080 |
No files matched your search
-34
@@ -1,34 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1995
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
char *getpwd __P((void));
|
||||
@@ -1,113 +0,0 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static char rcsid[] = "$Id: ns_udp.c,v 8.3 1996/08/27 08:33:23 vixie Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/file.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/nameser.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <syslog.h>
|
||||
#include <netdb.h>
|
||||
#include <nlist.h>
|
||||
#include <resolv.h>
|
||||
|
||||
#include "named.h"
|
||||
|
||||
void
|
||||
ns_udp() {
|
||||
#if defined(CHECK_UDP_SUM) || defined(FIX_UDP_SUM)
|
||||
struct nlist nl[2];
|
||||
int fd;
|
||||
int sum;
|
||||
u_long res, offset;
|
||||
|
||||
nl[0].n_name = UDPSUM;
|
||||
nl[1].n_name = 0;
|
||||
|
||||
if (nlist(KSYMS, nl)) {
|
||||
dprintf(1, (ddt, "ns_udp: nlist (%s,%s) failed\n",
|
||||
KSYMS, UDPSUM));
|
||||
return;
|
||||
}
|
||||
|
||||
dprintf(1, (ddt, "ns_udp: %s %d %lu (%ld)\n",
|
||||
nl[0].n_name, nl[0].n_type, nl[0].n_value,
|
||||
nl[0].n_value));
|
||||
|
||||
if (!nl[0].n_type)
|
||||
return;
|
||||
|
||||
if ((fd = open(KMEM, O_RDWR, 0)) < 0) {
|
||||
dprintf(1, (ddt, "ns_udp: open %s failed\n", KMEM));
|
||||
return;
|
||||
}
|
||||
|
||||
offset = nl[0].n_value;
|
||||
#ifdef KMAP
|
||||
offset &= ((~0UL)>>1);
|
||||
#endif
|
||||
|
||||
res = lseek(fd, offset, SEEK_SET);
|
||||
if (res != offset) {
|
||||
dprintf(1, (ddt, "ns_udp: lseek %ul failed %lu %d\n",
|
||||
offset, res, errno));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (read(fd, &sum, sizeof(sum)) != sizeof(sum)) {
|
||||
dprintf(1, (ddt, "ns_udp: read failed\n"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
dprintf(1, (ddt, "ns_udp: %d\n", sum));
|
||||
if (sum == 0) {
|
||||
#ifdef FIX_UDP_SUM
|
||||
sum = 1;
|
||||
lseek(fd, offset, SEEK_SET);
|
||||
if (res != offset) {
|
||||
dprintf(1, (ddt, "ns_udp: lseek %ul failed %lu %d\n",
|
||||
offset, res, errno));
|
||||
goto cleanup;
|
||||
}
|
||||
if (write(fd, &sum, sizeof(sum)) != sizeof(sum)) {
|
||||
dprintf(1, (ddt, "ns_udp: write failed\n"));
|
||||
goto cleanup;
|
||||
}
|
||||
dprintf(1, (ddt, "ns_udp: set to 1\n"));
|
||||
syslog(LOG_WARNING, "ns_udp: check sums turned on");
|
||||
#else
|
||||
dprintf(1, (ddt, "ns_udp: Exiting\n"));
|
||||
syslog(LOG_WARNING, "ns_udp: checksums NOT turned on: Exiting");
|
||||
exit(1);
|
||||
#endif
|
||||
}
|
||||
cleanup:
|
||||
close(fd);
|
||||
#endif
|
||||
}
|
||||
@@ -1,321 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 1995 by International Business Machines, Inc.
|
||||
*
|
||||
* International Business Machines, Inc. (hereinafter called IBM) grants
|
||||
* permission under its copyrights to use, copy, modify, and distribute this
|
||||
* Software with or without fee, provided that the above copyright notice and
|
||||
* all paragraphs of this notice appear in all copies, and that the name of IBM
|
||||
* not be used in connection with the marketing of any product incorporating
|
||||
* the Software or modifications thereof, without specific, written prior
|
||||
* permission.
|
||||
*
|
||||
* To the extent it has a right to do so, IBM grants an immunity from suit
|
||||
* under its patents, if any, for the use, sale or manufacture of products to
|
||||
* the extent that such products are used for performing Domain Name System
|
||||
* dynamic updates in TCP/IP networks by means of the Software. No immunity is
|
||||
* granted for any product per se or for any other function of any product.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
* PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
|
||||
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
|
||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
|
||||
* IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <arpa/nameser.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <resolv.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#if defined(BSD) && (BSD >= 199103) && defined(AF_INET6)
|
||||
# include <stdlib.h>
|
||||
# include <string.h>
|
||||
#else
|
||||
# include "../conf/portability.h"
|
||||
#endif
|
||||
|
||||
#define Assert(Cond) if (!(Cond)) abort()
|
||||
|
||||
static const char Base64[] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
static const char Pad64 = '=';
|
||||
|
||||
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
|
||||
The following encoding technique is taken from RFC 1521 by Borenstein
|
||||
and Freed. It is reproduced here in a slightly edited form for
|
||||
convenience.
|
||||
|
||||
A 65-character subset of US-ASCII is used, enabling 6 bits to be
|
||||
represented per printable character. (The extra 65th character, "=",
|
||||
is used to signify a special processing function.)
|
||||
|
||||
The encoding process represents 24-bit groups of input bits as output
|
||||
strings of 4 encoded characters. Proceeding from left to right, a
|
||||
24-bit input group is formed by concatenating 3 8-bit input groups.
|
||||
These 24 bits are then treated as 4 concatenated 6-bit groups, each
|
||||
of which is translated into a single digit in the base64 alphabet.
|
||||
|
||||
Each 6-bit group is used as an index into an array of 64 printable
|
||||
characters. The character referenced by the index is placed in the
|
||||
output string.
|
||||
|
||||
Table 1: The Base64 Alphabet
|
||||
|
||||
Value Encoding Value Encoding Value Encoding Value Encoding
|
||||
0 A 17 R 34 i 51 z
|
||||
1 B 18 S 35 j 52 0
|
||||
2 C 19 T 36 k 53 1
|
||||
3 D 20 U 37 l 54 2
|
||||
4 E 21 V 38 m 55 3
|
||||
5 F 22 W 39 n 56 4
|
||||
6 G 23 X 40 o 57 5
|
||||
7 H 24 Y 41 p 58 6
|
||||
8 I 25 Z 42 q 59 7
|
||||
9 J 26 a 43 r 60 8
|
||||
10 K 27 b 44 s 61 9
|
||||
11 L 28 c 45 t 62 +
|
||||
12 M 29 d 46 u 63 /
|
||||
13 N 30 e 47 v
|
||||
14 O 31 f 48 w (pad) =
|
||||
15 P 32 g 49 x
|
||||
16 Q 33 h 50 y
|
||||
|
||||
Special processing is performed if fewer than 24 bits are available
|
||||
at the end of the data being encoded. A full encoding quantum is
|
||||
always completed at the end of a quantity. When fewer than 24 input
|
||||
bits are available in an input group, zero bits are added (on the
|
||||
right) to form an integral number of 6-bit groups. Padding at the
|
||||
end of the data is performed using the '=' character.
|
||||
|
||||
Since all base64 input is an integral number of octets, only the
|
||||
-------------------------------------------------
|
||||
following cases can arise:
|
||||
|
||||
(1) the final quantum of encoding input is an integral
|
||||
multiple of 24 bits; here, the final unit of encoded
|
||||
output will be an integral multiple of 4 characters
|
||||
with no "=" padding,
|
||||
(2) the final quantum of encoding input is exactly 8 bits;
|
||||
here, the final unit of encoded output will be two
|
||||
characters followed by two "=" padding characters, or
|
||||
(3) the final quantum of encoding input is exactly 16 bits;
|
||||
here, the final unit of encoded output will be three
|
||||
characters followed by one "=" padding character.
|
||||
*/
|
||||
|
||||
int
|
||||
b64_ntop(src, srclength, target, targsize)
|
||||
u_char const *src;
|
||||
size_t srclength;
|
||||
char *target;
|
||||
size_t targsize;
|
||||
{
|
||||
size_t datalength = 0;
|
||||
u_char input[3];
|
||||
u_char output[4];
|
||||
int i;
|
||||
|
||||
while (2 < srclength) {
|
||||
input[0] = *src++;
|
||||
input[1] = *src++;
|
||||
input[2] = *src++;
|
||||
srclength -= 3;
|
||||
|
||||
output[0] = input[0] >> 2;
|
||||
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
|
||||
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
|
||||
output[3] = input[2] & 0x3f;
|
||||
Assert(output[0] < 64);
|
||||
Assert(output[1] < 64);
|
||||
Assert(output[2] < 64);
|
||||
Assert(output[3] < 64);
|
||||
|
||||
if (datalength + 4 > targsize)
|
||||
return (-1);
|
||||
target[datalength++] = Base64[output[0]];
|
||||
target[datalength++] = Base64[output[1]];
|
||||
target[datalength++] = Base64[output[2]];
|
||||
target[datalength++] = Base64[output[3]];
|
||||
}
|
||||
|
||||
/* Now we worry about padding. */
|
||||
if (0 != srclength) {
|
||||
/* Get what's left. */
|
||||
input[0] = input[1] = input[2] = '\0';
|
||||
for (i = 0; i < srclength; i++)
|
||||
input[i] = *src++;
|
||||
|
||||
output[0] = input[0] >> 2;
|
||||
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
|
||||
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
|
||||
Assert(output[0] < 64);
|
||||
Assert(output[1] < 64);
|
||||
Assert(output[2] < 64);
|
||||
|
||||
if (datalength + 4 > targsize)
|
||||
return (-1);
|
||||
target[datalength++] = Base64[output[0]];
|
||||
target[datalength++] = Base64[output[1]];
|
||||
if (srclength == 1)
|
||||
target[datalength++] = Pad64;
|
||||
else
|
||||
target[datalength++] = Base64[output[2]];
|
||||
target[datalength++] = Pad64;
|
||||
}
|
||||
if (datalength >= targsize)
|
||||
return (-1);
|
||||
target[datalength] = '\0'; /* Returned value doesn't count \0. */
|
||||
return (datalength);
|
||||
}
|
||||
|
||||
/* skips all whitespace anywhere.
|
||||
converts characters, four at a time, starting at (or after)
|
||||
src from base - 64 numbers into three 8 bit bytes in the target area.
|
||||
it returns the number of data bytes stored at the target, or -1 on error.
|
||||
*/
|
||||
|
||||
int
|
||||
b64_pton(src, target, targsize)
|
||||
char const *src;
|
||||
u_char *target;
|
||||
size_t targsize;
|
||||
{
|
||||
int tarindex, state, ch;
|
||||
char *pos;
|
||||
|
||||
state = 0;
|
||||
tarindex = 0;
|
||||
|
||||
while ((ch = *src++) != '\0') {
|
||||
if (isspace(ch)) /* Skip whitespace anywhere. */
|
||||
continue;
|
||||
|
||||
if (ch == Pad64)
|
||||
break;
|
||||
|
||||
pos = strchr(Base64, ch);
|
||||
if (pos == 0) /* A non-base64 character. */
|
||||
return (-1);
|
||||
|
||||
switch (state) {
|
||||
case 0:
|
||||
if (target) {
|
||||
if (tarindex >= targsize)
|
||||
return (-1);
|
||||
target[tarindex] = (pos - Base64) << 2;
|
||||
}
|
||||
state = 1;
|
||||
break;
|
||||
case 1:
|
||||
if (target) {
|
||||
if (tarindex + 1 >= targsize)
|
||||
return (-1);
|
||||
target[tarindex] |= (pos - Base64) >> 4;
|
||||
target[tarindex+1] = ((pos - Base64) & 0x0f)
|
||||
<< 4 ;
|
||||
}
|
||||
tarindex++;
|
||||
state = 2;
|
||||
break;
|
||||
case 2:
|
||||
if (target) {
|
||||
if (tarindex + 1 >= targsize)
|
||||
return (-1);
|
||||
target[tarindex] |= (pos - Base64) >> 2;
|
||||
target[tarindex+1] = ((pos - Base64) & 0x03)
|
||||
<< 6;
|
||||
}
|
||||
tarindex++;
|
||||
state = 3;
|
||||
break;
|
||||
case 3:
|
||||
if (target) {
|
||||
if (tarindex >= targsize)
|
||||
return (-1);
|
||||
target[tarindex] |= (pos - Base64);
|
||||
}
|
||||
tarindex++;
|
||||
state = 0;
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* We are done decoding Base-64 chars. Let's see if we ended
|
||||
* on a byte boundary, and/or with erroneous trailing characters.
|
||||
*/
|
||||
|
||||
if (ch == Pad64) { /* We got a pad char. */
|
||||
ch = *src++; /* Skip it, get next. */
|
||||
switch (state) {
|
||||
case 0: /* Invalid = in first position */
|
||||
case 1: /* Invalid = in second position */
|
||||
return (-1);
|
||||
|
||||
case 2: /* Valid, means one byte of info */
|
||||
/* Skip any number of spaces. */
|
||||
for (NULL; ch != '\0'; ch = *src++)
|
||||
if (!isspace(ch))
|
||||
break;
|
||||
/* Make sure there is another trailing = sign. */
|
||||
if (ch != Pad64)
|
||||
return (-1);
|
||||
ch = *src++; /* Skip the = */
|
||||
/* Fall through to "single trailing =" case. */
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case 3: /* Valid, means two bytes of info */
|
||||
/*
|
||||
* We know this char is an =. Is there anything but
|
||||
* whitespace after it?
|
||||
*/
|
||||
for (NULL; ch != '\0'; ch = *src++)
|
||||
if (!isspace(ch))
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Now make sure for cases 2 and 3 that the "extra"
|
||||
* bits that slopped past the last full byte were
|
||||
* zeros. If we don't check them, they become a
|
||||
* subliminal channel.
|
||||
*/
|
||||
if (target && target[tarindex] != 0)
|
||||
return (-1);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* We ended by seeing the end of the string. Make sure we
|
||||
* have no partial bytes lying around.
|
||||
*/
|
||||
if (state != 0)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (tarindex);
|
||||
}
|
||||
@@ -1,139 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char rcsid[] = "$Id: inet_net_ntop.c,v 8.2 1996/08/08 06:54:44 vixie Exp $";
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef SPRINTF_CHAR
|
||||
# define SPRINTF(x) strlen(sprintf/**/x)
|
||||
#else
|
||||
# define SPRINTF(x) ((size_t)sprintf x)
|
||||
#endif
|
||||
|
||||
static char * inet_net_ntop_ipv4 __P((const u_char *src, int bits,
|
||||
char *dst, size_t size));
|
||||
|
||||
/*
|
||||
* char *
|
||||
* inet_net_ntop(af, src, bits, dst, size)
|
||||
* convert network number from network to presentation format.
|
||||
* generates CIDR style result always.
|
||||
* return:
|
||||
* pointer to dst, or NULL if an error occurred (check errno).
|
||||
* author:
|
||||
* Paul Vixie (ISC), July 1996
|
||||
*/
|
||||
char *
|
||||
inet_net_ntop(af, src, bits, dst, size)
|
||||
int af;
|
||||
const void *src;
|
||||
int bits;
|
||||
char *dst;
|
||||
size_t size;
|
||||
{
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
return (inet_net_ntop_ipv4(src, bits, dst, size));
|
||||
default:
|
||||
errno = EAFNOSUPPORT;
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* static char *
|
||||
* inet_net_ntop_ipv4(src, bits, dst, size)
|
||||
* convert IPv4 network number from network to presentation format.
|
||||
* generates CIDR style result always.
|
||||
* return:
|
||||
* pointer to dst, or NULL if an error occurred (check errno).
|
||||
* note:
|
||||
* network byte order assumed. this means 192.5.5.240/28 has
|
||||
* 0x11110000 in its fourth octet.
|
||||
* author:
|
||||
* Paul Vixie (ISC), July 1996
|
||||
*/
|
||||
static char *
|
||||
inet_net_ntop_ipv4(src, bits, dst, size)
|
||||
const u_char *src;
|
||||
int bits;
|
||||
char *dst;
|
||||
size_t size;
|
||||
{
|
||||
char *odst = dst;
|
||||
char *t;
|
||||
u_int m;
|
||||
int b;
|
||||
|
||||
if (bits < 0 || bits > 32) {
|
||||
errno = EINVAL;
|
||||
return (NULL);
|
||||
}
|
||||
if (bits == 0) {
|
||||
if (size < sizeof "0")
|
||||
goto emsgsize;
|
||||
*dst++ = '0';
|
||||
*dst = '\0';
|
||||
}
|
||||
|
||||
/* Format whole octets. */
|
||||
for (b = bits / 8; b > 0; b--) {
|
||||
if (size < sizeof "255.")
|
||||
goto emsgsize;
|
||||
t = dst;
|
||||
dst += SPRINTF((dst, "%u", *src++));
|
||||
if (b > 1) {
|
||||
*dst++ = '.';
|
||||
*dst = '\0';
|
||||
}
|
||||
size -= (size_t)(dst - t);
|
||||
}
|
||||
|
||||
/* Format partial octet. */
|
||||
b = bits % 8;
|
||||
if (b > 0) {
|
||||
if (size < sizeof ".255")
|
||||
goto emsgsize;
|
||||
t = dst;
|
||||
if (dst != odst)
|
||||
*dst++ = '.';
|
||||
m = ((1 << b) - 1) << (8 - b);
|
||||
dst += SPRINTF((dst, "%u", *src & m));
|
||||
size -= (size_t)(dst - t);
|
||||
}
|
||||
|
||||
/* Format CIDR /width. */
|
||||
if (size < sizeof "/32")
|
||||
goto emsgsize;
|
||||
dst += SPRINTF((dst, "/%u", bits));
|
||||
return (odst);
|
||||
|
||||
emsgsize:
|
||||
errno = EMSGSIZE;
|
||||
return (NULL);
|
||||
}
|
||||
@@ -1,207 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char rcsid[] = "$Id: inet_net_pton.c,v 8.3 1996/11/11 06:36:52 vixie Exp $";
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef SPRINTF_CHAR
|
||||
# define SPRINTF(x) strlen(sprintf/**/x)
|
||||
#else
|
||||
# define SPRINTF(x) ((size_t)sprintf x)
|
||||
#endif
|
||||
|
||||
static int inet_net_pton_ipv4 __P((const char *src, u_char *dst,
|
||||
size_t size));
|
||||
|
||||
/*
|
||||
* static int
|
||||
* inet_net_pton(af, src, dst, size)
|
||||
* convert network number from presentation to network format.
|
||||
* accepts hex octets, hex strings, decimal octets, and /CIDR.
|
||||
* "size" is in bytes and describes "dst".
|
||||
* return:
|
||||
* number of bits, either imputed classfully or specified with /CIDR,
|
||||
* or -1 if some failure occurred (check errno). ENOENT means it was
|
||||
* not a valid network specification.
|
||||
* author:
|
||||
* Paul Vixie (ISC), June 1996
|
||||
*/
|
||||
int
|
||||
inet_net_pton(af, src, dst, size)
|
||||
int af;
|
||||
const char *src;
|
||||
void *dst;
|
||||
size_t size;
|
||||
{
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
return (inet_net_pton_ipv4(src, dst, size));
|
||||
default:
|
||||
errno = EAFNOSUPPORT;
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* static int
|
||||
* inet_net_pton_ipv4(src, dst, size)
|
||||
* convert IPv4 network number from presentation to network format.
|
||||
* accepts hex octets, hex strings, decimal octets, and /CIDR.
|
||||
* "size" is in bytes and describes "dst".
|
||||
* return:
|
||||
* number of bits, either imputed classfully or specified with /CIDR,
|
||||
* or -1 if some failure occurred (check errno). ENOENT means it was
|
||||
* not an IPv4 network specification.
|
||||
* note:
|
||||
* network byte order assumed. this means 192.5.5.240/28 has
|
||||
* 0x11110000 in its fourth octet.
|
||||
* author:
|
||||
* Paul Vixie (ISC), June 1996
|
||||
*/
|
||||
static int
|
||||
inet_net_pton_ipv4(src, dst, size)
|
||||
const char *src;
|
||||
u_char *dst;
|
||||
size_t size;
|
||||
{
|
||||
static const char
|
||||
xdigits[] = "0123456789abcdef",
|
||||
digits[] = "0123456789";
|
||||
int n, ch, tmp, dirty, bits;
|
||||
const u_char *odst = dst;
|
||||
|
||||
ch = *src++;
|
||||
if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
|
||||
&& isascii(src[1]) && isxdigit(src[1])) {
|
||||
/* Hexadecimal: Eat nybble string. */
|
||||
if (size <= 0)
|
||||
goto emsgsize;
|
||||
*dst = 0, dirty = 0;
|
||||
src++; /* skip x or X. */
|
||||
while ((ch = *src++) != '\0' &&
|
||||
isascii(ch) && isxdigit(ch)) {
|
||||
if (isupper(ch))
|
||||
ch = tolower(ch);
|
||||
n = strchr(xdigits, ch) - xdigits;
|
||||
assert(n >= 0 && n <= 15);
|
||||
*dst |= n;
|
||||
if (!dirty++)
|
||||
*dst <<= 4;
|
||||
else if (size-- > 0)
|
||||
*++dst = 0, dirty = 0;
|
||||
else
|
||||
goto emsgsize;
|
||||
}
|
||||
if (dirty)
|
||||
size--;
|
||||
} else if (isascii(ch) && isdigit(ch)) {
|
||||
/* Decimal: eat dotted digit string. */
|
||||
for (;;) {
|
||||
tmp = 0;
|
||||
do {
|
||||
n = strchr(digits, ch) - digits;
|
||||
assert(n >= 0 && n <= 9);
|
||||
tmp *= 10;
|
||||
tmp += n;
|
||||
if (tmp > 255)
|
||||
goto enoent;
|
||||
} while ((ch = *src++) != '\0' &&
|
||||
isascii(ch) && isdigit(ch));
|
||||
if (size-- <= 0)
|
||||
goto emsgsize;
|
||||
*dst++ = (u_char) tmp;
|
||||
if (ch == '\0' || ch == '/')
|
||||
break;
|
||||
if (ch != '.')
|
||||
goto enoent;
|
||||
ch = *src++;
|
||||
if (!isascii(ch) || !isdigit(ch))
|
||||
goto enoent;
|
||||
}
|
||||
} else
|
||||
goto enoent;
|
||||
|
||||
bits = -1;
|
||||
if (ch == '/' && isascii(src[0]) && isdigit(src[0]) && dst > odst) {
|
||||
/* CIDR width specifier. Nothing can follow it. */
|
||||
ch = *src++; /* Skip over the /. */
|
||||
bits = 0;
|
||||
do {
|
||||
n = strchr(digits, ch) - digits;
|
||||
assert(n >= 0 && n <= 9);
|
||||
bits *= 10;
|
||||
bits += n;
|
||||
} while ((ch = *src++) != '\0' &&
|
||||
isascii(ch) && isdigit(ch));
|
||||
if (ch != '\0')
|
||||
goto enoent;
|
||||
if (bits > 32)
|
||||
goto emsgsize;
|
||||
}
|
||||
|
||||
/* Firey death and destruction unless we prefetched EOS. */
|
||||
if (ch != '\0')
|
||||
goto enoent;
|
||||
|
||||
/* If nothing was written to the destination, we found no address. */
|
||||
if (dst == odst)
|
||||
goto enoent;
|
||||
/* If no CIDR spec was given, infer width from net class. */
|
||||
if (bits == -1) {
|
||||
if (*odst >= 240) /* Class E */
|
||||
bits = 32;
|
||||
else if (*odst >= 224) /* Class D */
|
||||
bits = 4;
|
||||
else if (*odst >= 192) /* Class C */
|
||||
bits = 24;
|
||||
else if (*odst >= 128) /* Class B */
|
||||
bits = 16;
|
||||
else /* Class A */
|
||||
bits = 8;
|
||||
/* If imputed mask is narrower than specified octets, widen. */
|
||||
if (bits >= 8 && bits < ((dst - odst) * 8))
|
||||
bits = (dst - odst) * 8;
|
||||
}
|
||||
/* Extend network to cover the actual mask. */
|
||||
while (bits > ((dst - odst) * 8)) {
|
||||
if (size-- <= 0)
|
||||
goto emsgsize;
|
||||
*dst++ = '\0';
|
||||
}
|
||||
return (bits);
|
||||
|
||||
enoent:
|
||||
errno = ENOENT;
|
||||
return (-1);
|
||||
|
||||
emsgsize:
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char rcsid[] = "$Id: inet_neta.c,v 8.2 1996/08/08 06:54:44 vixie Exp $";
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef SPRINTF_CHAR
|
||||
# define SPRINTF(x) strlen(sprintf/**/x)
|
||||
#else
|
||||
# define SPRINTF(x) ((size_t)sprintf x)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* char *
|
||||
* inet_neta(src, dst, size)
|
||||
* format a u_long network number into presentation format.
|
||||
* return:
|
||||
* pointer to dst, or NULL if an error occurred (check errno).
|
||||
* note:
|
||||
* format of ``src'' is as for inet_network().
|
||||
* author:
|
||||
* Paul Vixie (ISC), July 1996
|
||||
*/
|
||||
char *
|
||||
inet_neta(src, dst, size)
|
||||
u_long src;
|
||||
char *dst;
|
||||
size_t size;
|
||||
{
|
||||
char *odst = dst;
|
||||
char *tp;
|
||||
|
||||
while (src & 0xffffffff) {
|
||||
u_char b = (src & 0xff000000) >> 24;
|
||||
|
||||
src <<= 8;
|
||||
if (b) {
|
||||
if (size < sizeof "255.")
|
||||
goto emsgsize;
|
||||
tp = dst;
|
||||
dst += SPRINTF((dst, "%u", b));
|
||||
if (src != 0L) {
|
||||
*dst++ = '.';
|
||||
*dst = '\0';
|
||||
}
|
||||
size -= (size_t)(dst - tp);
|
||||
}
|
||||
}
|
||||
if (dst == odst) {
|
||||
if (size < sizeof "0.0.0.0")
|
||||
goto emsgsize;
|
||||
strcpy(dst, "0.0.0.0");
|
||||
}
|
||||
return (odst);
|
||||
|
||||
emsgsize:
|
||||
errno = EMSGSIZE;
|
||||
return (NULL);
|
||||
}
|
||||
@@ -1,339 +0,0 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
675 Mass Ave, Cambridge, MA 02139, USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Appendix: How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) 19yy <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
@@ -1,481 +0,0 @@
|
||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
675 Mass Ave, Cambridge, MA 02139, USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the library GPL. It is
|
||||
numbered 2 because it goes with version 2 of the ordinary GPL.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Library General Public License, applies to some
|
||||
specially designated Free Software Foundation software, and to any
|
||||
other libraries whose authors decide to use it. You can use it for
|
||||
your libraries, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if
|
||||
you distribute copies of the library, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link a program with the library, you must provide
|
||||
complete object files to the recipients so that they can relink them
|
||||
with the library, after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
Our method of protecting your rights has two steps: (1) copyright
|
||||
the library, and (2) offer you this license which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
Also, for each distributor's protection, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
library. If the library is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original
|
||||
version, so that any problems introduced by others will not reflect on
|
||||
the original authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that companies distributing free
|
||||
software will individually obtain patent licenses, thus in effect
|
||||
transforming the program into proprietary software. To prevent this,
|
||||
we have made it clear that any patent must be licensed for everyone's
|
||||
free use or not licensed at all.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the ordinary
|
||||
GNU General Public License, which was designed for utility programs. This
|
||||
license, the GNU Library General Public License, applies to certain
|
||||
designated libraries. This license is quite different from the ordinary
|
||||
one; be sure to read it in full, and don't assume that anything in it is
|
||||
the same as in the ordinary license.
|
||||
|
||||
The reason we have a separate public license for some libraries is that
|
||||
they blur the distinction we usually make between modifying or adding to a
|
||||
program and simply using it. Linking a program with a library, without
|
||||
changing the library, is in some sense simply using the library, and is
|
||||
analogous to running a utility program or application program. However, in
|
||||
a textual and legal sense, the linked executable is a combined work, a
|
||||
derivative of the original library, and the ordinary General Public License
|
||||
treats it as such.
|
||||
|
||||
Because of this blurred distinction, using the ordinary General
|
||||
Public License for libraries did not effectively promote software
|
||||
sharing, because most developers did not use the libraries. We
|
||||
concluded that weaker conditions might promote sharing better.
|
||||
|
||||
However, unrestricted linking of non-free programs would deprive the
|
||||
users of those programs of all benefit from the free status of the
|
||||
libraries themselves. This Library General Public License is intended to
|
||||
permit developers of non-free programs to use free libraries, while
|
||||
preserving your freedom as a user of such programs to change the free
|
||||
libraries that are incorporated in them. (We have not seen how to achieve
|
||||
this as regards changes in header files, but we have achieved it as regards
|
||||
changes in the actual functions of the Library.) The hope is that this
|
||||
will lead to faster development of free libraries.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, while the latter only
|
||||
works together with the library.
|
||||
|
||||
Note that it is possible for a library to be covered by the ordinary
|
||||
General Public License rather than by this special one.
|
||||
|
||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library which
|
||||
contains a notice placed by the copyright holder or other authorized
|
||||
party saying it may be distributed under the terms of this Library
|
||||
General Public License (also called "this License"). Each licensee is
|
||||
addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also compile or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
c) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
d) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the source code distributed need not include anything that is normally
|
||||
distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Library General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Appendix: How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this library; if not, write to the Free
|
||||
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
@@ -1,968 +0,0 @@
|
||||
Tue Jan 16 19:03:05 1996 John Oleynick ([email protected])
|
||||
* util.c: An I/O error reading a file would cause the last byte
|
||||
of the next file to be corrupted in the archive. Thanks to a
|
||||
buggy NT NFS server for pointing out this problem.
|
||||
* Version 2.4.2 released.
|
||||
|
||||
Tue Jan 9 23:19:37 1996 John Oleynick ([email protected])
|
||||
* copyout.c: missed 1 part of last bug fix.
|
||||
|
||||
Mon Jan 8 16:49:01 1996 John Oleynick ([email protected])
|
||||
* copyout.c, copypass.c: Use result of readlink() as length
|
||||
of link name instead of size from lstat(). On some OS's lstat()
|
||||
doesn't return the true length in size. Bug reported by
|
||||
Robert Joop ([email protected]).
|
||||
|
||||
Wed Dec 20 10:52:56 1995 John Oleynick ([email protected])
|
||||
* rmt.c: Added temporary kludge so make rmt will work on Linux.
|
||||
* configure.in: Only define HAVE_UTIME_H if utime.h declares
|
||||
struct utimbuf.
|
||||
* Makefile.in: Change prefix, exec_prefix and bindir to get their
|
||||
values from configure. Added cpio.info to DISTFILES.
|
||||
* cpio.texi: Added INFO-DIR-ENTRY.
|
||||
* Version 2.4.1 released.
|
||||
|
||||
Wed Nov 22 19:37:05 1995 John Oleynick ([email protected])
|
||||
* cpio.texi: Updated release date and FSF's address.
|
||||
* NEWS: Listed major new features for 2.4.
|
||||
* mt.c, mt.1: Added seek and fsfm commands.
|
||||
* Version 2.4 released.
|
||||
|
||||
Tue Jun 27 19:14:27 1995 John Oleynick ([email protected])
|
||||
* configure.in: fixed for new autoconf. Added check to make
|
||||
sure fnmatch() works.
|
||||
* Makefile.in: changed realclean to maintainer-clean. Added
|
||||
support to handle fnmatch separate from other LIBOBJS.
|
||||
* cpio.texi: More changes for 2.4.
|
||||
|
||||
Wed Dec 14 16:14:27 1994 John Oleynick ([email protected])
|
||||
* copypass.h: When given the -a option, set the access time of
|
||||
the copy to be the access time of the original (instead of the
|
||||
modification time of the original). Reported by
|
||||
[email protected] (Charles Karney).
|
||||
* cpio.texi: Updated with changes for 2.4.
|
||||
|
||||
Wed Nov 3 18:18:07 1994 John Oleynick ([email protected])
|
||||
* safe-stat.h, Makefile.in: New file used by mkdir.c. This will go
|
||||
away when we get the real safe-xstat.[ch]in for mkdir.c.
|
||||
* main.c: Don't mention [--null] twice in -p's usage message.
|
||||
Changed --no-absolute-paths to --no-absolute-filenames.
|
||||
* cpio.1: Updated man page with new features.
|
||||
* cpio.texi, texinfo.tex, Makefile.in: Added texi documentation
|
||||
from Robert Carleton ([email protected]).
|
||||
|
||||
Mon Oct 3 00:46:30 1994 John Oleynick ([email protected])
|
||||
* makefile.pc, system.h: Changes to compile with Borland C++ 4.0.
|
||||
|
||||
Thu Sep 29 22:15:50 1994 John Oleynick ([email protected])
|
||||
* makepath.c: Don't #define index if it is already #defined.
|
||||
|
||||
* mt.c: Check for __hpux defined instead of __hpux__. Reported
|
||||
by [email protected] (Eric Backus).
|
||||
|
||||
Thu Sep 29 11:21:31 1994 John Oleynick ([email protected])
|
||||
* extern.h, util.c, copyout.c, copypass.c, main.c, global.c:
|
||||
Never mind --ignore-disk-input-errors flag, we'll just always
|
||||
do that, like tar.
|
||||
|
||||
* global.c, extern.h, main.c, copyin.c, copyout.c, copypass.c:
|
||||
Added --quiet flag to supress printing number of blocks copied.
|
||||
|
||||
* global.c, extern.h: If compiled with gcc, make input_bytes
|
||||
and output_bytes `long long' instead of `long'. We need more
|
||||
than 32 bits to keep track of the number of bytes copied to
|
||||
and from tape drives that hold more than 4Gbytes.
|
||||
|
||||
* util.c, copyin.c, main.c, global.c, extern.h: Added
|
||||
--only-verify-crc flag to read a CRC format archive and verify
|
||||
its contents' CRCs.
|
||||
|
||||
* copyout.c: Fixed problem with creating oldc format archives
|
||||
on machines with 16 bit ints. Reported by [email protected]
|
||||
(Martin Poole).
|
||||
|
||||
* mt.c: Need to open tape WR_ONLY for erase command (and probably
|
||||
others?). Reported by [email protected] (Robert
|
||||
Vogelgesan). Accept `eject' as a synonym for `offline'. Accept
|
||||
`-t' as a synonym for `-f' (to be compatible with HPUX mt, which
|
||||
only accepts `-t').
|
||||
|
||||
Wed Sep 28 12:01:55 1994 John Oleynick ([email protected])
|
||||
* extern.h, global.c, main.c, util.c: only write sparse files
|
||||
when given --sparse flag.
|
||||
* extern.h, util.c, copyout.c, copypass.c, main.c, global.c:
|
||||
Added support for --ignore-disk-input-errors flag.
|
||||
|
||||
Wed Aug 24 12:55:38 1994 David J. MacKenzie ([email protected])
|
||||
|
||||
* configure.in: Replace calls to AC_REMOTE_TAPE and AC_RSH
|
||||
with equivalent code, since those macros are going away.
|
||||
|
||||
Sun Feb 13 00:56:48 1994 John Oleynick ([email protected])
|
||||
* extern.h, global.c, main.c, util.c: Added code to
|
||||
tape_buffered_peek() to properly handle large, corrutped
|
||||
archives, without overrunning the allocated buffer and
|
||||
dumping core. Also changed the way the input and output
|
||||
buffers are allocated in initialize_buffers().
|
||||
|
||||
Tue Jan 25 01:04:32 1994 John Oleynick ([email protected])
|
||||
* copyin.c, copyout.c, copypass.c, extern.h, main.c, tar.c, util.c:
|
||||
Redid i/o buffer code. Previously, the same routines buffered input and
|
||||
output for accessing the archive and the filesystem. Now there are
|
||||
separate routines for buffering input and output and for buffering the
|
||||
archive and the filesystem. This simplifies much of the buffer code
|
||||
(e.g., only input from the archive has to check for end of tape and
|
||||
allow the tape to be changed, only output to the filesystem has to
|
||||
handle byte and word swapping, etc.; previously one routine had to
|
||||
handle all of these special cases) This is how the routines got split
|
||||
and renamed (old name -> new name):
|
||||
|
||||
clear_rest_of_block -> tape_clear_rest_of_block
|
||||
copy_files -> copy_files_tape_to_disk
|
||||
" -> copy_files_disk_to_disk
|
||||
" -> copy_files_disk_to_tape
|
||||
copy_buf_out -> disk_buffered_write
|
||||
" -> tape_buffered_write
|
||||
copy_in_buf -> tape_buffered_read
|
||||
empty_output_buffer -> tape_empty_output_buffer
|
||||
" -> disk_empty_output_buffer
|
||||
fill_input_buffer -> tape_fill_input_buffer
|
||||
" -> disk_fill_input_buffer
|
||||
pad_output -> tape_pad_output
|
||||
peek_in_buf -> tape_buffered_peek
|
||||
skip_padding -> tape_skip_padding
|
||||
toss_input -> tape_toss_input
|
||||
|
||||
* extern.h, global.c, main.c, util.c: Added support for
|
||||
writing sparse files.
|
||||
|
||||
Tue Dec 28 23:01:36 1993 John Oleynick ([email protected])
|
||||
* util.c, system.h, makepath.c, extern.h: don't define chown()
|
||||
and don't typedef uid_t and gid_t if we are being compiled
|
||||
by DJGPP.
|
||||
|
||||
* copyin.c, extern.h, global.c, main.c: Added support for
|
||||
--rename-batch-file.
|
||||
|
||||
* copyin.c, copyout.c, extern.h: Cleaned up to pass gcc -Wall.
|
||||
|
||||
Wed Dec 22 02:17:44 1993 John Oleynick ([email protected])
|
||||
|
||||
* makepath.c, copypass.c, copyin.c: If cpio was creating a
|
||||
directory that contained `.' in the pathname (e.g. `foo/./bar'),
|
||||
it would complain that it could not create `.', since it already
|
||||
exists. From [email protected] (Andreas
|
||||
Schwab).
|
||||
|
||||
* mt.c: Added "eject" as a synonym for "offline".
|
||||
|
||||
* util.c: Slight modification to when we lseek with
|
||||
BROKEN_LONG_TAPE_DRIVER (do it every 1Gb, instead
|
||||
of every 2Gb).
|
||||
|
||||
* copyin.c, global.c, extern.h: Added --no-absolute-paths option,
|
||||
to ignore absolute paths in archives.
|
||||
|
||||
Tue Dec 21 01:30:59 1993 John Oleynick ([email protected])
|
||||
|
||||
* util.c: Fix for copying new_media_message_after_number. From
|
||||
[email protected] (Christian
|
||||
Kuehnke).
|
||||
|
||||
Thu Jul 29 20:35:57 1993 David J. MacKenzie ([email protected])
|
||||
|
||||
* Makefile.in (config.status): Run config.status --recheck, not
|
||||
configure, to get the right args passed.
|
||||
|
||||
Mon Jul 19 23:01:00 1993 David J. MacKenzie ([email protected])
|
||||
|
||||
* Makefile.in (libdir): Use standard GNU value --
|
||||
$(exec_prefix)/lib, not /etc.
|
||||
(.c.o): Put CFLAGS last.
|
||||
|
||||
Thu Jul 8 19:43:39 1993 David J. MacKenzie ([email protected])
|
||||
|
||||
* Makefile.in: Add rules for remaking Makefile, configure,
|
||||
config.status.
|
||||
|
||||
Mon Jul 5 14:54:08 1993 John Oleynick ([email protected])
|
||||
|
||||
* cpio.1: Updated man page for 2.3.
|
||||
* Makefile.in: Create distribution with .gz extension, instead of .z.
|
||||
|
||||
Tue Jun 29 18:54:37 1993 John Oleynick ([email protected])
|
||||
|
||||
* Makefile.in: Added installdirs target (using mkinstalldirs).
|
||||
* Added mkinstalldirs script.
|
||||
* main.c, mt.c: Added --help option. Changed usage() to
|
||||
take a stream and exit value (so --help can print on stdout
|
||||
and return a 0 exit status).
|
||||
* extern.h: Removed usage()'s prototype (it was out of date,
|
||||
and only used in main.c).
|
||||
|
||||
Thu May 6 00:22:22 1993 John Oleynick ([email protected])
|
||||
|
||||
* cpio.1: Added hpbin and hpodc.
|
||||
|
||||
Tue May 4 00:32:29 1993 John Oleynick ([email protected])
|
||||
|
||||
* copyin.c (process_copy_in), copypass.c (process_copy_pass): When
|
||||
deleting an existing file, if the file is a directory, use rmdir()
|
||||
instead of unlink().
|
||||
|
||||
Thu Apr 29 14:43:56 1993 John Oleynick ([email protected])
|
||||
|
||||
* tar.c (read_in_tar_header): Clear non-protection bits from
|
||||
mode, in case tar has left some device bits in there.
|
||||
|
||||
Wed Apr 28 10:36:53 1993 John Oleynick ([email protected])
|
||||
|
||||
* util.c: Added code to try and work around broken tape drivers
|
||||
that have problems with tapes > 2Gb.
|
||||
|
||||
* copyout.c (process_copy_out): Pass file_hdr to
|
||||
writeout_other_defers() and add_link_defer() by reference,
|
||||
not by value.
|
||||
|
||||
* copyin.c (process_copy_in): Pass file_hdr to defer_copyin()
|
||||
and create_defered_links() by reference, not by value.
|
||||
|
||||
* defer.c: include <sys/types.h> (to build on BSD 4.3 on HP300)
|
||||
|
||||
Fri Apr 16 18:01:17 1993 John Oleynick ([email protected])
|
||||
|
||||
* mt.c, util.c: Include <sys/mtio.h> if HAVE_SYS_MTIO_H is
|
||||
defined, not HAVE_MTIO_H.
|
||||
|
||||
Wed Apr 14 17:37:46 1993 John Oleynick ([email protected])
|
||||
|
||||
* util.c: Include <sys/io/trioctl.h> if HAVE_SYS_IO_TRIOCTL_H
|
||||
is defined.
|
||||
|
||||
* mt.c: Only include <sys/mtio.h> if HAVE_SYS_MTIO_H is defined.
|
||||
|
||||
Fri Apr 2 13:09:11 1993 John Oleynick ([email protected])
|
||||
|
||||
* configure.in: Added fnmatch to AC_REPLACE_FUNCS. Added
|
||||
sys/io/trioctl.h to AC_HAVE_HEADERS.
|
||||
|
||||
* Makefile.in: Removed fnmatch.o from OBJS.
|
||||
|
||||
* copyin.c: Only include "fnmatch.h" if FNM_PATHNAME isn't
|
||||
defined yet.
|
||||
|
||||
* mt.c: Include <sys/io/trioctl.h> if HAVE_SYS_IO_TRIOCTL_H is
|
||||
defined.
|
||||
|
||||
Mon Mar 29 17:04:06 1993 John Oleynick ([email protected])
|
||||
|
||||
* Many changes for supporting HPUX Context Dependent Files;
|
||||
also some bug fixes to fix problems with multiply (hard) linked
|
||||
device files; minor changes to support HPUX format archives
|
||||
(slightly broken?) System V.4 posix tar archives and HPUX
|
||||
posix tar archives.
|
||||
|
||||
* Makefile.in: New files defer.o, defer,c and defer.h; added
|
||||
-DSYMLINK_USES_UMASK and -DHPUX_CDF comments; changed dist rule
|
||||
to use gzip with tar, instead of compress.
|
||||
|
||||
* copyin.c: changes for new arf_hpbinary and arf_hpascii formats;
|
||||
HPUX CDF's; DEBUG_CPIO; fixes to properly handle multiple
|
||||
links in newc and crc format archives (new routines defer_copyin(),
|
||||
create_defered_links(), create_final_defers()); move most
|
||||
multiple (hard) link code to new routines link_name() and
|
||||
link_to_maj_min_ino(); use new macro UMASKED_SYMLINK instead of
|
||||
symlink().
|
||||
|
||||
* copyout.c: fixes to properly handle multiple links in newc
|
||||
and crc format archives (new routines last_link(),
|
||||
count_defered_links_to_dev_ino(), add_link_defer(),
|
||||
writeout_other_defers(), writeout_final_defers(),
|
||||
writeout_defered_file()); support for new arf_hpbinary and
|
||||
arf_hpascii formats; support for HPUX CDF's.
|
||||
|
||||
* copypass.c: move most multiple link code to new routines
|
||||
link_name() and link_to_maj_min_ino(); use new macro UMASKED_SYMLINK
|
||||
instead of symlink(); support for HPUX CDF's.
|
||||
|
||||
* extern.h: added arf_hpascii and arf_hpbinary archive enum types;
|
||||
added debug_flag.
|
||||
|
||||
* global.c: added debug_flag.
|
||||
|
||||
* main.c: added debug_flag; support for hpodc and hpbin formats.
|
||||
|
||||
* makepath.c: split from standard makpath.c to add support
|
||||
for HPUX CDF's.
|
||||
|
||||
* mt.c: added !defined(__osf__) (from Andrew Marquis
|
||||
<[email protected]>).
|
||||
|
||||
* system.h: new macro UMASKED_SYMLINK
|
||||
|
||||
* tar.c: minor changes to read (slightly broken?) System V.4 posix
|
||||
tar archives and HPUX posix tar archives.
|
||||
|
||||
* util.c: HPUX CDF support (including new routines
|
||||
add_cdf_double_slashes() and islasparentcdf()); new routine
|
||||
umasked_symlink().
|
||||
|
||||
Sun Mar 14 23:00:14 1993 Jim Meyering ([email protected])
|
||||
|
||||
* copypass.c (process_copy_pass): Use <=, not just <, when comparing
|
||||
mtimes. From Pieter Bowman <[email protected]>.
|
||||
|
||||
Fri Jan 15 14:35:37 1993 David J. MacKenzie ([email protected])
|
||||
|
||||
* copyin.c: Move include of fnmatch.h to get right FNM* macros.
|
||||
|
||||
Tue Nov 24 08:45:32 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* Version 2.2.
|
||||
|
||||
* copyout.c (process_copy_out): Add parens for gcc -Wall.
|
||||
From Jim Meyering.
|
||||
|
||||
* system.h: Use HAVE_FCNTL_H, not USG.
|
||||
|
||||
* dstring.c, mt.c, system.h: Use HAVE_STRING_H, not USG.
|
||||
|
||||
Fri Nov 20 22:47:18 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* copyin.c (read_in_binary): Copy the dev and ino that are
|
||||
already in `file_hdr' into `short_hdr'.
|
||||
From [email protected] (David A Oshinsky).
|
||||
|
||||
* system.h [!_POSIX_VERSION]: Declare lseek as off_t, not long.
|
||||
From Karl Berry.
|
||||
|
||||
Wed Oct 14 13:53:41 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* Version 2.1.
|
||||
|
||||
Tue Oct 13 22:51:34 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* main.c: Add --swap equivalent to -b.
|
||||
|
||||
* mt.c: Add f_force_local variable and -V --version option.
|
||||
|
||||
Fri Oct 2 18:42:27 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* main.c (long_opts, usage): Add --force-local option.
|
||||
|
||||
Thu Oct 1 23:23:43 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* main.c (process_args) [__MSDOS__]: Don't call geteuid.
|
||||
|
||||
* copyin.c (read_in_{old,new}_ascii): Use `l' for sscanf into longs.
|
||||
* copyout.c (write_out_header): Ditto for sprintf.
|
||||
* global.c, extern.h: Make input_size and output_size long.
|
||||
|
||||
Thu Sep 10 23:39:30 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* global.c, extern.h: Add new var f_force_local to work with
|
||||
rmt.h change from tar.
|
||||
|
||||
Sun Aug 23 00:18:20 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* Version 2.0.
|
||||
|
||||
* tar.c (otoa): Compute value in an unsigned long, not an int.
|
||||
* copyout.c (write_out_header) [__MSDOS__]: Don't use dev_t.
|
||||
|
||||
* main.c (process_args): By default, don't chown for non-root users.
|
||||
|
||||
Sat Aug 22 14:17:54 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* global.c, extern.h: Use uid_t and gid_t.
|
||||
|
||||
* main.c (main) [__EMX__]: Expand wildcards.
|
||||
* system.h [__EMX__]: Alias some error names. From Kai Uwe Rommel.
|
||||
|
||||
* extern.h [__STDC__]: Use prototypes.
|
||||
|
||||
* copyin.c (process_copy_in), copyout.c (process_copy_out),
|
||||
copypass.c (process_copy_pass): Open all files with O_BINARY.
|
||||
Add cast to chmod call.
|
||||
* util.c: Add cast to bcopy calls. Make hash_insert static.
|
||||
From Kai Uwe Rommel.
|
||||
|
||||
Thu Aug 20 22:03:49 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* util.c (peek_in_buf): Don't print "end of file" before
|
||||
getting the next reel of medium.
|
||||
|
||||
* copyin.c (read_in_old_ascii): Allocate space for NUL terminator.
|
||||
Print newline for dot line when done, even if appending.
|
||||
|
||||
Thu Jul 23 16:34:53 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* tar.c (write_out_tar_header, read_in_tar_header)
|
||||
[__MSDOS__]: Don't try to get user and group names.
|
||||
* extern.h: Don't declare the functions to do it (need uid_t).
|
||||
|
||||
* main.c [__MSDOS__]: Ignore the -R option.
|
||||
|
||||
* system.h: Define makedev if defining major and minor.
|
||||
|
||||
* copyin.c, copyout.c [__MSDOS__]: setmode on archive_des, not
|
||||
0 and 1.
|
||||
|
||||
Sat Jul 18 14:30:55 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* tar.c, stripslash.c, userspec.c, cpiohdr.h, tar.h, tarhdr.h,
|
||||
system.h: New files.
|
||||
* Move portability stuff from various files to system.h.
|
||||
* cpio.h: Rename header structure and members, and add
|
||||
new structure for SVR4 format.
|
||||
* copyin.c, copyout.c: Use the new structure internally, the
|
||||
old one only for I/O in the old formats.
|
||||
* copyin.c (read_in_header): Recognize the new archive formats.
|
||||
(read_in_new_ascii, read_pattern_file, skip_padding): New functions.
|
||||
(swab_array): Do the swapping using char pointers instead of
|
||||
bitwise arithmetic.
|
||||
(process_copy_in): Handle byte and halfword swapping and new formats.
|
||||
Ok if a directory we want to make already exists, but set its perms.
|
||||
Do chmod after chown to fix any set[ug]id bits.
|
||||
Use `struct utimbuf' instead of a long array.
|
||||
* copyout.c (write_out_header): Handle new formats.
|
||||
(process_copy_out): Use `struct utimbuf'.
|
||||
Handle appending and new formats.
|
||||
Remove any leading `./' from filenames.
|
||||
(read_for_checksum, clear_rest_of_block, pad_output): New functions.
|
||||
* copypass.c (process_copy_pass): Use `struct utimbuf'.
|
||||
Ok if a directory we want to make already exists, but set its perms.
|
||||
Do chmod after chown to fix any set[ug]id bits.
|
||||
Don't change perms of `.'.
|
||||
* extern.h, global.c: Replace the separate format flags with
|
||||
one variable. Add new variables for the new options.
|
||||
* main.c: Add new options -A --append, -H --format, -C --io-size,
|
||||
-M --message, --no-preserve-owner, -R --owner, -E --pattern-file,
|
||||
-V --dot, -s --swap-bytes, -S --swap-halfwords, -b, -I, -k, -O.
|
||||
(usage): Document them.
|
||||
(process_args): Recognize them. Use open_archive.
|
||||
(initialize_buffers): Allow room for tar archives and double buffers.
|
||||
* util.c (empty_output_buffer_swap): New function.
|
||||
(empty_output_buffer): Call it if swapping current file.
|
||||
Check additional end of media indicators.
|
||||
(swahw_array, peek_in_buf, prepare_append, open_archive,
|
||||
set_new_media_message): New functions.
|
||||
(fill_input_buffer): Don't print error message if end of media.
|
||||
(toss_input): Don't seek, always read.
|
||||
(copy_files): Update crc if needed.
|
||||
(find_inode_file, add_inode): Check major and minor numbers as
|
||||
well as dev.
|
||||
(get_next_reel): Prompt user if archive name is unknown.
|
||||
Print fancy messages.
|
||||
Close the archive and reopen it.
|
||||
|
||||
Above primarily from John Oleynick <[email protected]>.
|
||||
|
||||
* util.c (find_inode_file): Use modulus when computing initial
|
||||
loop index.
|
||||
(add_inode): Zero out new entry.
|
||||
From [email protected] (Scott Hammond).
|
||||
|
||||
* cpio.h, copyin.c, copyout.c: Rename `struct cpio_header'
|
||||
members from h_foo to c_foo.
|
||||
|
||||
Wed May 20 00:09:26 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* copyin.c: If we include a header file specifically to get
|
||||
major et al., assume we have them.
|
||||
|
||||
Mon Mar 9 19:29:20 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* mt.c (main): rmtclose the tape file descriptor.
|
||||
|
||||
* main.c (main): rmtclose the archive, if not in copy-pass mode.
|
||||
|
||||
* util.c (create_all_directories): Don't print a message when
|
||||
creating a directory, for UNIX compat.
|
||||
|
||||
* copyin.c (process_copy_in), copypass.c (process_copy_pass):
|
||||
Skip file if it has the same timestamp as existing file, not just
|
||||
if it is older than existing file, for UNIX compat.
|
||||
|
||||
Tue Mar 3 12:06:58 1992 David J. MacKenzie ([email protected])
|
||||
|
||||
* main.c, mt.c (usage): Document long options as starting with
|
||||
-- instead of +.
|
||||
|
||||
* extern.h: Only declare lseek if not _POSIX_VERSION.
|
||||
|
||||
Tue Dec 24 00:19:45 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
|
||||
|
||||
* copyin.c: Use MAJOR_IN_MKDEV and MAJOR_IN_SYSMACROS instead
|
||||
of USG and _POSIX_VERSION to find major and minor macros.
|
||||
|
||||
* mt.c: Use unistd.h and stdlib.h if available.
|
||||
|
||||
* copyin.c, copyout.c, copypass.c, util.c, extern.h: Change
|
||||
POSIX ifdefs to HAVE_UNISTD_H and _POSIX_VERSION.
|
||||
|
||||
Sun Aug 25 06:31:08 1991 David J. MacKenzie (djm at apple-gunkies)
|
||||
|
||||
* Version 1.5.
|
||||
|
||||
* bcopy.c: New file (moved from util.c).
|
||||
|
||||
* mt.c (print_status): Not all hpux machines have mt_fileno
|
||||
and mt_blkno; rather than trying to track HP's product line,
|
||||
just assume none of them have them.
|
||||
|
||||
* util.c (copy_buf_out, copy_in_buf): Use more efficient
|
||||
copying technique for a big speedup.
|
||||
|
||||
Fri Aug 2 04:06:45 1991 David J. MacKenzie (djm at apple-gunkies)
|
||||
|
||||
* configure: Support +srcdir. Create config.status.
|
||||
Remove it and Makefile if interrupted while creating them.
|
||||
|
||||
Thu Jul 18 09:43:40 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
|
||||
|
||||
* Many files: use __MSDOS__ instead of MSDOS.
|
||||
|
||||
* util.c, configure: Use NO_MTIO instead of HAVE_MTIO, to keep
|
||||
up with tar and rtapelib.c.
|
||||
|
||||
Mon Jul 15 13:45:30 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
|
||||
|
||||
* configure: Also look in sys/signal.h for signal decl.
|
||||
|
||||
Thu Jul 11 01:50:32 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
|
||||
|
||||
* Version 1.4.
|
||||
|
||||
* configure: Remove /etc and /usr/etc from PATH to avoid
|
||||
finding /etc/install.
|
||||
|
||||
Wed Jul 10 01:40:07 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
|
||||
|
||||
* makefile.pc: Rewrite for Turbo C 2.0.
|
||||
* util.c [__TURBOC__] (utime): New function.
|
||||
* alloca.c, tcexparg.c: New files.
|
||||
|
||||
* extern.h [STDC_HEADERS]: Don't declare malloc and realloc.
|
||||
|
||||
* main.c [MSDOS]: Make binary mode the default.
|
||||
* copyin.c, copyout.c: Make stdin or stdout binary mode as
|
||||
appropriate (so cpio archives don't get corrupted).
|
||||
|
||||
* Many files: Use <string.h> if STDC_HEADERS as well as if USG.
|
||||
|
||||
* configure, Makefile.in: $(INSTALLPROG) -> $(INSTALL),
|
||||
$(INSTALLTEXT) -> $(INSTALLDATA).
|
||||
|
||||
Mon Jul 8 23:18:28 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
|
||||
|
||||
* configure: For some library functions that might be missing,
|
||||
conditionally add the .o files to Makefile instead of
|
||||
defining func_MISSING.
|
||||
* mkdir.c: Renamed from mkrmdir.c.
|
||||
|
||||
Sat Jul 6 02:27:22 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
|
||||
|
||||
* configure: echo messages to stdout, not stderr.
|
||||
Use a test program to see if alloca needs -lPW.
|
||||
|
||||
Thu Jun 27 16:15:15 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
|
||||
|
||||
* copyin.c (process_copy_in), copyout.c (process_copy_out),
|
||||
copypass.c (process_copy_pass): Check close return value for
|
||||
delayed error notification because of NFS.
|
||||
|
||||
Thu Jun 20 02:43:33 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
|
||||
|
||||
* configure: Include $DEFS when compiling test programs.
|
||||
|
||||
* util.c: Only declare getpwuid and getgrgid if not POSIX.
|
||||
|
||||
* Version 1.3.
|
||||
|
||||
* copyin.c: Use time_t, not long, for time values.
|
||||
|
||||
* mt.c (print_status): Special cases for HP-UX and Ultrix.
|
||||
|
||||
* util.c: Compile bcopy if USG or STDC_HEADERS, not BCOPY_MISSING.
|
||||
|
||||
Tue Jun 11 16:40:02 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
|
||||
|
||||
* copyin.c: Don't include sys/sysmacros.h if _POSIX_SOURCE.
|
||||
|
||||
* copyin.c, copyout.c, copypass.c: Don't include sys/file.h if POSIX.
|
||||
|
||||
* util.c: Include sys/types.h before, not after, pwd.h and grp.h.
|
||||
|
||||
* configure: New shell script to aid configuration and create
|
||||
Makefile from Makefile.in.
|
||||
|
||||
* copyin.c (process_copy_in): Use POSIX.2 fnmatch instead of
|
||||
glob_match.
|
||||
|
||||
Mon Jun 10 22:11:19 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
|
||||
|
||||
* global.c, extern.h: New variable, name_end.
|
||||
* main.c (process_args, usage): Add -0 +null option to set it.
|
||||
* copypass.c (process_copy_pass), copyout.c (process_copy_out):
|
||||
Use it.
|
||||
|
||||
* dstring.c (ds_fgetstr): New function made from ds_fgets.
|
||||
(ds_fgets, ds_fgetname): Implement as front ends to ds_fgetstr.
|
||||
|
||||
Sun Jun 2 15:45:24 1991 David J. MacKenzie (djm at wheat-chex)
|
||||
|
||||
* most files: use GPL version 2.
|
||||
|
||||
Sat May 18 11:39:22 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
|
||||
|
||||
* copyin.c, copypass.c: Take out #ifdef MSDOS around chown.
|
||||
* util.c [MSDOS]: Provide dummy chown.
|
||||
|
||||
Fri May 17 21:29:05 1991 David J. MacKenzie (djm at churchy.gnu.ai.mit.edu)
|
||||
|
||||
* Version 1.2.
|
||||
|
||||
* makefile.pc, cpio.cs: Update for new source and object files.
|
||||
|
||||
Fri Mar 15 05:48:36 1991 David J. MacKenzie (djm at geech.ai.mit.edu)
|
||||
|
||||
* global.c, extern.h: New variable `archive_desc'.
|
||||
* main.c (process_args): Set it.
|
||||
* copyout.c (process_copy_out), copyin.c (process_copy_in):
|
||||
Use it.
|
||||
|
||||
* copyout.c (process_copy_out), copyin.c (process_copy_in):
|
||||
Remote tapes are special and not seekable; don't fstat them.
|
||||
|
||||
* main.c (main, usage): Add -F, +file option. Use rmtopen.
|
||||
(main): Exit after printing version number.
|
||||
* util.c (empty_output_buffer): Use rmtwrite instead of write.
|
||||
(fill_input_buffer): Use rmtread instead of read.
|
||||
(tape_offline): Use rmtioctl instead of ioctl.
|
||||
Test HAVE_MTIO instead of MTIO_MISSING, for tar compatibility.
|
||||
|
||||
Thu Mar 14 17:49:57 1991 David J. MacKenzie (djm at geech.ai.mit.edu)
|
||||
|
||||
* util.c (create_all_directories): Use make_path to do the work.
|
||||
|
||||
Sat Jan 12 15:32:15 1991 David J. MacKenzie (djm at geech.ai.mit.edu)
|
||||
|
||||
* copyin.c, copyout.c, copypass.c, util.c: Only declare
|
||||
`errno' if not MSDOS. Some Unix errno.h do, some don't . . . .
|
||||
|
||||
* global.c, extern.h: Make `input_size' and `output_size'
|
||||
unsigned, for 16 bit machines.
|
||||
|
||||
* copyin.c (print_name_with_quoting): All non-ctrl chars are
|
||||
printable on MS-DOS.
|
||||
|
||||
* util.c (empty_output_buffer): Never make sparse files;
|
||||
can create unrunnable executables.
|
||||
* copyin.c, copyout.c, copypass.c: Callers changed.
|
||||
* util.c (finish_output_file): Function removed.
|
||||
|
||||
Tue Nov 6 15:47:16 1990 David J. MacKenzie (djm at apple-gunkies)
|
||||
|
||||
* copyin.c, util.c, extern.h: Rename copystring to xstrdup.
|
||||
|
||||
Mon Oct 29 02:24:41 1990 David J. MacKenzie (djm at apple-gunkies)
|
||||
|
||||
* util.c (empty_output_buffer): Only make sparse files if
|
||||
NO_SPARSE_FILES is undefined, to accomodate dumb kernels.
|
||||
|
||||
Wed Jul 25 18:48:35 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
|
||||
|
||||
* util.c (getuser, getgroup): Make uid and gid unsigned short,
|
||||
not int.
|
||||
|
||||
Sat Jul 21 00:44:44 1990 David J. MacKenzie (djm at apple-gunkies)
|
||||
|
||||
* copyin.c, copyout.c, copypass.c, util.c, cpio.h: Add ifdefs
|
||||
for MSDOS.
|
||||
|
||||
Sun Jul 15 23:51:48 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
|
||||
|
||||
* copyin.c, copyout.c, copypass.c, global.c, extern.h, util.c:
|
||||
Use longs where appropriate, for 16 bit machines.
|
||||
|
||||
Sun Jul 8 22:58:06 1990 David J. MacKenzie (djm at apple-gunkies)
|
||||
|
||||
* main.c (process_args, usage): Change -b option to -O (old), to
|
||||
allow adding byte swapping later.
|
||||
|
||||
Sat Jul 7 14:48:35 1990 David J. MacKenzie (dave at edfmd)
|
||||
|
||||
* Version 1.1.
|
||||
|
||||
* cpio.h: Make `mtime' and `filesize' unsigned long.
|
||||
* copyin.c (read_in_binary), copyout.c (write_out_header):
|
||||
High short-word of `mtime' and `filesize' always comes first.
|
||||
|
||||
* (read_in_ascii, read_in_binary): New functions, from code in
|
||||
read_in_header.
|
||||
(read_in_header): Search for valid magic number, then fill in
|
||||
rest of header using read_in_ascii and read_in_binary.
|
||||
* global.c, extern.h: New variable, `binary_flag'.
|
||||
* main.c (process_args): Recognize new -b +binary option.
|
||||
* util.c [BCOPY_MISSING] (bcopy): New function.
|
||||
|
||||
Wed Jul 4 00:40:58 1990 David J. MacKenzie (djm at apple-gunkies)
|
||||
|
||||
* main.c (process_args): Add local pointers to functions to
|
||||
work around a pcc bug found on a Convex.
|
||||
|
||||
* copyin.c (process_copy_in), util.c (toss_input,
|
||||
create_all_directories, add_inode): Don't use `index' as a
|
||||
variable name.
|
||||
|
||||
Tue Jul 3 02:33:36 1990 David J. MacKenzie (djm at apple-gunkies)
|
||||
|
||||
* version 1.0.
|
||||
|
||||
Mon Jul 2 23:18:56 1990 David J. MacKenzie (djm at twiddle)
|
||||
|
||||
* copyin.c (process_copy_in), copyout.c (process_copy_out),
|
||||
copypass.c (process_copy_pass): Print "1 block", not "1 blocks".
|
||||
|
||||
* copyin.c (process_copy_in), copypass.c (process_copy_pass):
|
||||
Unlink existing dest. file unless either it is newer and
|
||||
not unconditional, or it is a directory.
|
||||
|
||||
Mon Jul 2 03:57:41 1990 David J. MacKenzie (dave at edfmd)
|
||||
|
||||
* util.c (xrealloc): New function.
|
||||
* dstring.c (ds_resize): Use xrealloc instead of free and
|
||||
xmalloc. Never shrink the string.
|
||||
|
||||
* copypass.c (process_copy_pass): More efficient
|
||||
string handling while constructing output filename.
|
||||
|
||||
* global.c, extern.h, main.c, cpio.h: Change from an enum,
|
||||
`copy_command', to a pointer to a void function, `copy_function'.
|
||||
|
||||
* cpio.h (struct cpio_header): Make most fields unsigned.
|
||||
Rename h_filesize to h_filesizes and h_mtime to h_mtimes, and
|
||||
add new `long' fields with the old names at the end of the
|
||||
structure.
|
||||
* copyin.c (read_in_header): Set the long fields from the
|
||||
short arrays, making sure longs are aligned properly.
|
||||
(process_copy_in, long_format): Use the long fields.
|
||||
* copyout.c (write_out_header): Set the short arrays from the
|
||||
long fields, making sure longs are aligned properly.
|
||||
(process_copy_out): Use the long fields.
|
||||
|
||||
* global.c, extern.h: New variable `output_is_seekable'.
|
||||
* util.c (empty_output_buffer): If output_is_seekable, use
|
||||
lseek to write blocks of zeros.
|
||||
(finish_output_file): New function.
|
||||
* copyin.c (process_copy_in), copyout.c (process_copy_out),
|
||||
copypass.c (process_copy_pass): Set `output_is_seekable'
|
||||
correctly and call finish_output_file.
|
||||
* main.c (initialize_buffers): Allocate space for sentinel in
|
||||
`output_buffer'.
|
||||
|
||||
* global.c, extern.h: New variable `numeric_uid'.
|
||||
* main.c (process_args): Accept -n +numeric-uid-gid option, like ls.
|
||||
* copyin.c (long_format): Use numeric_uid.
|
||||
|
||||
* copyin.c (process_copy_in), copyout.c (process_copy_out),
|
||||
copypass.c (process_copy_pass): Don't (for verbose) print the
|
||||
names of files that are not copied because of errors. Try to
|
||||
create missing directories for all file types. Free temporary
|
||||
buffers on error.
|
||||
|
||||
Sat Jun 30 14:28:45 1990 David J. MacKenzie (djm at apple-gunkies)
|
||||
|
||||
* version.c: New file.
|
||||
* main.c: Add -V, +version option.
|
||||
* Makefile [dist]: Extract version number from version.c.
|
||||
|
||||
Sat Jun 30 12:44:47 1990 David J. MacKenzie (dave at edfmd)
|
||||
|
||||
* global.c, extern.h, copyin.c, copyout.c, util.c: Rename
|
||||
`{input,output}_is_regular' to `{input,output}_is_special' and
|
||||
reverse the truth value.
|
||||
|
||||
* global.c, extern.h: New variable `input_is_seekable' to
|
||||
control whether to skip data with lseek or read.
|
||||
* copyin.c (process_copy_in): Set it.
|
||||
* util.c (toss_input): Use it.
|
||||
|
||||
* global.c, extern.h: New variable `xstat' that selects stat
|
||||
or lstat for input files.
|
||||
* main.c (process_args): New option -L, +dereference to set
|
||||
xstat to stat instead of lstat.
|
||||
(usage): Document it.
|
||||
* copyout.c (process_copy_out), copypass.c
|
||||
(process_copy_pass): Use *xstat on input file.
|
||||
|
||||
Sat Jun 30 01:53:12 1990 David J. MacKenzie (dave at edfmd)
|
||||
|
||||
* dstring.c (ds_init): Return void because return value was
|
||||
never used.
|
||||
(ds_resize): Ditto, and free old value instead of new one.
|
||||
|
||||
* util.c (empty_output_buffer, fill_input_buffer,
|
||||
copy_out_buf, copy_in_buf, toss_input, copy_files): Return
|
||||
void instead of an error value and make errors fatal
|
||||
immediately instead of several levels up, to prevent printing
|
||||
of multiple error messages by different levels of functions.
|
||||
|
||||
* copyin.c (read_in_header): Return void, because the error
|
||||
handling all happens at lower levels.
|
||||
(print_name_with_quoting): New function.
|
||||
(long_format): Call print_name_with_quoting. Take additional
|
||||
arg for name of linked-to file, and print it if nonzero.
|
||||
(process_copy_in): For verbose listing of symlinks, read in
|
||||
the linkname and pass it to long_format.
|
||||
|
||||
* extern.h: Declare some more functions.
|
||||
|
||||
Thu Jun 28 16:07:15 1990 David J. MacKenzie (dave at edfmd)
|
||||
|
||||
* copypass.c (process_copy_pass): Warn about unknown file types.
|
||||
|
||||
* copyout.c (process_copy_out): Check fstat return for error.
|
||||
Record filesize of 0 for special files. Warn about unknown
|
||||
file types.
|
||||
|
||||
* copyin.c (process_copy_in): Warn about unknown file types.
|
||||
(read_in_header): Warn about byte-reversed binary headers.
|
||||
|
||||
Sat Jun 23 22:50:45 1990 David J. MacKenzie (dave at edfmd)
|
||||
|
||||
* main.c (main): Set umask to 0 so permissions of created
|
||||
files are preserved.
|
||||
|
||||
* copyin.c, copyout.c, copypass.c, util.c: Pass file
|
||||
descriptors as ints, not pointers to ints.
|
||||
Cast file timestamps and sizes to long *, not int *, for 16
|
||||
bit machines.
|
||||
Use lstat instead of stat, if available.
|
||||
Handle FIFO's, sockets, and symlinks, if supported by O.S.
|
||||
|
||||
* copyin.c (process_copy_in), copyout.c (process_copy_out):
|
||||
Don't consider FIFO'S, sockets, etc. to be possible tape drives.
|
||||
|
||||
* util.c (create_all_directories): Fix incorrect loop
|
||||
termination check. Only copy string if it contains slashes.
|
||||
Don't check whether directory "" exists.
|
||||
(tape_offline): Code moved from get_next_reel.
|
||||
(get_next_reel): Print message before taking tape offline.
|
||||
Read a line of arbitrary length.
|
||||
|
||||
* copyout.c, copyin.c, copypass.c: Always use utime, not utimes.
|
||||
|
||||
* copyin.c (swab_short): New macro.
|
||||
(swab_array): New function.
|
||||
(read_in_header): In binary mode, if a byte-swapped header is
|
||||
read, swap the bytes back.
|
||||
(process_copy_in, process_copy_pass): Don't stat each file to
|
||||
create unless !unconditional_flag. Create device files correctly.
|
||||
Don't temporarily allow files being created to be read by
|
||||
other users. Don't unnecessarily chmod special files.
|
||||
|
||||
Thu May 31 20:51:43 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
|
||||
|
||||
* copyin.c (long_format): Use mode_string to format
|
||||
file protections instead of doing it ourselves.
|
||||
(protections): Function removed.
|
||||
|
||||
Sat Apr 14 02:31:01 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
|
||||
|
||||
* cpio.h (struct cpio_header): Make inode, mode, uid, gid
|
||||
fields unsigned.
|
||||
|
||||
* util.c (getgroup): New function.
|
||||
* copyin.c (long_format): Print group name of files.
|
||||
Print file size, etc. as unsigned integers, not signed.
|
||||
|
||||
* main.c (process_args): If -t is given and neither -i, -o, or
|
||||
-p is given, assume -i.
|
||||
|
||||
* Add -f, +nonmatching option.
|
||||
* main.c: Rename +out to +create, +in to +extract,
|
||||
+modification-time to +preserve-modification-time,
|
||||
+pass to +pass-through.
|
||||
|
||||
* copyin.c (process_copy_in), copypass.c (process_copy_pass):
|
||||
Don't complain in chown fails because the user doesn't have
|
||||
permission.
|
||||
|
||||
Fri Apr 13 13:53:20 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
|
||||
|
||||
* Add ifdefs for USG/Xenix.
|
||||
* util.c (cpio_error): Function removed.
|
||||
* Use error instead of cpio_error, so system error messages
|
||||
will be included.
|
||||
* cpio.h: Rename 'hdr_struct' to 'struct cpio_header'.
|
||||
* Move definition of xmalloc from dstring.c to util.c.
|
||||
* global.c, extern.c: Add global `program_name'.
|
||||
* main.c (main): Set program_name.
|
||||
(process_args): Rename +reset-atime to +reset-access-time,
|
||||
+table to +list.
|
||||
Have +block-size take an argument.
|
||||
|
||||
Thu Apr 12 13:33:32 1990 David J. MacKenzie (djm at rice-chex)
|
||||
|
||||
* util.c (find_inode_file): Make inode an int, not a short.
|
||||
|
||||
* Make functions that don't return a value have type void.
|
||||
Add some casts to function calls.
|
||||
|
||||
Wed Apr 11 14:55:28 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
|
||||
|
||||
* main.c (process_args): -i, -o, and -p don't take arguments.
|
||||
|
||||
* main.c (process_args): Get the non-option args from the
|
||||
correct elements of argv.
|
||||
|
||||
Tue Apr 10 00:20:26 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
|
||||
|
||||
* Indent source code and update copyrights.
|
||||
|
||||
* cpio.c (usage): Change `collection' to `archive' in message.
|
||||
|
||||
Thu Dec 28 03:03:55 1989 David J. MacKenzie (djm at hobbes.ai.mit.edu)
|
||||
|
||||
* dstring.c (xmalloc): Don't return a null pointer if size is 0,
|
||||
on the assumption that trying to allocate 0 bytes is a bug that
|
||||
should be trapped.
|
||||
|
||||
Wed Dec 20 03:24:48 1989 David J. MacKenzie (djm at hobbes.ai.mit.edu)
|
||||
|
||||
* All files: Change from GNU CPIO General Public License to
|
||||
GNU General Public License.
|
||||
|
||||
Mon Dec 18 13:18:36 1989 David J. MacKenzie (djm at hobbes.ai.mit.edu)
|
||||
|
||||
* Makefile: Add clean target and defines for CC and LDFLAGS.
|
||||
Add dist target and SRCS, DISTFILES macros. Add tags and TAGS targets.
|
||||
* dstring.c (ds_fgets): Read characters into an int, not char.
|
||||
(xmalloc): New function.
|
||||
(out_of_memory): Function removed.
|
||||
Global: use xmalloc instead of malloc and out_of_memory.
|
||||
* extern.h, global.c: Make flag variables ints instead of chars for
|
||||
compatibility with getopt_long.
|
||||
* extern.h: Declare more functions.
|
||||
* main.c (usage): Put the whole usage message into a single string
|
||||
and fix errors.
|
||||
* util.c (create_all_directories): Remove unused variable.
|
||||
(get_next_reel): Ditto.
|
||||
* dstring.h: Declare function.
|
||||
|
||||
Sat Dec 2 13:22:37 1989 David J. MacKenzie (djm at hobbes.ai.mit.edu)
|
||||
|
||||
* main.c: Change +copy-pass option to +pass, +copy-in to +in,
|
||||
+copy-out to +out, and +mkdir to +make-directories, and add null
|
||||
option to terminate table.
|
||||
(process_args): Use the same code to handle long and short named
|
||||
options.
|
||||
(usage): Mention long options in message.
|
||||
|
||||
Local Variables:
|
||||
mode: indented-text
|
||||
left-margin: 8
|
||||
version-control: never
|
||||
End:
|
||||
@@ -1,15 +0,0 @@
|
||||
GNU cpio 2.4.2
|
||||
originals can be found at: ftp://prep.ai.mit.edu/pub/gnu
|
||||
|
||||
removed files:
|
||||
INSTALL cpio.info mkdir.c
|
||||
Makefile.in cpio.texi mkinstalldirs
|
||||
argmatch.c fnmatch.c mt.1
|
||||
bcopy.c fnmatch.h mt.c
|
||||
configure install-sh rmt.c
|
||||
configure.in makefile.os2 strdup.c
|
||||
cpio.def makefile.pc tcexparg.c
|
||||
texinfo.tex
|
||||
|
||||
|
||||
[email protected]
|
||||
@@ -1,64 +0,0 @@
|
||||
|
||||
Major changes in version 2.4:
|
||||
|
||||
* new texinfo documentation
|
||||
* --sparse option to write sparse files
|
||||
* --only-verify-crc option to verify a CRC format archive
|
||||
* --no-absolute-paths option to ignore absolute paths
|
||||
* --quiet option to supress printing number of blocks copied
|
||||
* handle disk input errors more gracefully
|
||||
|
||||
Major changes in version 2.3:
|
||||
|
||||
* in newc and crc format archives, only store 1 copy of multiply linked files
|
||||
* handle multiply linked devices properly
|
||||
* handle multiply linked files with cpio -pl even when the source and
|
||||
destination are on different file systems
|
||||
* support HPUX Context Dependent Files
|
||||
* read and write HPUX cpio archives
|
||||
* read System V.4 POSIX tar archives and HPUX POSIX tar archives
|
||||
* use rmdir, instead of unlink, to delete existing directories
|
||||
|
||||
Major changes in version 2.2:
|
||||
|
||||
* handle link counts correctly when reading binary cpio archives
|
||||
* configure checks for some libraries that SVR4 needs
|
||||
|
||||
Major changes in version 2.1:
|
||||
|
||||
* cpio can access remote non-device files as well as remote devices
|
||||
* fix bugs in the MS-DOS port
|
||||
* add --swap equivalent to -b option
|
||||
|
||||
Version 2.0 adds the following features:
|
||||
|
||||
Support for the SVR4 cpio formats, which can store inodes >65535, and
|
||||
for traditional and POSIX tar archives. Also adds these options:
|
||||
|
||||
-A --append append to instead of replacing the archive
|
||||
-V --dot print a dot for each file processed
|
||||
-H --format select archive format
|
||||
-C --io-size select I/O block size in bytes
|
||||
-M --message print a message at end of media volumes
|
||||
--no-preserve-owner don't change files' owners when extracting
|
||||
-R --owner set files' owners when extracting
|
||||
-E --pattern-file list of shell filename patterns to process
|
||||
-s --swap-bytes handle byte-order differences when extracting files
|
||||
-S --swap-halfwords ditto
|
||||
-b like -sS
|
||||
-I input archive filename
|
||||
-k recognize corrupted archives (we alawys do it, though)
|
||||
-O output archive filename
|
||||
|
||||
Some options of previous versions have been renamed in 2.0:
|
||||
|
||||
--binary was replaced by --format=bin
|
||||
--portability was replaced by --format=odc
|
||||
|
||||
Some options have changed meaning in 2.0, for SVR4 compatibility:
|
||||
|
||||
-O used to select the binary archive format, now selects the output file
|
||||
-V used to print the version number, now prints a dot for each file
|
||||
|
||||
Version 2.0 also fixes several bugs in the handling of files with
|
||||
multiple links and of multi-volume archives on floppy disks.
|
||||
@@ -1,71 +0,0 @@
|
||||
This is GNU cpio, a program to manage archives of files.
|
||||
As of version 2.0, it supports the features of the System V release 4
|
||||
cpio, including support for tar archives.
|
||||
|
||||
This package also includes rmt, the remote tape server, and mt, a tape
|
||||
drive control program; these two programs will only be compiled if
|
||||
your system supports remote command execution, and tape drive control
|
||||
operations, respectively.
|
||||
|
||||
See the file INSTALL for compilation and installation instructions for Unix.
|
||||
|
||||
For non-Unix systems:
|
||||
|
||||
makefile.pc is a makefile for Turbo C or C++ or Borland C++ on MS-DOS.
|
||||
|
||||
makefile.os2 is a makefile for MS C and GNU C (emx/gcc) on OS/2.
|
||||
cpio.def is a linker definition file for the MS C OS/2 version.
|
||||
|
||||
|
||||
The main advantages of GNU cpio over Unix versions are:
|
||||
|
||||
* It can access tape drives on other hosts using TCP/IP.
|
||||
|
||||
* `-o' and `-p' can copy symbolic links either as symbolic links or,
|
||||
with `-L', as the files they point to.
|
||||
|
||||
* `-i' automatically recognizes the archive format and tries to
|
||||
recover from corrupted archives.
|
||||
|
||||
* The output of '-itv' looks like 'ls -l'.
|
||||
|
||||
* It accepts long-named options as well as traditional
|
||||
single-character options.
|
||||
|
||||
A few features of other versions of cpio are missing from GNU cpio, including:
|
||||
|
||||
* The `-6' option to support Sixth Edition Unix cpio archives with `-i'.
|
||||
|
||||
* An option to limit volume size, like afio -s.
|
||||
|
||||
|
||||
GNU cpio supports the POSIX.1 "ustar" tar format. GNU tar supports a
|
||||
somewhat different, early draft of that format. That draft format has
|
||||
a slightly different magic number in the tar header and doesn't
|
||||
include the path prefix part of the header, which allows storing file
|
||||
names that are longer than 100 characters. GNU cpio knows to
|
||||
recognize the nonstandard GNU tar "ustar" archives.
|
||||
|
||||
The following patch to GNU tar 1.11.1 makes GNU tar recognize standard
|
||||
"ustar" archives, such as GNU cpio produces, except that it won't use
|
||||
the path prefix. Without this patch, GNU tar thinks that standard
|
||||
"ustar" archives are old-format tar archives and can not use the extra
|
||||
information that "ustar" format contains. If you use this patch,
|
||||
remember that you will lose the beginnings of paths that are longer
|
||||
than 100 characters. That's why it's not an official part of GNU tar.
|
||||
(Adding support for the path prefix to GNU tar is not trivial.)
|
||||
|
||||
--- list.c.orig Mon Sep 14 17:04:03 1992
|
||||
+++ list.c Wed Oct 14 14:02:28 1992
|
||||
@@ -439,7 +439,7 @@
|
||||
st->st_ctime = from_oct(1+12, header->header.ctime);
|
||||
}
|
||||
|
||||
- if (0==strcmp(header->header.magic, TMAGIC)) {
|
||||
+ if (0==strncmp(header->header.magic, TMAGIC, 5)) {
|
||||
/* Unix Standard tar archive */
|
||||
*stdp = 1;
|
||||
if (wantug) {
|
||||
|
||||
Mail suggestions and bug reports for GNU cpio to
|
||||
[email protected].
|
||||
@@ -1,495 +0,0 @@
|
||||
/* alloca.c -- allocate automatically reclaimed memory
|
||||
(Mostly) portable public-domain implementation -- D A Gwyn
|
||||
|
||||
This implementation of the PWB library alloca function,
|
||||
which is used to allocate space off the run-time stack so
|
||||
that it is automatically reclaimed upon procedure exit,
|
||||
was inspired by discussions with J. Q. Johnson of Cornell.
|
||||
J.Otto Tennant <[email protected]> contributed the Cray support.
|
||||
|
||||
There are some preprocessor constants that can
|
||||
be defined when compiling for your specific system, for
|
||||
improved efficiency; however, the defaults should be okay.
|
||||
|
||||
The general concept of this implementation is to keep
|
||||
track of all alloca-allocated blocks, and reclaim any
|
||||
that are found to be deeper in the stack than the current
|
||||
invocation. This heuristic does not reclaim storage as
|
||||
soon as it becomes invalid, but it will do so eventually.
|
||||
|
||||
As a special case, alloca(0) reclaims storage without
|
||||
allocating any. It is a good idea to use alloca(0) in
|
||||
your main control loop, etc. to force garbage collection. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef emacs
|
||||
#include "blockinput.h"
|
||||
#endif
|
||||
|
||||
/* If compiling with GCC 2, this file's not needed. */
|
||||
#if !defined (__GNUC__) || __GNUC__ < 2
|
||||
|
||||
/* If someone has defined alloca as a macro,
|
||||
there must be some other way alloca is supposed to work. */
|
||||
#ifndef alloca
|
||||
|
||||
#ifdef emacs
|
||||
#ifdef static
|
||||
/* actually, only want this if static is defined as ""
|
||||
-- this is for usg, in which emacs must undefine static
|
||||
in order to make unexec workable
|
||||
*/
|
||||
#ifndef STACK_DIRECTION
|
||||
you
|
||||
lose
|
||||
-- must know STACK_DIRECTION at compile-time
|
||||
#endif /* STACK_DIRECTION undefined */
|
||||
#endif /* static */
|
||||
#endif /* emacs */
|
||||
|
||||
/* If your stack is a linked list of frames, you have to
|
||||
provide an "address metric" ADDRESS_FUNCTION macro. */
|
||||
|
||||
#if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||
long i00afunc ();
|
||||
#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
|
||||
#else
|
||||
#define ADDRESS_FUNCTION(arg) &(arg)
|
||||
#endif
|
||||
|
||||
#if __STDC__
|
||||
typedef void *pointer;
|
||||
#else
|
||||
typedef char *pointer;
|
||||
#endif
|
||||
|
||||
#define NULL 0
|
||||
|
||||
/* Different portions of Emacs need to call different versions of
|
||||
malloc. The Emacs executable needs alloca to call xmalloc, because
|
||||
ordinary malloc isn't protected from input signals. On the other
|
||||
hand, the utilities in lib-src need alloca to call malloc; some of
|
||||
them are very simple, and don't have an xmalloc routine.
|
||||
|
||||
Non-Emacs programs expect this to call use xmalloc.
|
||||
|
||||
Callers below should use malloc. */
|
||||
|
||||
#ifndef emacs
|
||||
#define malloc xmalloc
|
||||
#endif
|
||||
extern pointer malloc ();
|
||||
|
||||
/* Define STACK_DIRECTION if you know the direction of stack
|
||||
growth for your system; otherwise it will be automatically
|
||||
deduced at run-time.
|
||||
|
||||
STACK_DIRECTION > 0 => grows toward higher addresses
|
||||
STACK_DIRECTION < 0 => grows toward lower addresses
|
||||
STACK_DIRECTION = 0 => direction of growth unknown */
|
||||
|
||||
#ifndef STACK_DIRECTION
|
||||
#define STACK_DIRECTION 0 /* Direction unknown. */
|
||||
#endif
|
||||
|
||||
#if STACK_DIRECTION != 0
|
||||
|
||||
#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
|
||||
|
||||
#else /* STACK_DIRECTION == 0; need run-time code. */
|
||||
|
||||
static int stack_dir; /* 1 or -1 once known. */
|
||||
#define STACK_DIR stack_dir
|
||||
|
||||
static void
|
||||
find_stack_direction ()
|
||||
{
|
||||
static char *addr = NULL; /* Address of first `dummy', once known. */
|
||||
auto char dummy; /* To get stack address. */
|
||||
|
||||
if (addr == NULL)
|
||||
{ /* Initial entry. */
|
||||
addr = ADDRESS_FUNCTION (dummy);
|
||||
|
||||
find_stack_direction (); /* Recurse once. */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Second entry. */
|
||||
if (ADDRESS_FUNCTION (dummy) > addr)
|
||||
stack_dir = 1; /* Stack grew upward. */
|
||||
else
|
||||
stack_dir = -1; /* Stack grew downward. */
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* STACK_DIRECTION == 0 */
|
||||
|
||||
/* An "alloca header" is used to:
|
||||
(a) chain together all alloca'ed blocks;
|
||||
(b) keep track of stack depth.
|
||||
|
||||
It is very important that sizeof(header) agree with malloc
|
||||
alignment chunk size. The following default should work okay. */
|
||||
|
||||
#ifndef ALIGN_SIZE
|
||||
#define ALIGN_SIZE sizeof(double)
|
||||
#endif
|
||||
|
||||
typedef union hdr
|
||||
{
|
||||
char align[ALIGN_SIZE]; /* To force sizeof(header). */
|
||||
struct
|
||||
{
|
||||
union hdr *next; /* For chaining headers. */
|
||||
char *deep; /* For stack depth measure. */
|
||||
} h;
|
||||
} header;
|
||||
|
||||
static header *last_alloca_header = NULL; /* -> last alloca header. */
|
||||
|
||||
/* Return a pointer to at least SIZE bytes of storage,
|
||||
which will be automatically reclaimed upon exit from
|
||||
the procedure that called alloca. Originally, this space
|
||||
was supposed to be taken from the current stack frame of the
|
||||
caller, but that method cannot be made to work for some
|
||||
implementations of C, for example under Gould's UTX/32. */
|
||||
|
||||
pointer
|
||||
alloca (size)
|
||||
unsigned size;
|
||||
{
|
||||
auto char probe; /* Probes stack depth: */
|
||||
register char *depth = ADDRESS_FUNCTION (probe);
|
||||
|
||||
#if STACK_DIRECTION == 0
|
||||
if (STACK_DIR == 0) /* Unknown growth direction. */
|
||||
find_stack_direction ();
|
||||
#endif
|
||||
|
||||
/* Reclaim garbage, defined as all alloca'd storage that
|
||||
was allocated from deeper in the stack than currently. */
|
||||
|
||||
{
|
||||
register header *hp; /* Traverses linked list. */
|
||||
|
||||
#ifdef emacs
|
||||
BLOCK_INPUT;
|
||||
#endif
|
||||
|
||||
for (hp = last_alloca_header; hp != NULL;)
|
||||
if ((STACK_DIR > 0 && hp->h.deep > depth)
|
||||
|| (STACK_DIR < 0 && hp->h.deep < depth))
|
||||
{
|
||||
register header *np = hp->h.next;
|
||||
|
||||
free ((pointer) hp); /* Collect garbage. */
|
||||
|
||||
hp = np; /* -> next header. */
|
||||
}
|
||||
else
|
||||
break; /* Rest are not deeper. */
|
||||
|
||||
last_alloca_header = hp; /* -> last valid storage. */
|
||||
|
||||
#ifdef emacs
|
||||
UNBLOCK_INPUT;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (size == 0)
|
||||
return NULL; /* No allocation required. */
|
||||
|
||||
/* Allocate combined header + user data storage. */
|
||||
|
||||
{
|
||||
register pointer new = malloc (sizeof (header) + size);
|
||||
/* Address of header. */
|
||||
|
||||
if (new == 0)
|
||||
abort();
|
||||
|
||||
((header *) new)->h.next = last_alloca_header;
|
||||
((header *) new)->h.deep = depth;
|
||||
|
||||
last_alloca_header = (header *) new;
|
||||
|
||||
/* User storage begins just after header. */
|
||||
|
||||
return (pointer) ((char *) new + sizeof (header));
|
||||
}
|
||||
}
|
||||
|
||||
#if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||
|
||||
#ifdef DEBUG_I00AFUNC
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
#ifndef CRAY_STACK
|
||||
#define CRAY_STACK
|
||||
#ifndef CRAY2
|
||||
/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
|
||||
struct stack_control_header
|
||||
{
|
||||
long shgrow:32; /* Number of times stack has grown. */
|
||||
long shaseg:32; /* Size of increments to stack. */
|
||||
long shhwm:32; /* High water mark of stack. */
|
||||
long shsize:32; /* Current size of stack (all segments). */
|
||||
};
|
||||
|
||||
/* The stack segment linkage control information occurs at
|
||||
the high-address end of a stack segment. (The stack
|
||||
grows from low addresses to high addresses.) The initial
|
||||
part of the stack segment linkage control information is
|
||||
0200 (octal) words. This provides for register storage
|
||||
for the routine which overflows the stack. */
|
||||
|
||||
struct stack_segment_linkage
|
||||
{
|
||||
long ss[0200]; /* 0200 overflow words. */
|
||||
long sssize:32; /* Number of words in this segment. */
|
||||
long ssbase:32; /* Offset to stack base. */
|
||||
long:32;
|
||||
long sspseg:32; /* Offset to linkage control of previous
|
||||
segment of stack. */
|
||||
long:32;
|
||||
long sstcpt:32; /* Pointer to task common address block. */
|
||||
long sscsnm; /* Private control structure number for
|
||||
microtasking. */
|
||||
long ssusr1; /* Reserved for user. */
|
||||
long ssusr2; /* Reserved for user. */
|
||||
long sstpid; /* Process ID for pid based multi-tasking. */
|
||||
long ssgvup; /* Pointer to multitasking thread giveup. */
|
||||
long sscray[7]; /* Reserved for Cray Research. */
|
||||
long ssa0;
|
||||
long ssa1;
|
||||
long ssa2;
|
||||
long ssa3;
|
||||
long ssa4;
|
||||
long ssa5;
|
||||
long ssa6;
|
||||
long ssa7;
|
||||
long sss0;
|
||||
long sss1;
|
||||
long sss2;
|
||||
long sss3;
|
||||
long sss4;
|
||||
long sss5;
|
||||
long sss6;
|
||||
long sss7;
|
||||
};
|
||||
|
||||
#else /* CRAY2 */
|
||||
/* The following structure defines the vector of words
|
||||
returned by the STKSTAT library routine. */
|
||||
struct stk_stat
|
||||
{
|
||||
long now; /* Current total stack size. */
|
||||
long maxc; /* Amount of contiguous space which would
|
||||
be required to satisfy the maximum
|
||||
stack demand to date. */
|
||||
long high_water; /* Stack high-water mark. */
|
||||
long overflows; /* Number of stack overflow ($STKOFEN) calls. */
|
||||
long hits; /* Number of internal buffer hits. */
|
||||
long extends; /* Number of block extensions. */
|
||||
long stko_mallocs; /* Block allocations by $STKOFEN. */
|
||||
long underflows; /* Number of stack underflow calls ($STKRETN). */
|
||||
long stko_free; /* Number of deallocations by $STKRETN. */
|
||||
long stkm_free; /* Number of deallocations by $STKMRET. */
|
||||
long segments; /* Current number of stack segments. */
|
||||
long maxs; /* Maximum number of stack segments so far. */
|
||||
long pad_size; /* Stack pad size. */
|
||||
long current_address; /* Current stack segment address. */
|
||||
long current_size; /* Current stack segment size. This
|
||||
number is actually corrupted by STKSTAT to
|
||||
include the fifteen word trailer area. */
|
||||
long initial_address; /* Address of initial segment. */
|
||||
long initial_size; /* Size of initial segment. */
|
||||
};
|
||||
|
||||
/* The following structure describes the data structure which trails
|
||||
any stack segment. I think that the description in 'asdef' is
|
||||
out of date. I only describe the parts that I am sure about. */
|
||||
|
||||
struct stk_trailer
|
||||
{
|
||||
long this_address; /* Address of this block. */
|
||||
long this_size; /* Size of this block (does not include
|
||||
this trailer). */
|
||||
long unknown2;
|
||||
long unknown3;
|
||||
long link; /* Address of trailer block of previous
|
||||
segment. */
|
||||
long unknown5;
|
||||
long unknown6;
|
||||
long unknown7;
|
||||
long unknown8;
|
||||
long unknown9;
|
||||
long unknown10;
|
||||
long unknown11;
|
||||
long unknown12;
|
||||
long unknown13;
|
||||
long unknown14;
|
||||
};
|
||||
|
||||
#endif /* CRAY2 */
|
||||
#endif /* not CRAY_STACK */
|
||||
|
||||
#ifdef CRAY2
|
||||
/* Determine a "stack measure" for an arbitrary ADDRESS.
|
||||
I doubt that "lint" will like this much. */
|
||||
|
||||
static long
|
||||
i00afunc (long *address)
|
||||
{
|
||||
struct stk_stat status;
|
||||
struct stk_trailer *trailer;
|
||||
long *block, size;
|
||||
long result = 0;
|
||||
|
||||
/* We want to iterate through all of the segments. The first
|
||||
step is to get the stack status structure. We could do this
|
||||
more quickly and more directly, perhaps, by referencing the
|
||||
$LM00 common block, but I know that this works. */
|
||||
|
||||
STKSTAT (&status);
|
||||
|
||||
/* Set up the iteration. */
|
||||
|
||||
trailer = (struct stk_trailer *) (status.current_address
|
||||
+ status.current_size
|
||||
- 15);
|
||||
|
||||
/* There must be at least one stack segment. Therefore it is
|
||||
a fatal error if "trailer" is null. */
|
||||
|
||||
if (trailer == 0)
|
||||
abort ();
|
||||
|
||||
/* Discard segments that do not contain our argument address. */
|
||||
|
||||
while (trailer != 0)
|
||||
{
|
||||
block = (long *) trailer->this_address;
|
||||
size = trailer->this_size;
|
||||
if (block == 0 || size == 0)
|
||||
abort ();
|
||||
trailer = (struct stk_trailer *) trailer->link;
|
||||
if ((block <= address) && (address < (block + size)))
|
||||
break;
|
||||
}
|
||||
|
||||
/* Set the result to the offset in this segment and add the sizes
|
||||
of all predecessor segments. */
|
||||
|
||||
result = address - block;
|
||||
|
||||
if (trailer == 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if (trailer->this_size <= 0)
|
||||
abort ();
|
||||
result += trailer->this_size;
|
||||
trailer = (struct stk_trailer *) trailer->link;
|
||||
}
|
||||
while (trailer != 0);
|
||||
|
||||
/* We are done. Note that if you present a bogus address (one
|
||||
not in any segment), you will get a different number back, formed
|
||||
from subtracting the address of the first block. This is probably
|
||||
not what you want. */
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
#else /* not CRAY2 */
|
||||
/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
|
||||
Determine the number of the cell within the stack,
|
||||
given the address of the cell. The purpose of this
|
||||
routine is to linearize, in some sense, stack addresses
|
||||
for alloca. */
|
||||
|
||||
static long
|
||||
i00afunc (long address)
|
||||
{
|
||||
long stkl = 0;
|
||||
|
||||
long size, pseg, this_segment, stack;
|
||||
long result = 0;
|
||||
|
||||
struct stack_segment_linkage *ssptr;
|
||||
|
||||
/* Register B67 contains the address of the end of the
|
||||
current stack segment. If you (as a subprogram) store
|
||||
your registers on the stack and find that you are past
|
||||
the contents of B67, you have overflowed the segment.
|
||||
|
||||
B67 also points to the stack segment linkage control
|
||||
area, which is what we are really interested in. */
|
||||
|
||||
stkl = CRAY_STACKSEG_END ();
|
||||
ssptr = (struct stack_segment_linkage *) stkl;
|
||||
|
||||
/* If one subtracts 'size' from the end of the segment,
|
||||
one has the address of the first word of the segment.
|
||||
|
||||
If this is not the first segment, 'pseg' will be
|
||||
nonzero. */
|
||||
|
||||
pseg = ssptr->sspseg;
|
||||
size = ssptr->sssize;
|
||||
|
||||
this_segment = stkl - size;
|
||||
|
||||
/* It is possible that calling this routine itself caused
|
||||
a stack overflow. Discard stack segments which do not
|
||||
contain the target address. */
|
||||
|
||||
while (!(this_segment <= address && address <= stkl))
|
||||
{
|
||||
#ifdef DEBUG_I00AFUNC
|
||||
fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
|
||||
#endif
|
||||
if (pseg == 0)
|
||||
break;
|
||||
stkl = stkl - pseg;
|
||||
ssptr = (struct stack_segment_linkage *) stkl;
|
||||
size = ssptr->sssize;
|
||||
pseg = ssptr->sspseg;
|
||||
this_segment = stkl - size;
|
||||
}
|
||||
|
||||
result = address - this_segment;
|
||||
|
||||
/* If you subtract pseg from the current end of the stack,
|
||||
you get the address of the previous stack segment's end.
|
||||
This seems a little convoluted to me, but I'll bet you save
|
||||
a cycle somewhere. */
|
||||
|
||||
while (pseg != 0)
|
||||
{
|
||||
#ifdef DEBUG_I00AFUNC
|
||||
fprintf (stderr, "%011o %011o\n", pseg, size);
|
||||
#endif
|
||||
stkl = stkl - pseg;
|
||||
ssptr = (struct stack_segment_linkage *) stkl;
|
||||
size = ssptr->sssize;
|
||||
pseg = ssptr->sspseg;
|
||||
result += size;
|
||||
}
|
||||
return (result);
|
||||
}
|
||||
|
||||
#endif /* not CRAY2 */
|
||||
#endif /* CRAY */
|
||||
|
||||
#endif /* no alloca */
|
||||
#endif /* not GCC version 2 */
|
||||
@@ -1,945 +0,0 @@
|
||||
/* copyout.c - create a cpio archive
|
||||
Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "filetypes.h"
|
||||
#include "system.h"
|
||||
#include "cpiohdr.h"
|
||||
#include "dstring.h"
|
||||
#include "extern.h"
|
||||
#include "defer.h"
|
||||
#include "rmt.h"
|
||||
|
||||
static unsigned long read_for_checksum ();
|
||||
static void tape_clear_rest_of_block ();
|
||||
static void tape_pad_output ();
|
||||
static int last_link ();
|
||||
static int count_defered_links_to_dev_ino ();
|
||||
static void add_link_defer ();
|
||||
static void writeout_other_defers ();
|
||||
static void writeout_final_defers();
|
||||
static void writeout_defered_file ();
|
||||
static int check_rdev ();
|
||||
|
||||
/* Write out header FILE_HDR, including the file name, to file
|
||||
descriptor OUT_DES. */
|
||||
|
||||
void
|
||||
write_out_header (file_hdr, out_des)
|
||||
struct new_cpio_header *file_hdr;
|
||||
int out_des;
|
||||
{
|
||||
if (archive_format == arf_newascii || archive_format == arf_crcascii)
|
||||
{
|
||||
char ascii_header[112];
|
||||
char *magic_string;
|
||||
|
||||
if (archive_format == arf_crcascii)
|
||||
magic_string = "070702";
|
||||
else
|
||||
magic_string = "070701";
|
||||
sprintf (ascii_header,
|
||||
"%6s%08lx%08lx%08lx%08lx%08lx%08lx%08lx%08lx%08lx%08lx%08lx%08lx%08lx",
|
||||
magic_string,
|
||||
file_hdr->c_ino, file_hdr->c_mode, file_hdr->c_uid,
|
||||
file_hdr->c_gid, file_hdr->c_nlink, file_hdr->c_mtime,
|
||||
file_hdr->c_filesize, file_hdr->c_dev_maj, file_hdr->c_dev_min,
|
||||
file_hdr->c_rdev_maj, file_hdr->c_rdev_min, file_hdr->c_namesize,
|
||||
file_hdr->c_chksum);
|
||||
tape_buffered_write (ascii_header, out_des, 110L);
|
||||
|
||||
/* Write file name to output. */
|
||||
tape_buffered_write (file_hdr->c_name, out_des, (long) file_hdr->c_namesize);
|
||||
tape_pad_output (out_des, file_hdr->c_namesize + 110);
|
||||
}
|
||||
else if (archive_format == arf_oldascii || archive_format == arf_hpoldascii)
|
||||
{
|
||||
char ascii_header[78];
|
||||
#ifndef __MSDOS__
|
||||
dev_t dev;
|
||||
dev_t rdev;
|
||||
|
||||
if (archive_format == arf_oldascii)
|
||||
{
|
||||
dev = makedev (file_hdr->c_dev_maj, file_hdr->c_dev_min);
|
||||
rdev = makedev (file_hdr->c_rdev_maj, file_hdr->c_rdev_min);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* HP/UX cpio creates archives that look just like ordinary archives,
|
||||
but for devices it sets major = 0, minor = 1, and puts the
|
||||
actual major/minor number in the filesize field. */
|
||||
switch (file_hdr->c_mode & CP_IFMT)
|
||||
{
|
||||
case CP_IFCHR:
|
||||
case CP_IFBLK:
|
||||
#ifdef CP_IFSOCK
|
||||
case CP_IFSOCK:
|
||||
#endif
|
||||
#ifdef CP_IFIFO
|
||||
case CP_IFIFO:
|
||||
#endif
|
||||
file_hdr->c_filesize = makedev (file_hdr->c_rdev_maj,
|
||||
file_hdr->c_rdev_min);
|
||||
rdev = 1;
|
||||
break;
|
||||
default:
|
||||
dev = makedev (file_hdr->c_dev_maj, file_hdr->c_dev_min);
|
||||
rdev = makedev (file_hdr->c_rdev_maj, file_hdr->c_rdev_min);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
int dev = 0, rdev = 0;
|
||||
#endif
|
||||
|
||||
if ((file_hdr->c_ino >> 16) != 0)
|
||||
error (0, 0, "%s: truncating inode number", file_hdr->c_name);
|
||||
|
||||
sprintf (ascii_header,
|
||||
"%06o%06o%06lo%06lo%06lo%06lo%06lo%06o%011lo%06lo%011lo",
|
||||
file_hdr->c_magic & 0xFFFF, dev & 0xFFFF,
|
||||
file_hdr->c_ino & 0xFFFF, file_hdr->c_mode & 0xFFFF,
|
||||
file_hdr->c_uid & 0xFFFF, file_hdr->c_gid & 0xFFFF,
|
||||
file_hdr->c_nlink & 0xFFFF, rdev & 0xFFFF,
|
||||
file_hdr->c_mtime, file_hdr->c_namesize & 0xFFFF,
|
||||
file_hdr->c_filesize);
|
||||
tape_buffered_write (ascii_header, out_des, 76L);
|
||||
|
||||
/* Write file name to output. */
|
||||
tape_buffered_write (file_hdr->c_name, out_des, (long) file_hdr->c_namesize);
|
||||
}
|
||||
else if (archive_format == arf_tar || archive_format == arf_ustar)
|
||||
{
|
||||
write_out_tar_header (file_hdr, out_des);
|
||||
}
|
||||
else
|
||||
{
|
||||
struct old_cpio_header short_hdr;
|
||||
|
||||
short_hdr.c_magic = 070707;
|
||||
short_hdr.c_dev = makedev (file_hdr->c_dev_maj, file_hdr->c_dev_min);
|
||||
|
||||
if ((file_hdr->c_ino >> 16) != 0)
|
||||
error (0, 0, "%s: truncating inode number", file_hdr->c_name);
|
||||
|
||||
short_hdr.c_ino = file_hdr->c_ino & 0xFFFF;
|
||||
short_hdr.c_mode = file_hdr->c_mode & 0xFFFF;
|
||||
short_hdr.c_uid = file_hdr->c_uid & 0xFFFF;
|
||||
short_hdr.c_gid = file_hdr->c_gid & 0xFFFF;
|
||||
short_hdr.c_nlink = file_hdr->c_nlink & 0xFFFF;
|
||||
if (archive_format != arf_hpbinary)
|
||||
short_hdr.c_rdev = makedev (file_hdr->c_rdev_maj, file_hdr->c_rdev_min);
|
||||
else
|
||||
{
|
||||
switch (file_hdr->c_mode & CP_IFMT)
|
||||
{
|
||||
/* HP/UX cpio creates archives that look just like ordinary
|
||||
archives, but for devices it sets major = 0, minor = 1, and
|
||||
puts the actual major/minor number in the filesize field. */
|
||||
case CP_IFCHR:
|
||||
case CP_IFBLK:
|
||||
#ifdef CP_IFSOCK
|
||||
case CP_IFSOCK:
|
||||
#endif
|
||||
#ifdef CP_IFIFO
|
||||
case CP_IFIFO:
|
||||
#endif
|
||||
file_hdr->c_filesize = makedev (file_hdr->c_rdev_maj,
|
||||
file_hdr->c_rdev_min);
|
||||
short_hdr.c_rdev = makedev (0, 1);
|
||||
break;
|
||||
default:
|
||||
short_hdr.c_rdev = makedev (file_hdr->c_rdev_maj,
|
||||
file_hdr->c_rdev_min);
|
||||
break;
|
||||
}
|
||||
}
|
||||
short_hdr.c_mtimes[0] = file_hdr->c_mtime >> 16;
|
||||
short_hdr.c_mtimes[1] = file_hdr->c_mtime & 0xFFFF;
|
||||
|
||||
short_hdr.c_namesize = file_hdr->c_namesize & 0xFFFF;
|
||||
|
||||
short_hdr.c_filesizes[0] = file_hdr->c_filesize >> 16;
|
||||
short_hdr.c_filesizes[1] = file_hdr->c_filesize & 0xFFFF;
|
||||
|
||||
/* Output the file header. */
|
||||
tape_buffered_write ((char *) &short_hdr, out_des, 26L);
|
||||
|
||||
/* Write file name to output. */
|
||||
tape_buffered_write (file_hdr->c_name, out_des, (long) file_hdr->c_namesize);
|
||||
|
||||
tape_pad_output (out_des, file_hdr->c_namesize + 26);
|
||||
}
|
||||
}
|
||||
|
||||
/* Read a list of file names from the standard input
|
||||
and write a cpio collection on the standard output.
|
||||
The format of the header depends on the compatibility (-c) flag. */
|
||||
|
||||
void
|
||||
process_copy_out ()
|
||||
{
|
||||
int res; /* Result of functions. */
|
||||
dynamic_string input_name; /* Name of file read from stdin. */
|
||||
struct utimbuf times; /* For resetting file times after copy. */
|
||||
struct stat file_stat; /* Stat record for file. */
|
||||
struct new_cpio_header file_hdr; /* Output header information. */
|
||||
int in_file_des; /* Source file descriptor. */
|
||||
int out_file_des; /* Output file descriptor. */
|
||||
char *p;
|
||||
|
||||
/* Initialize the copy out. */
|
||||
ds_init (&input_name, 128);
|
||||
/* Initialize this in case it has members we don't know to set. */
|
||||
bzero (×, sizeof (struct utimbuf));
|
||||
file_hdr.c_magic = 070707;
|
||||
|
||||
#ifdef __MSDOS__
|
||||
setmode (archive_des, O_BINARY);
|
||||
#endif
|
||||
/* Check whether the output file might be a tape. */
|
||||
out_file_des = archive_des;
|
||||
if (_isrmt (out_file_des))
|
||||
{
|
||||
output_is_special = 1;
|
||||
output_is_seekable = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fstat (out_file_des, &file_stat))
|
||||
error (1, errno, "standard output is closed");
|
||||
output_is_special =
|
||||
#ifdef S_ISBLK
|
||||
S_ISBLK (file_stat.st_mode) ||
|
||||
#endif
|
||||
S_ISCHR (file_stat.st_mode);
|
||||
output_is_seekable = S_ISREG (file_stat.st_mode);
|
||||
}
|
||||
|
||||
if (append_flag)
|
||||
{
|
||||
process_copy_in ();
|
||||
prepare_append (out_file_des);
|
||||
}
|
||||
|
||||
/* Copy files with names read from stdin. */
|
||||
while (ds_fgetstr (stdin, &input_name, name_end) != NULL)
|
||||
{
|
||||
/* Check for blank line. */
|
||||
if (input_name.ds_string[0] == 0)
|
||||
{
|
||||
error (0, 0, "blank line ignored");
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Process next file. */
|
||||
if ((*xstat) (input_name.ds_string, &file_stat) < 0)
|
||||
error (0, errno, "%s", input_name.ds_string);
|
||||
else
|
||||
{
|
||||
/* Set values in output header. */
|
||||
file_hdr.c_dev_maj = major (file_stat.st_dev);
|
||||
file_hdr.c_dev_min = minor (file_stat.st_dev);
|
||||
file_hdr.c_ino = file_stat.st_ino;
|
||||
/* For POSIX systems that don't define the S_IF macros,
|
||||
we can't assume that S_ISfoo means the standard Unix
|
||||
S_IFfoo bit(s) are set. So do it manually, with a
|
||||
different name. Bleah. */
|
||||
file_hdr.c_mode = (file_stat.st_mode & 07777);
|
||||
if (S_ISREG (file_stat.st_mode))
|
||||
file_hdr.c_mode |= CP_IFREG;
|
||||
else if (S_ISDIR (file_stat.st_mode))
|
||||
file_hdr.c_mode |= CP_IFDIR;
|
||||
#ifdef S_ISBLK
|
||||
else if (S_ISBLK (file_stat.st_mode))
|
||||
file_hdr.c_mode |= CP_IFBLK;
|
||||
#endif
|
||||
#ifdef S_ISCHR
|
||||
else if (S_ISCHR (file_stat.st_mode))
|
||||
file_hdr.c_mode |= CP_IFCHR;
|
||||
#endif
|
||||
#ifdef S_ISFIFO
|
||||
else if (S_ISFIFO (file_stat.st_mode))
|
||||
file_hdr.c_mode |= CP_IFIFO;
|
||||
#endif
|
||||
#ifdef S_ISLNK
|
||||
else if (S_ISLNK (file_stat.st_mode))
|
||||
file_hdr.c_mode |= CP_IFLNK;
|
||||
#endif
|
||||
#ifdef S_ISSOCK
|
||||
else if (S_ISSOCK (file_stat.st_mode))
|
||||
file_hdr.c_mode |= CP_IFSOCK;
|
||||
#endif
|
||||
#ifdef S_ISNWK
|
||||
else if (S_ISNWK (file_stat.st_mode))
|
||||
file_hdr.c_mode |= CP_IFNWK;
|
||||
#endif
|
||||
file_hdr.c_uid = file_stat.st_uid;
|
||||
file_hdr.c_gid = file_stat.st_gid;
|
||||
file_hdr.c_nlink = file_stat.st_nlink;
|
||||
|
||||
/* The rdev is meaningless except for block and character
|
||||
special files (POSIX standard) and perhaps fifos and
|
||||
sockets. Clear it for other types of files so that
|
||||
check_rdev() doesn't reject files just because stat()
|
||||
put garbage in st_rdev and so that the output doesn't
|
||||
depend on the garbage. */
|
||||
switch (file_hdr.c_mode & CP_IFMT)
|
||||
{
|
||||
case CP_IFBLK:
|
||||
case CP_IFCHR:
|
||||
#ifdef CP_IFIFO
|
||||
case CP_IFIFO:
|
||||
#endif
|
||||
#ifdef CP_IFSOCK
|
||||
case CP_IFSOCK:
|
||||
#endif
|
||||
file_hdr.c_rdev_maj = major (file_stat.st_rdev);
|
||||
file_hdr.c_rdev_min = minor (file_stat.st_rdev);
|
||||
break;
|
||||
default:
|
||||
file_hdr.c_rdev_maj = 0;
|
||||
file_hdr.c_rdev_min = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
file_hdr.c_mtime = file_stat.st_mtime;
|
||||
file_hdr.c_filesize = file_stat.st_size;
|
||||
file_hdr.c_chksum = 0;
|
||||
file_hdr.c_tar_linkname = NULL;
|
||||
|
||||
/* Strip leading `./' from the filename. */
|
||||
p = input_name.ds_string;
|
||||
while (*p == '.' && *(p + 1) == '/')
|
||||
{
|
||||
++p;
|
||||
while (*p == '/')
|
||||
++p;
|
||||
}
|
||||
#ifndef HPUX_CDF
|
||||
file_hdr.c_name = p;
|
||||
file_hdr.c_namesize = strlen (p) + 1;
|
||||
#else
|
||||
if ( (archive_format != arf_tar) && (archive_format != arf_ustar) )
|
||||
{
|
||||
/* We mark CDF's in cpio files by adding a 2nd `/' after the
|
||||
"hidden" directory name. We need to do this so we can
|
||||
properly recreate the directory as hidden (in case the
|
||||
files of a directory go into the archive before the
|
||||
directory itself (e.g from "find ... -depth ... | cpio")). */
|
||||
file_hdr.c_name = add_cdf_double_slashes (p);
|
||||
file_hdr.c_namesize = strlen (file_hdr.c_name) + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We don't mark CDF's in tar files. We assume the "hidden"
|
||||
directory will always go into the archive before any of
|
||||
its files. */
|
||||
file_hdr.c_name = p;
|
||||
file_hdr.c_namesize = strlen (p) + 1;
|
||||
}
|
||||
#endif
|
||||
if ((archive_format == arf_tar || archive_format == arf_ustar)
|
||||
&& is_tar_filename_too_long (file_hdr.c_name))
|
||||
{
|
||||
error (0, 0, "%s: file name too long", file_hdr.c_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (check_rdev (&file_hdr))
|
||||
{
|
||||
case 1:
|
||||
error (0, 0, "%s not dumped: major number would be truncated",
|
||||
file_hdr.c_name);
|
||||
continue;
|
||||
case 2:
|
||||
error (0, 0, "%s not dumped: minor number would be truncated",
|
||||
file_hdr.c_name);
|
||||
continue;
|
||||
case 4:
|
||||
error (0, 0, "%s not dumped: device number would be truncated",
|
||||
file_hdr.c_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
/* Copy the named file to the output. */
|
||||
switch (file_hdr.c_mode & CP_IFMT)
|
||||
{
|
||||
case CP_IFREG:
|
||||
#ifndef __MSDOS__
|
||||
if (archive_format == arf_tar || archive_format == arf_ustar)
|
||||
{
|
||||
char *otherfile;
|
||||
if ((otherfile = find_inode_file (file_hdr.c_ino,
|
||||
file_hdr.c_dev_maj,
|
||||
file_hdr.c_dev_min)))
|
||||
{
|
||||
file_hdr.c_tar_linkname = otherfile;
|
||||
write_out_header (&file_hdr, out_file_des);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( (archive_format == arf_newascii || archive_format == arf_crcascii)
|
||||
&& (file_hdr.c_nlink > 1) )
|
||||
{
|
||||
if (last_link (&file_hdr) )
|
||||
{
|
||||
writeout_other_defers (&file_hdr, out_file_des);
|
||||
}
|
||||
else
|
||||
{
|
||||
add_link_defer (&file_hdr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
in_file_des = open (input_name.ds_string,
|
||||
O_RDONLY | O_BINARY, 0);
|
||||
if (in_file_des < 0)
|
||||
{
|
||||
error (0, errno, "%s", input_name.ds_string);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (archive_format == arf_crcascii)
|
||||
file_hdr.c_chksum = read_for_checksum (in_file_des,
|
||||
file_hdr.c_filesize,
|
||||
input_name.ds_string);
|
||||
|
||||
write_out_header (&file_hdr, out_file_des);
|
||||
copy_files_disk_to_tape (in_file_des, out_file_des, file_hdr.c_filesize, input_name.ds_string);
|
||||
|
||||
#ifndef __MSDOS__
|
||||
if (archive_format == arf_tar || archive_format == arf_ustar)
|
||||
add_inode (file_hdr.c_ino, file_hdr.c_name, file_hdr.c_dev_maj,
|
||||
file_hdr.c_dev_min);
|
||||
#endif
|
||||
|
||||
tape_pad_output (out_file_des, file_hdr.c_filesize);
|
||||
|
||||
if (close (in_file_des) < 0)
|
||||
error (0, errno, "%s", input_name.ds_string);
|
||||
if (reset_time_flag)
|
||||
{
|
||||
times.actime = file_stat.st_atime;
|
||||
times.modtime = file_stat.st_mtime;
|
||||
if (utime (file_hdr.c_name, ×) < 0)
|
||||
error (0, errno, "%s", file_hdr.c_name);
|
||||
}
|
||||
break;
|
||||
|
||||
case CP_IFDIR:
|
||||
file_hdr.c_filesize = 0;
|
||||
write_out_header (&file_hdr, out_file_des);
|
||||
break;
|
||||
|
||||
#ifndef __MSDOS__
|
||||
case CP_IFCHR:
|
||||
case CP_IFBLK:
|
||||
#ifdef CP_IFSOCK
|
||||
case CP_IFSOCK:
|
||||
#endif
|
||||
#ifdef CP_IFIFO
|
||||
case CP_IFIFO:
|
||||
#endif
|
||||
if (archive_format == arf_tar)
|
||||
{
|
||||
error (0, 0, "%s not dumped: not a regular file",
|
||||
file_hdr.c_name);
|
||||
continue;
|
||||
}
|
||||
else if (archive_format == arf_ustar)
|
||||
{
|
||||
char *otherfile;
|
||||
if ((otherfile = find_inode_file (file_hdr.c_ino,
|
||||
file_hdr.c_dev_maj,
|
||||
file_hdr.c_dev_min)))
|
||||
{
|
||||
/* This file is linked to another file already in the
|
||||
archive, so write it out as a hard link. */
|
||||
file_hdr.c_mode = (file_stat.st_mode & 07777);
|
||||
file_hdr.c_mode |= CP_IFREG;
|
||||
file_hdr.c_tar_linkname = otherfile;
|
||||
write_out_header (&file_hdr, out_file_des);
|
||||
break;
|
||||
}
|
||||
add_inode (file_hdr.c_ino, file_hdr.c_name,
|
||||
file_hdr.c_dev_maj, file_hdr.c_dev_min);
|
||||
}
|
||||
file_hdr.c_filesize = 0;
|
||||
write_out_header (&file_hdr, out_file_des);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CP_IFLNK
|
||||
case CP_IFLNK:
|
||||
{
|
||||
char *link_name = (char *) xmalloc (file_stat.st_size + 1);
|
||||
int link_size;
|
||||
|
||||
link_size = readlink (input_name.ds_string, link_name,
|
||||
file_stat.st_size);
|
||||
if (link_size < 0)
|
||||
{
|
||||
error (0, errno, "%s", input_name.ds_string);
|
||||
free (link_name);
|
||||
continue;
|
||||
}
|
||||
file_hdr.c_filesize = link_size;
|
||||
if (archive_format == arf_tar || archive_format == arf_ustar)
|
||||
{
|
||||
if (link_size + 1 > 100)
|
||||
{
|
||||
error (0, 0, "%s: symbolic link too long",
|
||||
file_hdr.c_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
link_name[link_size] = '\0';
|
||||
file_hdr.c_tar_linkname = link_name;
|
||||
write_out_header (&file_hdr, out_file_des);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
write_out_header (&file_hdr, out_file_des);
|
||||
tape_buffered_write (link_name, out_file_des, link_size);
|
||||
tape_pad_output (out_file_des, link_size);
|
||||
}
|
||||
free (link_name);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
error (0, 0, "%s: unknown file type", input_name.ds_string);
|
||||
}
|
||||
|
||||
if (verbose_flag)
|
||||
fprintf (stderr, "%s\n", input_name.ds_string);
|
||||
if (dot_flag)
|
||||
fputc ('.', stderr);
|
||||
}
|
||||
}
|
||||
|
||||
writeout_final_defers(out_file_des);
|
||||
/* The collection is complete; append the trailer. */
|
||||
file_hdr.c_ino = 0;
|
||||
file_hdr.c_mode = 0;
|
||||
file_hdr.c_uid = 0;
|
||||
file_hdr.c_gid = 0;
|
||||
file_hdr.c_nlink = 1; /* Must be 1 for crc format. */
|
||||
file_hdr.c_dev_maj = 0;
|
||||
file_hdr.c_dev_min = 0;
|
||||
file_hdr.c_rdev_maj = 0;
|
||||
file_hdr.c_rdev_min = 0;
|
||||
file_hdr.c_mtime = 0;
|
||||
file_hdr.c_chksum = 0;
|
||||
|
||||
file_hdr.c_filesize = 0;
|
||||
file_hdr.c_namesize = 11;
|
||||
file_hdr.c_name = "TRAILER!!!";
|
||||
if (archive_format != arf_tar && archive_format != arf_ustar)
|
||||
write_out_header (&file_hdr, out_file_des);
|
||||
else
|
||||
{
|
||||
tape_buffered_write (zeros_512, out_file_des, 512);
|
||||
tape_buffered_write (zeros_512, out_file_des, 512);
|
||||
}
|
||||
|
||||
/* Fill up the output block. */
|
||||
tape_clear_rest_of_block (out_file_des);
|
||||
tape_empty_output_buffer (out_file_des);
|
||||
if (dot_flag)
|
||||
fputc ('\n', stderr);
|
||||
if (!quiet_flag)
|
||||
{
|
||||
res = (output_bytes + io_block_size - 1) / io_block_size;
|
||||
if (res == 1)
|
||||
fprintf (stderr, "1 block\n");
|
||||
else
|
||||
fprintf (stderr, "%d blocks\n", res);
|
||||
}
|
||||
}
|
||||
|
||||
/* Read FILE_SIZE bytes of FILE_NAME from IN_FILE_DES and
|
||||
compute and return a checksum for them. */
|
||||
|
||||
static unsigned long
|
||||
read_for_checksum (in_file_des, file_size, file_name)
|
||||
int in_file_des;
|
||||
int file_size;
|
||||
char *file_name;
|
||||
{
|
||||
unsigned long crc;
|
||||
char buf[BUFSIZ];
|
||||
int bytes_left;
|
||||
int bytes_read;
|
||||
int i;
|
||||
|
||||
crc = 0;
|
||||
|
||||
for (bytes_left = file_size; bytes_left > 0; bytes_left -= bytes_read)
|
||||
{
|
||||
bytes_read = read (in_file_des, buf, BUFSIZ);
|
||||
if (bytes_read < 0)
|
||||
error (1, errno, "cannot read checksum for %s", file_name);
|
||||
if (bytes_read == 0)
|
||||
break;
|
||||
for (i = 0; i < bytes_read; ++i)
|
||||
crc += buf[i] & 0xff;
|
||||
}
|
||||
if (lseek (in_file_des, 0L, SEEK_SET))
|
||||
error (1, errno, "cannot read checksum for %s", file_name);
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
/* Write out NULs to fill out the rest of the current block on
|
||||
OUT_FILE_DES. */
|
||||
|
||||
static void
|
||||
tape_clear_rest_of_block (out_file_des)
|
||||
int out_file_des;
|
||||
{
|
||||
while (output_size < io_block_size)
|
||||
{
|
||||
if ((io_block_size - output_size) > 512)
|
||||
tape_buffered_write (zeros_512, out_file_des, 512);
|
||||
else
|
||||
tape_buffered_write (zeros_512, out_file_des, io_block_size - output_size);
|
||||
}
|
||||
}
|
||||
|
||||
/* Write NULs on OUT_FILE_DES to move from OFFSET (the current location)
|
||||
to the end of the header. */
|
||||
|
||||
static void
|
||||
tape_pad_output (out_file_des, offset)
|
||||
int out_file_des;
|
||||
int offset;
|
||||
{
|
||||
int pad;
|
||||
|
||||
if (archive_format == arf_newascii || archive_format == arf_crcascii)
|
||||
pad = (4 - (offset % 4)) % 4;
|
||||
else if (archive_format == arf_tar || archive_format == arf_ustar)
|
||||
pad = (512 - (offset % 512)) % 512;
|
||||
else if (archive_format != arf_oldascii && archive_format != arf_hpoldascii)
|
||||
pad = (2 - (offset % 2)) % 2;
|
||||
else
|
||||
pad = 0;
|
||||
|
||||
if (pad != 0)
|
||||
tape_buffered_write (zeros_512, out_file_des, pad);
|
||||
}
|
||||
|
||||
|
||||
/* When creating newc and crc archives if a file has multiple (hard)
|
||||
links, we don't put any of them into the archive until we have seen
|
||||
all of them (or until we get to the end of the list of files that
|
||||
are going into the archive and know that we have seen all of the links
|
||||
to the file that we will see). We keep these "defered" files on
|
||||
this list. */
|
||||
|
||||
struct deferment *deferouts = NULL;
|
||||
|
||||
|
||||
/* Is this file_hdr the last (hard) link to a file? I.e., have
|
||||
we already seen and defered all of the other links? */
|
||||
|
||||
static int
|
||||
last_link (file_hdr)
|
||||
struct new_cpio_header *file_hdr;
|
||||
{
|
||||
int other_files_sofar;
|
||||
|
||||
other_files_sofar = count_defered_links_to_dev_ino (file_hdr);
|
||||
if (file_hdr->c_nlink == (other_files_sofar + 1) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Count the number of other (hard) links to this file that have
|
||||
already been defered. */
|
||||
|
||||
static int
|
||||
count_defered_links_to_dev_ino (file_hdr)
|
||||
struct new_cpio_header *file_hdr;
|
||||
{
|
||||
struct deferment *d;
|
||||
int ino;
|
||||
int maj;
|
||||
int min;
|
||||
int count;
|
||||
ino = file_hdr->c_ino;
|
||||
maj = file_hdr->c_dev_maj;
|
||||
min = file_hdr->c_dev_min;
|
||||
count = 0;
|
||||
for (d = deferouts; d != NULL; d = d->next)
|
||||
{
|
||||
if ( (d->header.c_ino == ino) && (d->header.c_dev_maj == maj)
|
||||
&& (d->header.c_dev_min == min) )
|
||||
++count;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
/* Add the file header for a link that is being defered to the deferouts
|
||||
list. */
|
||||
|
||||
static void
|
||||
add_link_defer (file_hdr)
|
||||
struct new_cpio_header *file_hdr;
|
||||
{
|
||||
struct deferment *d;
|
||||
d = create_deferment (file_hdr);
|
||||
d->next = deferouts;
|
||||
deferouts = d;
|
||||
}
|
||||
|
||||
/* We are about to put a file into a newc or crc archive that is
|
||||
multiply linked. We have already seen and defered all of the
|
||||
other links to the file but haven't written them into the archive.
|
||||
Write the other links into the archive, and remove them from the
|
||||
deferouts list. */
|
||||
|
||||
static void
|
||||
writeout_other_defers (file_hdr, out_des)
|
||||
struct new_cpio_header *file_hdr;
|
||||
int out_des;
|
||||
{
|
||||
struct deferment *d;
|
||||
struct deferment *d_prev;
|
||||
int ino;
|
||||
int maj;
|
||||
int min;
|
||||
ino = file_hdr->c_ino;
|
||||
maj = file_hdr->c_dev_maj;
|
||||
min = file_hdr->c_dev_min;
|
||||
d_prev = NULL;
|
||||
d = deferouts;
|
||||
while (d != NULL)
|
||||
{
|
||||
if ( (d->header.c_ino == ino) && (d->header.c_dev_maj == maj)
|
||||
&& (d->header.c_dev_min == min) )
|
||||
{
|
||||
struct deferment *d_free;
|
||||
d->header.c_filesize = 0;
|
||||
write_out_header (&d->header, out_des);
|
||||
if (d_prev != NULL)
|
||||
d_prev->next = d->next;
|
||||
else
|
||||
deferouts = d->next;
|
||||
d_free = d;
|
||||
d = d->next;
|
||||
free_deferment (d_free);
|
||||
}
|
||||
else
|
||||
{
|
||||
d_prev = d;
|
||||
d = d->next;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
/* When writing newc and crc format archives we defer multiply linked
|
||||
files until we have seen all of the links to the file. If a file
|
||||
has links to it that aren't going into the archive, then we will
|
||||
never see the "last" link to the file, so at the end we just write
|
||||
all of the leftover defered files into the archive. */
|
||||
|
||||
static void
|
||||
writeout_final_defers(out_des)
|
||||
int out_des;
|
||||
{
|
||||
struct deferment *d;
|
||||
int other_count;
|
||||
while (deferouts != NULL)
|
||||
{
|
||||
d = deferouts;
|
||||
other_count = count_defered_links_to_dev_ino (&d->header);
|
||||
if (other_count == 1)
|
||||
{
|
||||
writeout_defered_file (&d->header, out_des);
|
||||
}
|
||||
else
|
||||
{
|
||||
struct new_cpio_header file_hdr;
|
||||
file_hdr = d->header;
|
||||
file_hdr.c_filesize = 0;
|
||||
write_out_header (&file_hdr, out_des);
|
||||
}
|
||||
deferouts = deferouts->next;
|
||||
}
|
||||
}
|
||||
|
||||
/* Write a file into the archive. This code is the same as
|
||||
the code in process_copy_out(), but we need it here too
|
||||
for writeout_final_defers() to call. */
|
||||
|
||||
static void
|
||||
writeout_defered_file (header, out_file_des)
|
||||
struct new_cpio_header *header;
|
||||
int out_file_des;
|
||||
{
|
||||
int in_file_des;
|
||||
struct new_cpio_header file_hdr;
|
||||
struct utimbuf times; /* For setting file times. */
|
||||
/* Initialize this in case it has members we don't know to set. */
|
||||
bzero (×, sizeof (struct utimbuf));
|
||||
|
||||
file_hdr = *header;
|
||||
|
||||
|
||||
in_file_des = open (header->c_name,
|
||||
O_RDONLY | O_BINARY, 0);
|
||||
if (in_file_des < 0)
|
||||
{
|
||||
error (0, errno, "%s", header->c_name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (archive_format == arf_crcascii)
|
||||
file_hdr.c_chksum = read_for_checksum (in_file_des,
|
||||
file_hdr.c_filesize,
|
||||
header->c_name);
|
||||
|
||||
write_out_header (&file_hdr, out_file_des);
|
||||
copy_files_disk_to_tape (in_file_des, out_file_des, file_hdr.c_filesize, header->c_name);
|
||||
|
||||
#ifndef __MSDOS__
|
||||
if (archive_format == arf_tar || archive_format == arf_ustar)
|
||||
add_inode (file_hdr.c_ino, file_hdr.c_name, file_hdr.c_dev_maj,
|
||||
file_hdr.c_dev_min);
|
||||
#endif
|
||||
|
||||
tape_pad_output (out_file_des, file_hdr.c_filesize);
|
||||
|
||||
if (close (in_file_des) < 0)
|
||||
error (0, errno, "%s", header->c_name);
|
||||
if (reset_time_flag)
|
||||
{
|
||||
times.actime = file_hdr.c_mtime;
|
||||
times.modtime = file_hdr.c_mtime;
|
||||
if (utime (file_hdr.c_name, ×) < 0)
|
||||
error (0, errno, "%s", file_hdr.c_name);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
check_rdev (file_hdr)
|
||||
struct new_cpio_header *file_hdr;
|
||||
{
|
||||
if (archive_format == arf_newascii || archive_format == arf_crcascii)
|
||||
{
|
||||
if ((file_hdr->c_rdev_maj & 0xFFFFFFFF) != file_hdr->c_rdev_maj)
|
||||
return 1;
|
||||
if ((file_hdr->c_rdev_min & 0xFFFFFFFF) != file_hdr->c_rdev_min)
|
||||
return 2;
|
||||
}
|
||||
else if (archive_format == arf_oldascii || archive_format == arf_hpoldascii)
|
||||
{
|
||||
#ifndef __MSDOS__
|
||||
dev_t rdev;
|
||||
|
||||
rdev = makedev (file_hdr->c_rdev_maj, file_hdr->c_rdev_min);
|
||||
if (archive_format == arf_oldascii)
|
||||
{
|
||||
if ((rdev & 0xFFFF) != rdev)
|
||||
return 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (file_hdr->c_mode & CP_IFMT)
|
||||
{
|
||||
case CP_IFCHR:
|
||||
case CP_IFBLK:
|
||||
#ifdef CP_IFSOCK
|
||||
case CP_IFSOCK:
|
||||
#endif
|
||||
#ifdef CP_IFIFO
|
||||
case CP_IFIFO:
|
||||
#endif
|
||||
/* We could handle one more bit if longs are >= 33 bits. */
|
||||
if ((rdev & 037777777777) != rdev)
|
||||
return 4;
|
||||
break;
|
||||
default:
|
||||
if ((rdev & 0xFFFF) != rdev)
|
||||
return 4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else if (archive_format == arf_tar || archive_format == arf_ustar)
|
||||
{
|
||||
/* The major and minor formats are limited to 7 octal digits in ustar
|
||||
format, and to_oct () adds a gratuitous trailing blank to further
|
||||
limit the format to 6 octal digits. */
|
||||
if ((file_hdr->c_rdev_maj & 0777777) != file_hdr->c_rdev_maj)
|
||||
return 1;
|
||||
if ((file_hdr->c_rdev_min & 0777777) != file_hdr->c_rdev_min)
|
||||
return 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifndef __MSDOS__
|
||||
dev_t rdev;
|
||||
|
||||
rdev = makedev (file_hdr->c_rdev_maj, file_hdr->c_rdev_min);
|
||||
if (archive_format != arf_hpbinary)
|
||||
{
|
||||
if ((rdev & 0xFFFF) != rdev)
|
||||
return 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (file_hdr->c_mode & CP_IFMT)
|
||||
{
|
||||
case CP_IFCHR:
|
||||
case CP_IFBLK:
|
||||
#ifdef CP_IFSOCK
|
||||
case CP_IFSOCK:
|
||||
#endif
|
||||
#ifdef CP_IFIFO
|
||||
case CP_IFIFO:
|
||||
#endif
|
||||
if ((rdev & 0xFFFFFFFF) != rdev)
|
||||
return 4;
|
||||
file_hdr->c_filesize = rdev;
|
||||
rdev = makedev (0, 1);
|
||||
break;
|
||||
default:
|
||||
if ((rdev & 0xFFFF) != rdev)
|
||||
return 4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,328 +0,0 @@
|
||||
.TH CPIO 1L \" -*- nroff -*-
|
||||
.SH NAME
|
||||
cpio \- copy files to and from archives
|
||||
.SH SYNOPSIS
|
||||
.B cpio
|
||||
{\-o|\-\-create} [\-0acvABLV] [\-C bytes] [\-H format] [\-M message]
|
||||
[\-O [[user@]host:]archive] [\-F [[user@]host:]archive]
|
||||
[\-\-file=[[user@]host:]archive] [\-\-format=format] [\-\-message=message]
|
||||
[\-\-null] [\-\-reset-access-time] [\-\-verbose] [\-\-dot] [\-\-append]
|
||||
[\-\-block-size=blocks] [\-\-dereference] [\-\-io-size=bytes] [\-\-quiet]
|
||||
[\-\-force\-local] [\-\-help] [\-\-version] < name-list [> archive]
|
||||
|
||||
.B cpio
|
||||
{\-i|\-\-extract} [\-bcdfmnrtsuvBSV] [\-C bytes] [\-E file] [\-H format]
|
||||
[\-M message] [\-R [user][:.][group]] [\-I [[user@]host:]archive]
|
||||
[\-F [[user@]host:]archive] [\-\-file=[[user@]host:]archive]
|
||||
[\-\-make-directories] [\-\-nonmatching] [\-\-preserve-modification-time]
|
||||
[\-\-numeric-uid-gid] [\-\-rename] [\-\-list] [\-\-swap-bytes] [\-\-swap] [\-\-dot]
|
||||
[\-\-unconditional] [\-\-verbose] [\-\-block-size=blocks] [\-\-swap-halfwords]
|
||||
[\-\-io-size=bytes] [\-\-pattern-file=file] [\-\-format=format]
|
||||
[\-\-owner=[user][:.][group]] [\-\-no-preserve-owner] [\-\-message=message]
|
||||
[\-\-force\-local] [\-\-no\-absolute\-filenames] [\-\-sparse] [\-\-only\-verify\-crc]
|
||||
[\-\-quiet] [\-\-help] [\-\-version] [pattern...] [< archive]
|
||||
|
||||
.B cpio
|
||||
{\-p|\-\-pass-through} [\-0adlmuvLV] [\-R [user][:.][group]]
|
||||
[\-\-null] [\-\-reset-access-time] [\-\-make-directories] [\-\-link] [\-\-quiet]
|
||||
[\-\-preserve-modification-time] [\-\-unconditional] [\-\-verbose] [\-\-dot]
|
||||
[\-\-dereference] [\-\-owner=[user][:.][group]] [\-\-no-preserve-owner]
|
||||
[\-\-sparse] [\-\-help] [\-\-version] destination-directory < name-list
|
||||
.SH DESCRIPTION
|
||||
This manual page
|
||||
documents the GNU version of
|
||||
.BR cpio .
|
||||
.B cpio
|
||||
copies files into or out of a cpio or tar archive, which is a file that
|
||||
contains other files plus information about them, such as their
|
||||
file name, owner, timestamps, and access permissions. The archive can
|
||||
be another file on the disk, a magnetic tape, or a pipe.
|
||||
.B cpio
|
||||
has three operating modes.
|
||||
.PP
|
||||
In copy-out mode,
|
||||
.B cpio
|
||||
copies files into an archive. It reads a list of filenames, one per
|
||||
line, on the standard input, and writes the archive onto the standard
|
||||
output. A typical way to generate the list of filenames is with the
|
||||
.B find
|
||||
command; you should give
|
||||
.B find
|
||||
the \-d option to minimize problems with permissions on
|
||||
directories that are unwritable or not searchable.
|
||||
.PP
|
||||
In copy-in mode,
|
||||
.B cpio
|
||||
copies files out of an archive or lists the archive contents. It
|
||||
reads the archive from the standard input. Any non-option command
|
||||
line arguments are shell globbing patterns; only files in the archive
|
||||
whose names match one or more of those patterns are copied from the
|
||||
archive. Unlike in the shell, an initial `.' in a filename does
|
||||
match a wildcard at the start of a pattern, and a `/' in a filename
|
||||
can match wildcards. If no patterns are given, all files are
|
||||
extracted.
|
||||
.PP
|
||||
In copy-pass mode,
|
||||
.B cpio
|
||||
copies files from one directory tree to another, combining the
|
||||
copy-out and copy-in steps without actually using an archive.
|
||||
It reads the list of files to copy from the standard input; the
|
||||
directory into which it will copy them is given as a non-option
|
||||
argument.
|
||||
.PP
|
||||
.B cpio
|
||||
supports the following archive formats: binary, old ASCII, new
|
||||
ASCII, crc, HPUX binary, HPUX old ASCII, old tar, and POSIX.1 tar.
|
||||
The binary format
|
||||
is obsolete because it encodes information about the files in a way
|
||||
that is not portable between different machine architectures.
|
||||
The old ASCII format is portable between different machine architectures,
|
||||
but should not be used on file systems with more than 65536 i-nodes.
|
||||
The new ASCII format is portable between different machine architectures
|
||||
and can be used on any size file system, but is not supported by all
|
||||
versions of
|
||||
.BR cpio ;
|
||||
currently, it is only supported by GNU and Unix System V R4.
|
||||
The crc format is
|
||||
like the new ASCII format, but also contains a checksum for each file
|
||||
which
|
||||
.B cpio
|
||||
calculates when creating an archive
|
||||
and verifies when the file is extracted from the archive.
|
||||
The HPUX formats are provided for compatibility with HPUX's cpio which
|
||||
stores device files differently.
|
||||
.PP
|
||||
The tar format is provided for compatibility with
|
||||
the
|
||||
.B tar
|
||||
program. It can not be used to archive files with names
|
||||
longer than 100 characters, and can not be used to archive "special"
|
||||
(block or character devices) files.
|
||||
The POSIX.1 tar format can not be used to archive files with names longer
|
||||
than 255 characters (less unless they have a "/" in just the right place).
|
||||
.PP
|
||||
By default,
|
||||
.B cpio
|
||||
creates binary format archives, for compatibility with
|
||||
older
|
||||
.B cpio
|
||||
programs.
|
||||
When extracting from archives,
|
||||
.B cpio
|
||||
automatically recognizes which kind of archive it is reading and can
|
||||
read archives created on machines with a different byte-order.
|
||||
.PP
|
||||
Some of the options to
|
||||
.B cpio
|
||||
apply only to certain operating modes; see the SYNOPSIS section for a
|
||||
list of which options are allowed in which modes.
|
||||
.SS OPTIONS
|
||||
.TP
|
||||
.I "\-0, \-\-null"
|
||||
In copy-out and copy-pass modes, read a list of filenames terminated
|
||||
by a null character instead of a newline, so that files whose names
|
||||
contain newlines can be archived. GNU
|
||||
.B find
|
||||
is one way to produce a list of null-terminated filenames.
|
||||
.TP
|
||||
.I "\-a, \-\-reset-access-time"
|
||||
Reset the access times of files after reading them, so that it does
|
||||
not look like they have just been read.
|
||||
.TP
|
||||
.I "\-A, \-\-append"
|
||||
Append to an existing archive. Only works in copy-out mode. The
|
||||
archive must be a disk file specified with the
|
||||
.I \-O
|
||||
or
|
||||
.I "\-F (\-\-file)"
|
||||
option.
|
||||
.TP
|
||||
.I "\-b, \-\-swap"
|
||||
In copy-in mode, swap both halfwords of words and bytes of halfwords
|
||||
in the data. Equivalent to
|
||||
.IR "\-sS" .
|
||||
Use this option to convert 32-bit integers between big-endian and
|
||||
little-endian machines.
|
||||
.TP
|
||||
.I "\-B"
|
||||
Set the I/O block size to 5120 bytes. Initially the block size is 512
|
||||
bytes.
|
||||
.TP
|
||||
.I "\-\-block-size=BLOCK-SIZE"
|
||||
Set the I/O block size to BLOCK-SIZE * 512 bytes.
|
||||
.TP
|
||||
.I "\-c"
|
||||
Use the old portable (ASCII) archive format.
|
||||
.TP
|
||||
.I "\-C IO-SIZE, \-\-io-size=IO-SIZE"
|
||||
Set the I/O block size to IO-SIZE bytes.
|
||||
.TP
|
||||
.I "\-d, \-\-make-directories"
|
||||
Create leading directories where needed.
|
||||
.TP
|
||||
.I "\-E FILE, \-\-pattern-file=FILE"
|
||||
In copy-in mode, read additional patterns specifying filenames to
|
||||
extract or list from FILE. The lines of FILE are treated as if they
|
||||
had been non-option arguments to
|
||||
.BR cpio .
|
||||
.TP
|
||||
.I "\-f, \-\-nonmatching"
|
||||
Only copy files that do not match any of the given patterns.
|
||||
.TP
|
||||
.I "\-F, \-\-file=archive"
|
||||
Archive filename to use instead of standard input or output. To use a
|
||||
tape drive on another machine as the archive, use a filename that
|
||||
starts with `HOSTNAME:'. The hostname can be preceded by a
|
||||
username and an `@' to access the remote tape drive as that user, if
|
||||
you have permission to do so (typically an entry in that user's
|
||||
`~/.rhosts' file).
|
||||
.TP
|
||||
.I "\-\-force-local"
|
||||
With
|
||||
.IR \-F ,
|
||||
.IR \-I ,
|
||||
or
|
||||
.IR \-O ,
|
||||
take the archive file name to be a local file even if it contains a
|
||||
colon, which would ordinarily indicate a remote host name.
|
||||
.TP
|
||||
.I "\-H FORMAT, \-\-format=FORMAT"
|
||||
Use archive format FORMAT. The valid formats are listed below;
|
||||
the same names are also recognized in all-caps. The default in
|
||||
copy-in mode is to automatically detect the archive format, and in
|
||||
copy-out mode is "bin".
|
||||
.RS
|
||||
.IP bin
|
||||
The obsolete binary format.
|
||||
.IP odc
|
||||
The old (POSIX.1) portable format.
|
||||
.IP newc
|
||||
The new (SVR4) portable format, which supports file systems having
|
||||
more than 65536 i-nodes.
|
||||
.IP crc
|
||||
The new (SVR4) portable format with a checksum added.
|
||||
.IP tar
|
||||
The old tar format.
|
||||
.IP ustar
|
||||
The POSIX.1 tar format. Also recognizes GNU
|
||||
.B tar
|
||||
archives, which are similar but not identical.
|
||||
.IP hpbin
|
||||
The obsolete binary format used by HPUX's cpio (which stores device files
|
||||
differently).
|
||||
.IP hpodc
|
||||
The portable format used by HPUX's cpio (which stores device files differently).
|
||||
.RE
|
||||
.TP
|
||||
.I "\-i, \-\-extract"
|
||||
Run in copy-in mode.
|
||||
.TP
|
||||
.I "\-I archive"
|
||||
Archive filename to use instead of standard input. To use a
|
||||
tape drive on another machine as the archive, use a filename that
|
||||
starts with `HOSTNAME:'. The hostname can be preceded by a
|
||||
username and an `@' to access the remote tape drive as that user, if
|
||||
you have permission to do so (typically an entry in that user's
|
||||
`~/.rhosts' file).
|
||||
.TP
|
||||
.I \-k
|
||||
Ignored; for compatibility with other versions of
|
||||
.BR cpio .
|
||||
.TP
|
||||
.I "\-l, \-\-link"
|
||||
Link files instead of copying them, when possible (usable only with the
|
||||
.I \-p
|
||||
option).
|
||||
.TP
|
||||
.I "\-L, \-\-dereference"
|
||||
Dereference symbolic links (copy the files that they point to instead
|
||||
of copying the links).
|
||||
.TP
|
||||
.I "\-m, \-\-preserve-modification-time"
|
||||
Retain previous file modification times when creating files.
|
||||
.TP
|
||||
.I "\-M MESSAGE, \-\-message=MESSAGE"
|
||||
Print MESSAGE when the end of a volume of the backup media (such as a
|
||||
tape or a floppy disk) is reached, to prompt the user to insert a new
|
||||
volume. If MESSAGE contains the string "%d", it is replaced by the
|
||||
current volume number (starting at 1).
|
||||
.TP
|
||||
.I "\-n, \-\-numeric-uid-gid"
|
||||
In the verbose table of contents listing, show numeric UID and GID
|
||||
instead of translating them into names.
|
||||
.TP
|
||||
.I " \-\-no-absolute-filenames"
|
||||
In copy-in mode, create all files relative to the current directory,
|
||||
even if they have an absolute file name in the archive.
|
||||
.TP
|
||||
.I " \-\-no-preserve-owner"
|
||||
In copy-in mode and copy-pass mode, do not change the ownership of the
|
||||
files; leave them owned by the user extracting them. This is the
|
||||
default for non-root users, so that users on System V don't
|
||||
inadvertantly give away files.
|
||||
.TP
|
||||
.I "\-o, \-\-create"
|
||||
Run in copy-out mode.
|
||||
.TP
|
||||
.I "\-O archive"
|
||||
Archive filename to use instead of standard output. To use a tape
|
||||
drive on another machine as the archive, use a filename that starts
|
||||
with `HOSTNAME:'. The hostname can be preceded by a username and an
|
||||
`@' to access the remote tape drive as that user, if you have
|
||||
permission to do so (typically an entry in that user's `~/.rhosts'
|
||||
file).
|
||||
.TP
|
||||
.I " \-\-only-verify-crc"
|
||||
When reading a CRC format archive in copy-in mode, only verify the
|
||||
CRC's of each file in the archive, don't actually extract the files.
|
||||
.TP
|
||||
.I "\-p, \-\-pass-through"
|
||||
Run in copy-pass mode.
|
||||
.TP
|
||||
.I "\-\-quiet"
|
||||
Do not print the number of blocks copied.
|
||||
.TP
|
||||
.I "\-r, \-\-rename"
|
||||
Interactively rename files.
|
||||
.TP
|
||||
.I "\-R [user][:.][group], \-\-owner [user][:.][group]"
|
||||
In copy-out and copy-pass modes, set the ownership of all files created
|
||||
to the specified user and/or group. Either the user or the group, or
|
||||
both, must be present. If the group is omitted but the ":" or "."
|
||||
separator is given, use the given user's login group. Only the
|
||||
super-user can change files' ownership.
|
||||
.TP
|
||||
.I "\-\-sparse"
|
||||
In copy-out and copy-pass modes, write files with large blocks of zeros
|
||||
as sparse files.
|
||||
.TP
|
||||
.I "\-s, \-\-swap-bytes"
|
||||
In copy-in mode, swap the bytes of each halfword (pair of bytes) in the
|
||||
files.
|
||||
.TP
|
||||
.I "\-S, \-\-swap-halfwords"
|
||||
In copy-in mode, swap the halfwords of each word (4 bytes) in the
|
||||
files.
|
||||
.TP
|
||||
.I "\-t, \-\-list"
|
||||
Print a table of contents of the input.
|
||||
.TP
|
||||
.I "\-u, \-\-unconditional"
|
||||
Replace all files, without asking whether to replace existing newer
|
||||
files with older files.
|
||||
.TP
|
||||
.I "\-v, \-\-verbose"
|
||||
List the files processed, or with
|
||||
.IR \-t ,
|
||||
give an `ls \-l' style table of contents listing. In a verbose table
|
||||
of contents of a ustar archive, user and group names in the archive
|
||||
that do not exist on the local system are replaced by the names that
|
||||
correspond locally to the numeric UID and GID stored in the archive.
|
||||
.TP
|
||||
.I "\-V \-\-dot"
|
||||
Print a "." for each file processed.
|
||||
.TP
|
||||
.I "\-\-version"
|
||||
Print the
|
||||
.B cpio
|
||||
program version number and exit.
|
||||
@@ -1,69 +0,0 @@
|
||||
/* Extended cpio format from POSIX.1.
|
||||
Copyright (C) 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifndef _CPIO_H
|
||||
|
||||
#define _CPIO_H 1
|
||||
|
||||
/* A cpio archive consists of a sequence of files.
|
||||
Each file has a 76 byte header,
|
||||
a variable length, NUL terminated filename,
|
||||
and variable length file data.
|
||||
A header for a filename "TRAILER!!!" indicates the end of the archive. */
|
||||
|
||||
/* All the fields in the header are ISO 646 (approximately ASCII) strings
|
||||
of octal numbers, left padded, not NUL terminated.
|
||||
|
||||
Field Name Length in Bytes Notes
|
||||
c_magic 6 must be "070707"
|
||||
c_dev 6
|
||||
c_ino 6
|
||||
c_mode 6 see below for value
|
||||
c_uid 6
|
||||
c_gid 6
|
||||
c_nlink 6
|
||||
c_rdev 6 only valid for chr and blk special files
|
||||
c_mtime 11
|
||||
c_namesize 6 count includes terminating NUL in pathname
|
||||
c_filesize 11 must be 0 for FIFOs and directories */
|
||||
|
||||
/* Values for c_mode, OR'd together: */
|
||||
|
||||
#define C_IRUSR 000400
|
||||
#define C_IWUSR 000200
|
||||
#define C_IXUSR 000100
|
||||
#define C_IRGRP 000040
|
||||
#define C_IWGRP 000020
|
||||
#define C_IXGRP 000010
|
||||
#define C_IROTH 000004
|
||||
#define C_IWOTH 000002
|
||||
#define C_IXOTH 000001
|
||||
|
||||
#define C_ISUID 004000
|
||||
#define C_ISGID 002000
|
||||
#define C_ISVTX 001000
|
||||
|
||||
#define C_ISBLK 060000
|
||||
#define C_ISCHR 020000
|
||||
#define C_ISDIR 040000
|
||||
#define C_ISFIFO 010000
|
||||
#define C_ISSOCK 0140000
|
||||
#define C_ISLNK 0120000
|
||||
#define C_ISCTG 0110000
|
||||
#define C_ISREG 0100000
|
||||
|
||||
#endif /* cpio.h */
|
||||
@@ -1,558 +0,0 @@
|
||||
\input texinfo @c -*-texinfo-*-
|
||||
@c %**start of header
|
||||
@setfilename cpio.info
|
||||
@settitle cpio
|
||||
@setchapternewpage off
|
||||
@set VERSION GNU cpio 2.4
|
||||
@set RELEASEDATE November 1995
|
||||
@c %**end of header
|
||||
|
||||
@ifinfo
|
||||
@format
|
||||
START-INFO-DIR-ENTRY
|
||||
* cpio: (cpio). Making tape (or disk) archives.
|
||||
END-INFO-DIR-ENTRY
|
||||
@end format
|
||||
@end ifinfo
|
||||
|
||||
@ifinfo
|
||||
This file documents @value{VERSION}.
|
||||
|
||||
Copyright (C) 1995 Free Software Foundation, Inc.
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this manual provided the copyright notice and this permission notice
|
||||
are preserved on all copies.
|
||||
|
||||
@ignore
|
||||
Permission is granted to process this file through TeX and print the
|
||||
results, provided the printed document carries copying permission
|
||||
notice identical to this one except for the removal of this paragraph
|
||||
|
||||
|
||||
@end ignore
|
||||
Permission is granted to copy and distribute modified versions of this
|
||||
manual under the conditions for verbatim copying, provided that the entire
|
||||
resulting derived work is distributed under the terms of a permission
|
||||
notice identical to this one.
|
||||
|
||||
Permission is granted to copy and distribute translations of this manual
|
||||
into another language, under the above conditions for modified versions,
|
||||
except that this permission notice may be stated in a translation approved
|
||||
by the Foundation.
|
||||
@end ifinfo
|
||||
|
||||
|
||||
@titlepage
|
||||
@title GNU CPIO
|
||||
@subtitle @value{VERSION} @value{RELEASEDATE}
|
||||
@author by Robert Carleton
|
||||
@c copyright page
|
||||
@page
|
||||
@vskip 0pt plus 1filll
|
||||
Copyright @copyright{} 1995 Free Software Foundation, Inc.
|
||||
@sp 2
|
||||
This is the first edition of the GNU cpio documentation,@*
|
||||
and is consistent with @value{VERSION}.@*
|
||||
@sp 2
|
||||
Published by the Free Software Foundation @*
|
||||
59 Temple Place - Suite 330, @*
|
||||
Boston, MA 02111-1307, USA @*
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this manual provided the copyright notice and this permission notice
|
||||
are preserved on all copies.
|
||||
|
||||
Permission is granted to copy and distribute modified versions of this
|
||||
manual under the conditions for verbatim copying, provided that the entire
|
||||
resulting derived work is distributed under the terms of a permission
|
||||
notice identical to this one.
|
||||
|
||||
Permission is granted to copy and distribute translations of this manual
|
||||
into another language, under the above conditions for modified versions,
|
||||
except that this permission notice may be stated in a translation
|
||||
approved by the Free Software Foundation.
|
||||
@end titlepage
|
||||
|
||||
@ifinfo
|
||||
@node Top, Introduction, (dir), (dir)
|
||||
@comment node-name, next, previous, up
|
||||
@top
|
||||
|
||||
GNU cpio is a tool for creating and extracting archives, or copying
|
||||
files from one place to another. It handles a number of cpio formats as
|
||||
well as reading and writing tar files. This is the first edition of the
|
||||
GNU cpio documentation and is consistant with @value{VERSION}.
|
||||
|
||||
@menu
|
||||
* Introduction::
|
||||
* Tutorial:: Getting started.
|
||||
* Invoking `cpio':: How to invoke `cpio'.
|
||||
* Media:: Using tapes and other archive media.
|
||||
* Concept Index:: Concept index.
|
||||
|
||||
--- The Detailed Node Listing ---
|
||||
|
||||
Invoking cpio
|
||||
|
||||
* Copy-out mode::
|
||||
* Copy-in mode::
|
||||
* Copy-pass mode::
|
||||
* Options::
|
||||
@end menu
|
||||
|
||||
@end ifinfo
|
||||
|
||||
@node Introduction, Tutorial, Top, Top
|
||||
@comment node-name, next, previous, up
|
||||
@chapter Introduction
|
||||
|
||||
GNU cpio copies files into or out of a cpio or tar archive, The archive
|
||||
can be another file on the disk, a magnetic tape, or a pipe.
|
||||
|
||||
GNU cpio supports the following archive formats: binary, old ASCII, new
|
||||
ASCII, crc, HPUX binary, HPUX old ASCII, old tar, and POSIX.1 tar. The
|
||||
tar format is provided for compatability with the tar program. By
|
||||
default, cpio creates binary format archives, for compatibility with
|
||||
older cpio programs. When extracting from archives, cpio automatically
|
||||
recognizes which kind of archive it is reading and can read archives
|
||||
created on machines with a different byte-order.
|
||||
|
||||
@node Tutorial, Invoking `cpio', Introduction, Top
|
||||
@comment node-name, next, previous, up
|
||||
@chapter Tutorial
|
||||
@cindex creating a cpio archive
|
||||
@cindex extracting a cpio archive
|
||||
@cindex copying directory structures
|
||||
@cindex passing directory structures
|
||||
|
||||
|
||||
GNU cpio performs three primary functions. Copying files to an
|
||||
archive, Extracting files from an archive, and passing files to another
|
||||
directory tree. An archive can be a file on disk, one or more floppy
|
||||
disks, or one or more tapes.
|
||||
|
||||
When creating an archive, cpio takes the list of files to be processed
|
||||
from the standard input, and then sends the archive to the standard
|
||||
output, or to the device defined by the @samp{-F} option.
|
||||
@xref{Copy-out mode}. Usually find or ls is used to provide this list
|
||||
to the standard input. In the following example you can see the
|
||||
possibilities for archiving the contents of a single directory.
|
||||
|
||||
|
||||
@example
|
||||
@cartouche
|
||||
% ls | cpio -ov > directory.cpio
|
||||
@end cartouche
|
||||
@end example
|
||||
|
||||
The @samp{-o} option creates the archive, and the @samp{-v} option
|
||||
prints the names of the files archived as they are added. Notice that
|
||||
the options can be put together after a single @samp{-} or can be placed
|
||||
separately on the command line. The @samp{>} redirects the cpio output
|
||||
to the file @samp{directory.cpio}.
|
||||
|
||||
|
||||
If you wanted to archive an entire directory tree, the find command can
|
||||
provide the file list to cpio:
|
||||
|
||||
|
||||
@example
|
||||
@cartouche
|
||||
% find . -print -depth | cpio -ov > tree.cpio
|
||||
@end cartouche
|
||||
@end example
|
||||
|
||||
|
||||
This will take all the files in the current directory, the directories
|
||||
below and place them in the archive tree.cpio. Again the @samp{-o}
|
||||
creates an archive, and the @samp{-v} option shows you the name of the
|
||||
files as they are archived. @xref{Copy-out mode}. Using the `.' in the
|
||||
find statement will give you more flexibility when doing restores, as it
|
||||
will save file names with a relative path vice a hard wired, absolute
|
||||
path. The @samp{-depth} option forces @samp{find} to print of the
|
||||
entries in a directory before printing the directory itself. This
|
||||
limits the effects of restrictive directory permissions by printing the
|
||||
directory entries in a directory before the directory name itself.
|
||||
|
||||
|
||||
|
||||
|
||||
Extracting an archive requires a bit more thought because cpio will not
|
||||
create directories by default. Another characteristic, is it will not
|
||||
overwrite existing files unless you tell it to.
|
||||
|
||||
|
||||
@example
|
||||
@cartouche
|
||||
% cpio -iv < directory.cpio
|
||||
@end cartouche
|
||||
@end example
|
||||
|
||||
This will retrieve the files archived in the file directory.cpio and
|
||||
place them in the present directory. The @samp{-i} option extracts the
|
||||
archive and the @samp{-v} shows the file names as they are extracted.
|
||||
If you are dealing with an archived directory tree, you need to use the
|
||||
@samp{-d} option to create directories as necessary, something like:
|
||||
|
||||
@example
|
||||
@cartouche
|
||||
% cpio -idv < tree.cpio
|
||||
@end cartouche
|
||||
@end example
|
||||
|
||||
This will take the contents of the archive tree.cpio and extract it to
|
||||
the current directory. If you try to extract the files on top of files
|
||||
of the same name that already exist (and have the same or later
|
||||
modification time) cpio will not extract the file unless told to do so
|
||||
by the -u option. @xref{Copy-in mode}.
|
||||
|
||||
|
||||
In copy-pass mode, cpio copies files from one directory tree to another,
|
||||
combining the copy-out and copy-in steps without actually using an
|
||||
archive. It reads the list of files to copy from the standard input;
|
||||
the directory into which it will copy them is given as a non-option
|
||||
argument. @xref{Copy-pass mode}.
|
||||
|
||||
@example
|
||||
@cartouche
|
||||
% find . -depth -print0 | cpio --null -pvd new-dir
|
||||
@end cartouche
|
||||
@end example
|
||||
|
||||
|
||||
The example shows copying the files of the present directory, and
|
||||
sub-directories to a new directory called new-dir. Some new options are
|
||||
the @samp{-print0} available with GNU find, combined with the
|
||||
@samp{--null} option of cpio. These two options act together to send
|
||||
file names between find and cpio, even if special characters are
|
||||
embedded in the file names. Another is @samp{-p}, which tells cpio to
|
||||
pass the files it finds to the directory @samp{new-dir}.
|
||||
|
||||
@node Invoking `cpio', Media, Tutorial, Top
|
||||
@comment node-name, next, previous, up
|
||||
@chapter Invoking cpio
|
||||
@cindex invoking cpio
|
||||
@cindex command line options
|
||||
|
||||
@menu
|
||||
* Copy-out mode::
|
||||
* Copy-in mode::
|
||||
* Copy-pass mode::
|
||||
* Options::
|
||||
@end menu
|
||||
|
||||
@node Copy-out mode, Copy-in mode, Invoking `cpio', Invoking `cpio'
|
||||
@comment node-name, next, previous, up
|
||||
@section Copy-out mode
|
||||
|
||||
In copy-out mode, cpio copies files into an archive. It reads a list
|
||||
of filenames, one per line, on the standard input, and writes the
|
||||
archive onto the standard output. A typical way to generate the list
|
||||
of filenames is with the find command; you should give find the -depth
|
||||
option to minimize problems with permissions on directories that are
|
||||
unreadable.
|
||||
@xref{Options}.
|
||||
|
||||
@example
|
||||
cpio @{-o|--create@} [-0acvABLV] [-C bytes] [-H format]
|
||||
[-M message] [-O [[user@@]host:]archive] [-F [[user@@]host:]archive]
|
||||
[--file=[[user@@]host:]archive] [--format=format] [--sparse]
|
||||
[--message=message][--null] [--reset-access-time] [--verbose]
|
||||
[--dot] [--append] [--block-size=blocks] [--dereference]
|
||||
[--io-size=bytes] [--help] [--version] < name-list [> archive]
|
||||
@end example
|
||||
|
||||
@node Copy-in mode, Copy-pass mode, Copy-out mode, Invoking `cpio'
|
||||
@comment node-name, next, previous, up
|
||||
@section Copy-in mode
|
||||
|
||||
In copy-in mode, cpio copies files out of an archive or lists the
|
||||
archive contents. It reads the archive from the standard input. Any
|
||||
non-option command line arguments are shell globbing patterns; only
|
||||
files in the archive whose names match one or more of those patterns are
|
||||
copied from the archive. Unlike in the shell, an initial `.' in a
|
||||
filename does match a wildcard at the start of a pattern, and a `/' in a
|
||||
filename can match wildcards. If no patterns are given, all files are
|
||||
extracted. @xref{Options}.
|
||||
|
||||
@example
|
||||
cpio @{-i|--extract@} [-bcdfmnrtsuvBSV] [-C bytes] [-E file]
|
||||
[-H format] [-M message] [-R [user][:.][group]]
|
||||
[-I [[user@@]host:]archive] [-F [[user@@]host:]archive]
|
||||
[--file=[[user@@]host:]archive] [--make-directories]
|
||||
[--nonmatching] [--preserve-modification-time]
|
||||
[--numeric-uid-gid] [--rename] [--list] [--swap-bytes] [--swap]
|
||||
[--dot] [--unconditional] [--verbose] [--block-size=blocks]
|
||||
[--swap-halfwords] [--io-size=bytes] [--pattern-file=file]
|
||||
[--format=format] [--owner=[user][:.][group]]
|
||||
[--no- preserve-owner] [--message=message] [--help] [--version]
|
||||
[-no-abosolute-filenames] [-only-verify-crc] [-quiet]
|
||||
[pattern...] [< archive]
|
||||
@end example
|
||||
|
||||
@node Copy-pass mode, Options, Copy-in mode, Invoking `cpio'
|
||||
@comment node-name, next, previous, up
|
||||
@section Copy-pass mode
|
||||
|
||||
In copy-pass mode, cpio copies files from one directory tree to
|
||||
another, combining the copy-out and copy-in steps without actually
|
||||
using an archive. It reads the list of files to copy from the
|
||||
standard input; the directory into which it will copy them is given as
|
||||
a non-option argument.
|
||||
@xref{Options}.
|
||||
|
||||
@example
|
||||
cpio @{-p|--pass-through@} [-0adlmuvLV] [-R [user][:.][group]]
|
||||
[--null] [--reset-access-time] [--make-directories] [--link]
|
||||
[--preserve-modification-time] [--unconditional] [--verbose]
|
||||
[--dot] [--dereference] [--owner=[user][:.][group]] [--sparse]
|
||||
[--no-preserve-owner] [--help] [--version] destination-directory
|
||||
< name-list
|
||||
@end example
|
||||
|
||||
|
||||
|
||||
@node Options, , Copy-pass mode, Invoking `cpio'
|
||||
@comment node-name, next, previous, up
|
||||
@section Options
|
||||
|
||||
|
||||
@table @code
|
||||
|
||||
|
||||
@item -0, --null
|
||||
Read a list of filenames terminated by a null character, instead of a
|
||||
newline, so that files whose names contain newlines can be archived.
|
||||
GNU find is one way to produce a list of null-terminated filenames.
|
||||
This option may be used in copy-out and copy-pass modes.
|
||||
|
||||
@item -a, --reset-access-time
|
||||
Reset the access times of files after reading them, so
|
||||
that it does not look like they have just been read.
|
||||
|
||||
@item -A, --append
|
||||
Append to an existing archive. Only works in copy-out
|
||||
mode. The archive must be a disk file specified with
|
||||
the -O or -F (--file) option.
|
||||
|
||||
@item -b, --swap
|
||||
Swap both halfwords of words and bytes of halfwords in the data.
|
||||
Equivalent to -sS. This option may be used in copy-in mode. Use this
|
||||
option to convert 32-bit integers between big-endian and little-endian
|
||||
machines.
|
||||
|
||||
@item -B
|
||||
Set the I/O block size to 5120 bytes. Initially the
|
||||
block size is 512 bytes.
|
||||
|
||||
@item --block-size=BLOCK-SIZE
|
||||
Set the I/O block size to BLOCK-SIZE * 512 bytes.
|
||||
|
||||
@item -c
|
||||
Use the old portable (ASCII) archive format.
|
||||
|
||||
@item -C IO-SIZE, --io-size=IO-SIZE
|
||||
Set the I/O block size to IO-SIZE bytes.
|
||||
|
||||
@item -d, --make-directories
|
||||
Create leading directories where needed.
|
||||
|
||||
@item -E FILE, --pattern-file=FILE
|
||||
Read additional patterns specifying filenames to extract or list from
|
||||
FILE. The lines of FILE are treated as if they had been non-option
|
||||
arguments to cpio. This option is used in copy-in mode,
|
||||
|
||||
@item -f, --nonmatching
|
||||
Only copy files that do not match any of the given
|
||||
patterns.
|
||||
|
||||
@item -F, --file=archive
|
||||
Archive filename to use instead of standard input or output. To use a
|
||||
tape drive on another machine as the archive, use a filename that starts
|
||||
with `HOSTNAME:'. The hostname can be preceded by a username and an
|
||||
`@@' to access the remote tape drive as that user, if you have
|
||||
permission to do so (typically an entry in that user's `~/.rhosts'
|
||||
file).
|
||||
|
||||
@item --force-local
|
||||
With -F, -I, or -O, take the archive file name to be a
|
||||
local file even if it contains a colon, which would
|
||||
ordinarily indicate a remote host name.
|
||||
|
||||
@item -H FORMAT, --format=FORMAT
|
||||
Use archive format FORMAT. The valid formats are listed below; the same
|
||||
names are also recognized in all-caps. The default in copy-in mode is
|
||||
to automatically detect the archive format, and in copy-out mode is
|
||||
@samp{bin}.
|
||||
|
||||
@table @samp
|
||||
@item bin
|
||||
The obsolete binary format.
|
||||
|
||||
@item odc
|
||||
The old (POSIX.1) portable format.
|
||||
|
||||
@item newc
|
||||
The new (SVR4) portable format, which supports file systems having more
|
||||
than 65536 i-nodes.
|
||||
|
||||
@item crc
|
||||
The new (SVR4) portable format with a checksum added.
|
||||
|
||||
@item tar
|
||||
The old tar format.
|
||||
|
||||
@item ustar
|
||||
The POSIX.1 tar format. Also recognizes GNU tar archives, which are
|
||||
similar but not identical.
|
||||
|
||||
@item hpbin
|
||||
The obsolete binary format used by HPUX's cpio (which stores device
|
||||
files differently).
|
||||
|
||||
@item hpodc
|
||||
The portable format used by HPUX's cpio (which stores device files
|
||||
differently).
|
||||
@end table
|
||||
|
||||
@item -i, --extract
|
||||
Run in copy-in mode.
|
||||
@xref{Copy-in mode}.
|
||||
|
||||
@item -I archive
|
||||
Archive filename to use instead of standard input. To use a tape drive
|
||||
on another machine as the archive, use a filename that starts with
|
||||
`HOSTNAME:'. The hostname can be preceded by a username and an `@@' to
|
||||
access the remote tape drive as that user, if you have permission to do
|
||||
so (typically an entry in that user's `~/.rhosts' file).
|
||||
|
||||
@item -k
|
||||
Ignored; for compatibility with other versions of cpio.
|
||||
|
||||
@item -l, --link
|
||||
Link files instead of copying them, when possible.
|
||||
|
||||
@item -L, --dereference
|
||||
Copy the file that a symbolic link points to, rather than the symbolic
|
||||
link itself.
|
||||
|
||||
@item -m, --preserve-modification-time
|
||||
Retain previous file modification times when creating files.
|
||||
|
||||
@item -M MESSAGE, --message=MESSAGE
|
||||
Print MESSAGE when the end of a volume of the backup media (such as a
|
||||
tape or a floppy disk) is reached, to prompt the user to insert a new
|
||||
volume. If MESSAGE contains the string "%d", it is replaced by the
|
||||
current volume number (starting at 1).
|
||||
|
||||
@item -n, --numeric-uid-gid
|
||||
Show numeric UID and GID instead of translating them into names when using the
|
||||
@samp{--verbose option}.
|
||||
|
||||
@item --no-absolute-filenames
|
||||
Create all files relative to the current directory in copy-in mode, even
|
||||
if they have an absolute file name in the archive.
|
||||
|
||||
@item --no-preserve-owner
|
||||
Do not change the ownership of the files; leave them owned by the user
|
||||
extracting them. This is the default for non-root users, so that users
|
||||
on System V don't inadvertantly give away files. This option can be
|
||||
used in copy-in mode and copy-pass mode
|
||||
|
||||
@item -o, --create
|
||||
Run in copy-out mode.
|
||||
@xref{Copy-out mode}.
|
||||
|
||||
@item -O archive
|
||||
Archive filename to use instead of standard output. To use a tape drive
|
||||
on another machine as the archive, use a filename that starts with
|
||||
`HOSTNAME:'. The hostname can be preceded by a username and an `@@' to
|
||||
access the remote tape drive as that user, if you have permission to do
|
||||
so (typically an entry in that user's `~/.rhosts' file).
|
||||
|
||||
@item --only-verify-crc
|
||||
Verify the CRC's of each file in the archive, when reading a CRC format
|
||||
archive. Don't actually extract the files.
|
||||
|
||||
@item -p, --pass-through
|
||||
Run in copy-pass mode.
|
||||
@xref{Copy-pass mode}.
|
||||
|
||||
@item --quiet
|
||||
Do not print the number of blocks copied.
|
||||
|
||||
@item -r, --rename
|
||||
Interactively rename files.
|
||||
|
||||
@item -R [user][:.][group], --owner [user][:.][group]
|
||||
Set the ownership of all files created to the specified user and/or
|
||||
group in copy-out and copy-pass modes. Either the user, the group, or
|
||||
both, must be present. If the group is omitted but the ":" or "."
|
||||
separator is given, use the given user's login group. Only the
|
||||
super-user can change files' ownership.
|
||||
|
||||
@item -s, --swap-bytes
|
||||
Swap the bytes of each halfword (pair of bytes) in the files.This option
|
||||
can be used in copy-in mode.
|
||||
|
||||
@item -S, --swap-halfwords
|
||||
Swap the halfwords of each word (4 bytes) in the files. This option may
|
||||
be used in copy-in mode.
|
||||
|
||||
@item --sparse
|
||||
Write files with large blocks of zeros as sparse files. This option is
|
||||
used in copy-out and copy-pass modes.
|
||||
|
||||
@item -t, --list
|
||||
Print a table of contents of the input.
|
||||
|
||||
@item -u, --unconditional
|
||||
Replace all files, without asking whether to replace
|
||||
existing newer files with older files.
|
||||
|
||||
@item -v, --verbose
|
||||
List the files processed, or with @samp{-t}, give an @samp{ls -l} style
|
||||
table of contents listing. In a verbose table of contents of a ustar
|
||||
archive, user and group names in the archive that do not exist on the
|
||||
local system are replaced by the names that correspond locally to the
|
||||
numeric UID and GID stored in the archive.
|
||||
|
||||
@item -V --dot
|
||||
Print a @kbd{.} for each file processed.
|
||||
|
||||
@item --version
|
||||
Print the cpio program version number and exit.
|
||||
@end table
|
||||
|
||||
|
||||
@node Media, Concept Index, Invoking `cpio', Top
|
||||
@comment node-name, next, previous, up
|
||||
@chapter Magnetic Media
|
||||
@cindex magnetic media
|
||||
|
||||
Archives are usually written on removable media--tape cartridges, mag
|
||||
tapes, or floppy disks.
|
||||
|
||||
The amount of data a tape or disk holds depends not only on its size,
|
||||
but also on how it is formatted. A 2400 foot long reel of mag tape
|
||||
holds 40 megabytes of data when formated at 1600 bits per inch. The
|
||||
physically smaller EXABYTE tape cartridge holds 2.3 gigabytes.
|
||||
|
||||
Magnetic media are re-usable--once the archive on a tape is no longer
|
||||
needed, the archive can be erased and the tape or disk used over. Media
|
||||
quality does deteriorate with use, however. Most tapes or disks should
|
||||
be disgarded when they begin to produce data errors.
|
||||
|
||||
Magnetic media are written and erased using magnetic fields, and should
|
||||
be protected from such fields to avoid damage to stored data. Sticking
|
||||
a floppy disk to a filing cabinet using a magnet is probably not a good
|
||||
idea.
|
||||
|
||||
|
||||
@node Concept Index, , Media, Top
|
||||
@comment node-name, next, previous, up
|
||||
@unnumbered Concept Index
|
||||
@printindex cp
|
||||
@contents
|
||||
@bye
|
||||
@@ -1,90 +0,0 @@
|
||||
/* Extended cpio header from POSIX.1.
|
||||
Copyright (C) 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifndef _CPIOHDR_H
|
||||
|
||||
#define _CPIOHDR_H 1
|
||||
|
||||
#include <cpio.h>
|
||||
|
||||
struct old_cpio_header
|
||||
{
|
||||
unsigned short c_magic;
|
||||
short c_dev;
|
||||
unsigned short c_ino;
|
||||
unsigned short c_mode;
|
||||
unsigned short c_uid;
|
||||
unsigned short c_gid;
|
||||
unsigned short c_nlink;
|
||||
short c_rdev;
|
||||
unsigned short c_mtimes[2];
|
||||
unsigned short c_namesize;
|
||||
unsigned short c_filesizes[2];
|
||||
unsigned long c_mtime; /* Long-aligned copy of `c_mtimes'. */
|
||||
unsigned long c_filesize; /* Long-aligned copy of `c_filesizes'. */
|
||||
char *c_name;
|
||||
};
|
||||
|
||||
/* "New" portable format and CRC format:
|
||||
|
||||
Each file has a 110 byte header,
|
||||
a variable length, NUL terminated filename,
|
||||
and variable length file data.
|
||||
A header for a filename "TRAILER!!!" indicates the end of the archive. */
|
||||
|
||||
/* All the fields in the header are ISO 646 (approximately ASCII) strings
|
||||
of hexadecimal numbers, left padded, not NUL terminated.
|
||||
|
||||
Field Name Length in Bytes Notes
|
||||
c_magic 6 "070701" for "new" portable format
|
||||
"070702" for CRC format
|
||||
c_ino 8
|
||||
c_mode 8
|
||||
c_uid 8
|
||||
c_gid 8
|
||||
c_nlink 8
|
||||
c_mtime 8
|
||||
c_filesize 8 must be 0 for FIFOs and directories
|
||||
c_maj 8
|
||||
c_min 8
|
||||
c_rmaj 8 only valid for chr and blk special files
|
||||
c_rmin 8 only valid for chr and blk special files
|
||||
c_namesize 8 count includes terminating NUL in pathname
|
||||
c_chksum 8 0 for "new" portable format; for CRC format
|
||||
the sum of all the bytes in the file */
|
||||
|
||||
struct new_cpio_header
|
||||
{
|
||||
unsigned short c_magic;
|
||||
unsigned long c_ino;
|
||||
unsigned long c_mode;
|
||||
unsigned long c_uid;
|
||||
unsigned long c_gid;
|
||||
unsigned long c_nlink;
|
||||
unsigned long c_mtime;
|
||||
unsigned long c_filesize;
|
||||
long c_dev_maj;
|
||||
long c_dev_min;
|
||||
long c_rdev_maj;
|
||||
long c_rdev_min;
|
||||
unsigned long c_namesize;
|
||||
unsigned long c_chksum;
|
||||
char *c_name;
|
||||
char *c_tar_linkname;
|
||||
};
|
||||
|
||||
#endif /* cpiohdr.h */
|
||||
@@ -1,43 +0,0 @@
|
||||
/* defer.c - handle "defered" links in newc and crc archives
|
||||
Copyright (C) 1993 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include "system.h"
|
||||
#include "cpiohdr.h"
|
||||
#include "extern.h"
|
||||
#include "defer.h"
|
||||
|
||||
struct deferment *
|
||||
create_deferment (file_hdr)
|
||||
struct new_cpio_header *file_hdr;
|
||||
{
|
||||
struct deferment *d;
|
||||
d = (struct deferment *) xmalloc (sizeof (struct deferment) );
|
||||
d->header = *file_hdr;
|
||||
d->header.c_name = (char *) xmalloc (strlen (file_hdr->c_name) + 1);
|
||||
strcpy (d->header.c_name, file_hdr->c_name);
|
||||
return d;
|
||||
}
|
||||
|
||||
void
|
||||
free_deferment (d)
|
||||
struct deferment *d;
|
||||
{
|
||||
free (d->header.c_name);
|
||||
free (d);
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
struct deferment
|
||||
{
|
||||
struct deferment *next;
|
||||
struct new_cpio_header header;
|
||||
};
|
||||
|
||||
struct deferment *create_deferment P_((struct new_cpio_header *file_hdr));
|
||||
void free_deferment P_((struct deferment *d));
|
||||
@@ -1,70 +0,0 @@
|
||||
/* dirname.c -- return all but the last element in a path
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
char *malloc ();
|
||||
#endif
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#else
|
||||
#include <strings.h>
|
||||
#ifndef strrchr
|
||||
#define strrchr rindex
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Return the leading directories part of PATH,
|
||||
allocated with malloc. If out of memory, return 0.
|
||||
Assumes that trailing slashes have already been
|
||||
removed. */
|
||||
|
||||
char *
|
||||
dirname (path)
|
||||
char *path;
|
||||
{
|
||||
char *newpath;
|
||||
char *slash;
|
||||
int length; /* Length of result, not including NUL. */
|
||||
|
||||
slash = strrchr (path, '/');
|
||||
if (slash == 0)
|
||||
{
|
||||
/* File is in the current directory. */
|
||||
path = ".";
|
||||
length = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Remove any trailing slashes from the result. */
|
||||
while (slash > path && *slash == '/')
|
||||
--slash;
|
||||
|
||||
length = slash - path + 1;
|
||||
}
|
||||
newpath = (char *) malloc (length + 1);
|
||||
if (newpath == 0)
|
||||
return 0;
|
||||
strncpy (newpath, path, length);
|
||||
newpath[length] = 0;
|
||||
return newpath;
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
/* dstring.c - The dynamic string handling routines used by cpio.
|
||||
Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
#if defined(HAVE_STRING_H) || defined(STDC_HEADERS)
|
||||
#include <string.h>
|
||||
#else
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#include "dstring.h"
|
||||
|
||||
#if __STDC__
|
||||
# define P_(s) s
|
||||
#else
|
||||
# define P_(s) ()
|
||||
#endif
|
||||
char *xmalloc P_((unsigned n));
|
||||
char *xrealloc P_((char *p, unsigned n));
|
||||
|
||||
/* Initialiaze dynamic string STRING with space for SIZE characters. */
|
||||
|
||||
void
|
||||
ds_init (string, size)
|
||||
dynamic_string *string;
|
||||
int size;
|
||||
{
|
||||
string->ds_length = size;
|
||||
string->ds_string = (char *) xmalloc (size);
|
||||
}
|
||||
|
||||
/* Expand dynamic string STRING, if necessary, to hold SIZE characters. */
|
||||
|
||||
void
|
||||
ds_resize (string, size)
|
||||
dynamic_string *string;
|
||||
int size;
|
||||
{
|
||||
if (size > string->ds_length)
|
||||
{
|
||||
string->ds_length = size;
|
||||
string->ds_string = (char *) xrealloc ((char *) string->ds_string, size);
|
||||
}
|
||||
}
|
||||
|
||||
/* Dynamic string S gets a string terminated by the EOS character
|
||||
(which is removed) from file F. S will increase
|
||||
in size during the function if the string from F is longer than
|
||||
the current size of S.
|
||||
Return NULL if end of file is detected. Otherwise,
|
||||
Return a pointer to the null-terminated string in S. */
|
||||
|
||||
char *
|
||||
ds_fgetstr (f, s, eos)
|
||||
FILE *f;
|
||||
dynamic_string *s;
|
||||
char eos;
|
||||
{
|
||||
int insize; /* Amount needed for line. */
|
||||
int strsize; /* Amount allocated for S. */
|
||||
int next_ch;
|
||||
|
||||
/* Initialize. */
|
||||
insize = 0;
|
||||
strsize = s->ds_length;
|
||||
|
||||
/* Read the input string. */
|
||||
next_ch = getc (f);
|
||||
while (next_ch != eos && next_ch != EOF)
|
||||
{
|
||||
if (insize >= strsize - 1)
|
||||
{
|
||||
ds_resize (s, strsize * 2 + 2);
|
||||
strsize = s->ds_length;
|
||||
}
|
||||
s->ds_string[insize++] = next_ch;
|
||||
next_ch = getc (f);
|
||||
}
|
||||
s->ds_string[insize++] = '\0';
|
||||
|
||||
if (insize == 1 && next_ch == EOF)
|
||||
return NULL;
|
||||
else
|
||||
return s->ds_string;
|
||||
}
|
||||
|
||||
char *
|
||||
ds_fgets (f, s)
|
||||
FILE *f;
|
||||
dynamic_string *s;
|
||||
{
|
||||
return ds_fgetstr (f, s, '\n');
|
||||
}
|
||||
|
||||
char *
|
||||
ds_fgetname (f, s)
|
||||
FILE *f;
|
||||
dynamic_string *s;
|
||||
{
|
||||
return ds_fgetstr (f, s, '\0');
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
/* dstring.h - Dynamic string handling include file. Requires strings.h.
|
||||
Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
/* A dynamic string consists of record that records the size of an
|
||||
allocated string and the pointer to that string. The actual string
|
||||
is a normal zero byte terminated string that can be used with the
|
||||
usual string functions. The major difference is that the
|
||||
dynamic_string routines know how to get more space if it is needed
|
||||
by allocating new space and copying the current string. */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int ds_length; /* Actual amount of storage allocated. */
|
||||
char *ds_string; /* String. */
|
||||
} dynamic_string;
|
||||
|
||||
|
||||
/* Macros that look similar to the original string functions.
|
||||
WARNING: These macros work only on pointers to dynamic string records.
|
||||
If used with a real record, an "&" must be used to get the pointer. */
|
||||
#define ds_strlen(s) strlen ((s)->ds_string)
|
||||
#define ds_strcmp(s1, s2) strcmp ((s1)->ds_string, (s2)->ds_string)
|
||||
#define ds_strncmp(s1, s2, n) strncmp ((s1)->ds_string, (s2)->ds_string, n)
|
||||
#define ds_index(s, c) index ((s)->ds_string, c)
|
||||
#define ds_rindex(s, c) rindex ((s)->ds_string, c)
|
||||
|
||||
void ds_init ();
|
||||
void ds_resize ();
|
||||
char *ds_fgetname ();
|
||||
char *ds_fgets ();
|
||||
char *ds_fgetstr ();
|
||||
@@ -1,130 +0,0 @@
|
||||
/* error.c -- error handler for noninteractive utilities
|
||||
Copyright (C) 1990, 91, 92, 93, 94, 95 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
/* Written by David MacKenzie <[email protected]>. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#if HAVE_VPRINTF || HAVE_DOPRNT || _LIBC
|
||||
# if __STDC__
|
||||
# include <stdarg.h>
|
||||
# define VA_START(args, lastarg) va_start(args, lastarg)
|
||||
# else
|
||||
# include <varargs.h>
|
||||
# define VA_START(args, lastarg) va_start(args)
|
||||
# endif
|
||||
#else
|
||||
# define va_alist a1, a2, a3, a4, a5, a6, a7, a8
|
||||
# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
|
||||
#endif
|
||||
|
||||
#if STDC_HEADERS || _LIBC
|
||||
# include <stdlib.h>
|
||||
# include <string.h>
|
||||
#else
|
||||
void exit ();
|
||||
#endif
|
||||
|
||||
/* This variable is incremented each time `error' is called. */
|
||||
unsigned int error_message_count;
|
||||
|
||||
/* If NULL, error will flush stdout, then print on stderr the program
|
||||
name, a colon and a space. Otherwise, error will call this
|
||||
function without parameters instead. */
|
||||
void (*error_print_progname) () = NULL;
|
||||
|
||||
#ifdef _LIBC
|
||||
#define program_name program_invocation_name
|
||||
#endif
|
||||
|
||||
/* The calling program should define program_name and set it to the
|
||||
name of the executing program. */
|
||||
extern char *program_name;
|
||||
|
||||
#if HAVE_STRERROR || _LIBC
|
||||
# ifndef strerror /* On some systems, strerror is a macro */
|
||||
char *strerror ();
|
||||
# endif
|
||||
#else
|
||||
static char *
|
||||
private_strerror (errnum)
|
||||
int errnum;
|
||||
{
|
||||
extern char *sys_errlist[];
|
||||
extern int sys_nerr;
|
||||
|
||||
if (errnum > 0 && errnum <= sys_nerr)
|
||||
return sys_errlist[errnum];
|
||||
return "Unknown system error";
|
||||
}
|
||||
#define strerror private_strerror
|
||||
#endif
|
||||
|
||||
/* Print the program name and error message MESSAGE, which is a printf-style
|
||||
format string with optional args.
|
||||
If ERRNUM is nonzero, print its corresponding system error message.
|
||||
Exit with status STATUS if it is nonzero. */
|
||||
/* VARARGS */
|
||||
|
||||
void
|
||||
#if defined(VA_START) && __STDC__
|
||||
error (int status, int errnum, const char *message, ...)
|
||||
#else
|
||||
error (status, errnum, message, va_alist)
|
||||
int status;
|
||||
int errnum;
|
||||
char *message;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
#ifdef VA_START
|
||||
va_list args;
|
||||
#endif
|
||||
|
||||
if (error_print_progname)
|
||||
(*error_print_progname) ();
|
||||
else
|
||||
{
|
||||
fflush (stdout);
|
||||
fprintf (stderr, "%s: ", program_name);
|
||||
}
|
||||
|
||||
#ifdef VA_START
|
||||
VA_START (args, message);
|
||||
# if HAVE_VPRINTF || _LIBC
|
||||
vfprintf (stderr, message, args);
|
||||
# else
|
||||
_doprnt (message, args, stderr);
|
||||
# endif
|
||||
va_end (args);
|
||||
#else
|
||||
fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
|
||||
#endif
|
||||
|
||||
++error_message_count;
|
||||
|
||||
if (errnum)
|
||||
fprintf (stderr, ": %s", strerror (errnum));
|
||||
putc ('\n', stderr);
|
||||
fflush (stderr);
|
||||
if (status)
|
||||
exit (status);
|
||||
}
|
||||
@@ -1,199 +0,0 @@
|
||||
/* extern.h - External declarations for cpio. Requires system.h.
|
||||
Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
enum archive_format
|
||||
{
|
||||
arf_unknown, arf_binary, arf_oldascii, arf_newascii, arf_crcascii,
|
||||
arf_tar, arf_ustar, arf_hpoldascii, arf_hpbinary
|
||||
};
|
||||
extern enum archive_format archive_format;
|
||||
extern int reset_time_flag;
|
||||
extern int io_block_size;
|
||||
extern int create_dir_flag;
|
||||
extern int rename_flag;
|
||||
extern char *rename_batch_file;
|
||||
extern int table_flag;
|
||||
extern int unconditional_flag;
|
||||
extern int verbose_flag;
|
||||
extern int dot_flag;
|
||||
extern int link_flag;
|
||||
extern int retain_time_flag;
|
||||
extern int crc_i_flag;
|
||||
extern int append_flag;
|
||||
extern int swap_bytes_flag;
|
||||
extern int swap_halfwords_flag;
|
||||
extern int swapping_bytes;
|
||||
extern int swapping_halfwords;
|
||||
extern int set_owner_flag;
|
||||
extern uid_t set_owner;
|
||||
extern int set_group_flag;
|
||||
extern gid_t set_group;
|
||||
extern int no_chown_flag;
|
||||
extern int sparse_flag;
|
||||
extern int quiet_flag;
|
||||
extern int only_verify_crc_flag;
|
||||
extern int no_abs_paths_flag;
|
||||
|
||||
extern int last_header_start;
|
||||
extern int copy_matching_files;
|
||||
extern int numeric_uid;
|
||||
extern char *pattern_file_name;
|
||||
extern char *new_media_message;
|
||||
extern char *new_media_message_with_number;
|
||||
extern char *new_media_message_after_number;
|
||||
extern int archive_des;
|
||||
extern char *archive_name;
|
||||
extern unsigned long crc;
|
||||
#ifdef DEBUG_CPIO
|
||||
extern int debug_flag;
|
||||
#endif
|
||||
|
||||
extern char *input_buffer, *output_buffer;
|
||||
extern char *in_buff, *out_buff;
|
||||
extern long input_buffer_size;
|
||||
extern long input_size, output_size;
|
||||
#ifdef __GNUC__
|
||||
extern long long input_bytes, output_bytes;
|
||||
#else
|
||||
extern long input_bytes, output_bytes;
|
||||
#endif
|
||||
extern char zeros_512[];
|
||||
extern char *directory_name;
|
||||
extern char **save_patterns;
|
||||
extern int num_patterns;
|
||||
extern char name_end;
|
||||
extern char input_is_special;
|
||||
extern char output_is_special;
|
||||
extern char input_is_seekable;
|
||||
extern char output_is_seekable;
|
||||
extern int f_force_local;
|
||||
extern char *program_name;
|
||||
extern int (*xstat) ();
|
||||
extern void (*copy_function) ();
|
||||
|
||||
#if __STDC__ || defined(__MSDOS__)
|
||||
# define P_(s) s
|
||||
#else
|
||||
# define P_(s) ()
|
||||
#endif
|
||||
|
||||
/* copyin.c */
|
||||
void read_in_header P_((struct new_cpio_header *file_hdr, int in_des));
|
||||
void read_in_old_ascii P_((struct new_cpio_header *file_hdr, int in_des));
|
||||
void read_in_new_ascii P_((struct new_cpio_header *file_hdr, int in_des));
|
||||
void read_in_binary P_((struct new_cpio_header *file_hdr, int in_des));
|
||||
void swab_array P_((char *arg, int count));
|
||||
void process_copy_in P_((void));
|
||||
void long_format P_((struct new_cpio_header *file_hdr, char *link_name));
|
||||
void print_name_with_quoting P_((char *p));
|
||||
|
||||
/* copyout.c */
|
||||
void write_out_header P_((struct new_cpio_header *file_hdr, int out_des));
|
||||
void process_copy_out P_((void));
|
||||
|
||||
/* copypass.c */
|
||||
void process_copy_pass P_((void));
|
||||
int link_to_maj_min_ino P_((char *file_name, int st_dev_maj,
|
||||
int st_dev_min, int st_ino));
|
||||
int link_to_name P_((char *link_name, char *link_target));
|
||||
|
||||
/* dirname.c */
|
||||
char *dirname P_((char *path));
|
||||
|
||||
/* error.c */
|
||||
void error P_((int status, int errnum, char *message, ...));
|
||||
|
||||
/* filemode.c */
|
||||
void mode_string P_((unsigned int mode, char *str));
|
||||
|
||||
/* idcache.c */
|
||||
#ifndef __MSDOS__
|
||||
char *getgroup ();
|
||||
char *getuser ();
|
||||
uid_t *getuidbyname ();
|
||||
gid_t *getgidbyname ();
|
||||
#endif
|
||||
|
||||
/* lchown.c */
|
||||
#ifdef HAVE_LCHOWN
|
||||
int lchown P_((const char *path, uid_t owner, gid_t group));
|
||||
#endif
|
||||
|
||||
/* main.c */
|
||||
void process_args P_((int argc, char *argv[]));
|
||||
void initialize_buffers P_((void));
|
||||
|
||||
/* makepath.c */
|
||||
int make_path P_((char *argpath, int mode, int parent_mode,
|
||||
uid_t owner, gid_t group, char *verbose_fmt_string));
|
||||
|
||||
/* stripslash.c */
|
||||
void strip_trailing_slashes P_((char *path));
|
||||
|
||||
/* tar.c */
|
||||
void write_out_tar_header P_((struct new_cpio_header *file_hdr, int out_des));
|
||||
int null_block P_((long *block, int size));
|
||||
void read_in_tar_header P_((struct new_cpio_header *file_hdr, int in_des));
|
||||
int otoa P_((char *s, unsigned long *n));
|
||||
int is_tar_header P_((char *buf));
|
||||
int is_tar_filename_too_long P_((char *name));
|
||||
|
||||
/* userspec.c */
|
||||
#ifndef __MSDOS__
|
||||
char *parse_user_spec P_((char *name, uid_t *uid, gid_t *gid,
|
||||
char **username, char **groupname));
|
||||
#endif
|
||||
|
||||
/* util.c */
|
||||
void tape_empty_output_buffer P_((int out_des));
|
||||
void disk_empty_output_buffer P_((int out_des));
|
||||
void swahw_array P_((char *ptr, int count));
|
||||
void tape_buffered_write P_((char *in_buf, int out_des, long num_bytes));
|
||||
void tape_buffered_read P_((char *in_buf, int in_des, long num_bytes));
|
||||
int tape_buffered_peek P_((char *peek_buf, int in_des, int num_bytes));
|
||||
void tape_toss_input P_((int in_des, long num_bytes));
|
||||
void copy_files_tape_to_disk P_((int in_des, int out_des, long num_bytes));
|
||||
void copy_files_disk_to_tape P_((int in_des, int out_des, long num_bytes, char *filename));
|
||||
void copy_files_disk_to_disk P_((int in_des, int out_des, long num_bytes, char *filename));
|
||||
void create_all_directories P_((char *name));
|
||||
void prepare_append P_((int out_file_des));
|
||||
char *find_inode_file P_((unsigned long node_num,
|
||||
unsigned long major_num, unsigned long minor_num));
|
||||
void add_inode P_((unsigned long node_num, char *file_name,
|
||||
unsigned long major_num, unsigned long minor_num));
|
||||
int open_archive P_((char *file));
|
||||
void tape_offline P_((int tape_des));
|
||||
void get_next_reel P_((int tape_des));
|
||||
void set_new_media_message P_((char *message));
|
||||
#if defined(__MSDOS__) && !defined(__GNUC__)
|
||||
int chown P_((char *path, int owner, int group));
|
||||
#endif
|
||||
#ifdef __TURBOC__
|
||||
int utime P_((char *filename, struct utimbuf *utb));
|
||||
#endif
|
||||
#ifdef HPUX_CDF
|
||||
char *add_cdf_double_slashes P_((char *filename));
|
||||
#endif
|
||||
|
||||
/* xmalloc.c */
|
||||
char *xmalloc P_((unsigned n));
|
||||
char *xrealloc P_((char *p, unsigned n));
|
||||
|
||||
/* xstrdup.c */
|
||||
char *xstrdup P_((char *string));
|
||||
|
||||
#define DISK_IO_BLOCK_SIZE (512)
|
||||
@@ -1,255 +0,0 @@
|
||||
/* filemode.c -- make a string describing file modes
|
||||
Copyright (C) 1985, 1990, 1993 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#if !S_IRUSR
|
||||
# if S_IREAD
|
||||
# define S_IRUSR S_IREAD
|
||||
# else
|
||||
# define S_IRUSR 00400
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !S_IWUSR
|
||||
# if S_IWRITE
|
||||
# define S_IWUSR S_IWRITE
|
||||
# else
|
||||
# define S_IWUSR 00200
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !S_IXUSR
|
||||
# if S_IEXEC
|
||||
# define S_IXUSR S_IEXEC
|
||||
# else
|
||||
# define S_IXUSR 00100
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef STAT_MACROS_BROKEN
|
||||
#undef S_ISBLK
|
||||
#undef S_ISCHR
|
||||
#undef S_ISDIR
|
||||
#undef S_ISFIFO
|
||||
#undef S_ISLNK
|
||||
#undef S_ISMPB
|
||||
#undef S_ISMPC
|
||||
#undef S_ISNWK
|
||||
#undef S_ISREG
|
||||
#undef S_ISSOCK
|
||||
#endif /* STAT_MACROS_BROKEN. */
|
||||
|
||||
#if !defined(S_ISBLK) && defined(S_IFBLK)
|
||||
#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
|
||||
#endif
|
||||
#if !defined(S_ISCHR) && defined(S_IFCHR)
|
||||
#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
|
||||
#endif
|
||||
#if !defined(S_ISDIR) && defined(S_IFDIR)
|
||||
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
||||
#endif
|
||||
#if !defined(S_ISREG) && defined(S_IFREG)
|
||||
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
|
||||
#endif
|
||||
#if !defined(S_ISFIFO) && defined(S_IFIFO)
|
||||
#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
|
||||
#endif
|
||||
#if !defined(S_ISLNK) && defined(S_IFLNK)
|
||||
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
|
||||
#endif
|
||||
#if !defined(S_ISSOCK) && defined(S_IFSOCK)
|
||||
#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
|
||||
#endif
|
||||
#if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */
|
||||
#define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
|
||||
#define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
|
||||
#endif
|
||||
#if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */
|
||||
#define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
|
||||
#endif
|
||||
|
||||
void mode_string ();
|
||||
static char ftypelet ();
|
||||
static void rwx ();
|
||||
static void setst ();
|
||||
|
||||
/* filemodestring - fill in string STR with an ls-style ASCII
|
||||
representation of the st_mode field of file stats block STATP.
|
||||
10 characters are stored in STR; no terminating null is added.
|
||||
The characters stored in STR are:
|
||||
|
||||
0 File type. 'd' for directory, 'c' for character
|
||||
special, 'b' for block special, 'm' for multiplex,
|
||||
'l' for symbolic link, 's' for socket, 'p' for fifo,
|
||||
'-' for regular, '?' for any other file type
|
||||
|
||||
1 'r' if the owner may read, '-' otherwise.
|
||||
|
||||
2 'w' if the owner may write, '-' otherwise.
|
||||
|
||||
3 'x' if the owner may execute, 's' if the file is
|
||||
set-user-id, '-' otherwise.
|
||||
'S' if the file is set-user-id, but the execute
|
||||
bit isn't set.
|
||||
|
||||
4 'r' if group members may read, '-' otherwise.
|
||||
|
||||
5 'w' if group members may write, '-' otherwise.
|
||||
|
||||
6 'x' if group members may execute, 's' if the file is
|
||||
set-group-id, '-' otherwise.
|
||||
'S' if it is set-group-id but not executable.
|
||||
|
||||
7 'r' if any user may read, '-' otherwise.
|
||||
|
||||
8 'w' if any user may write, '-' otherwise.
|
||||
|
||||
9 'x' if any user may execute, 't' if the file is "sticky"
|
||||
(will be retained in swap space after execution), '-'
|
||||
otherwise.
|
||||
'T' if the file is sticky but not executable. */
|
||||
|
||||
void
|
||||
filemodestring (statp, str)
|
||||
struct stat *statp;
|
||||
char *str;
|
||||
{
|
||||
mode_string (statp->st_mode, str);
|
||||
}
|
||||
|
||||
/* Like filemodestring, but only the relevant part of the `struct stat'
|
||||
is given as an argument. */
|
||||
|
||||
void
|
||||
mode_string (mode, str)
|
||||
unsigned short mode;
|
||||
char *str;
|
||||
{
|
||||
str[0] = ftypelet ((long) mode);
|
||||
rwx ((mode & 0700) << 0, &str[1]);
|
||||
rwx ((mode & 0070) << 3, &str[4]);
|
||||
rwx ((mode & 0007) << 6, &str[7]);
|
||||
setst (mode, str);
|
||||
}
|
||||
|
||||
/* Return a character indicating the type of file described by
|
||||
file mode BITS:
|
||||
'd' for directories
|
||||
'b' for block special files
|
||||
'c' for character special files
|
||||
'm' for multiplexor files
|
||||
'l' for symbolic links
|
||||
's' for sockets
|
||||
'p' for fifos
|
||||
'-' for regular files
|
||||
'?' for any other file type. */
|
||||
|
||||
static char
|
||||
ftypelet (bits)
|
||||
long bits;
|
||||
{
|
||||
#ifdef S_ISBLK
|
||||
if (S_ISBLK (bits))
|
||||
return 'b';
|
||||
#endif
|
||||
if (S_ISCHR (bits))
|
||||
return 'c';
|
||||
if (S_ISDIR (bits))
|
||||
return 'd';
|
||||
if (S_ISREG (bits))
|
||||
return '-';
|
||||
#ifdef S_ISFIFO
|
||||
if (S_ISFIFO (bits))
|
||||
return 'p';
|
||||
#endif
|
||||
#ifdef S_ISLNK
|
||||
if (S_ISLNK (bits))
|
||||
return 'l';
|
||||
#endif
|
||||
#ifdef S_ISSOCK
|
||||
if (S_ISSOCK (bits))
|
||||
return 's';
|
||||
#endif
|
||||
#ifdef S_ISMPC
|
||||
if (S_ISMPC (bits))
|
||||
return 'm';
|
||||
#endif
|
||||
#ifdef S_ISNWK
|
||||
if (S_ISNWK (bits))
|
||||
return 'n';
|
||||
#endif
|
||||
return '?';
|
||||
}
|
||||
|
||||
/* Look at read, write, and execute bits in BITS and set
|
||||
flags in CHARS accordingly. */
|
||||
|
||||
static void
|
||||
rwx (bits, chars)
|
||||
unsigned short bits;
|
||||
char *chars;
|
||||
{
|
||||
chars[0] = (bits & S_IRUSR) ? 'r' : '-';
|
||||
chars[1] = (bits & S_IWUSR) ? 'w' : '-';
|
||||
chars[2] = (bits & S_IXUSR) ? 'x' : '-';
|
||||
}
|
||||
|
||||
/* Set the 's' and 't' flags in file attributes string CHARS,
|
||||
according to the file mode BITS. */
|
||||
|
||||
static void
|
||||
setst (bits, chars)
|
||||
unsigned short bits;
|
||||
char *chars;
|
||||
{
|
||||
#ifdef S_ISUID
|
||||
if (bits & S_ISUID)
|
||||
{
|
||||
if (chars[3] != 'x')
|
||||
/* Set-uid, but not executable by owner. */
|
||||
chars[3] = 'S';
|
||||
else
|
||||
chars[3] = 's';
|
||||
}
|
||||
#endif
|
||||
#ifdef S_ISGID
|
||||
if (bits & S_ISGID)
|
||||
{
|
||||
if (chars[6] != 'x')
|
||||
/* Set-gid, but not executable by group. */
|
||||
chars[6] = 'S';
|
||||
else
|
||||
chars[6] = 's';
|
||||
}
|
||||
#endif
|
||||
#ifdef S_ISVTX
|
||||
if (bits & S_ISVTX)
|
||||
{
|
||||
if (chars[9] != 'x')
|
||||
/* Sticky, but not executable by others. */
|
||||
chars[9] = 'T';
|
||||
else
|
||||
chars[9] = 't';
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -1,84 +0,0 @@
|
||||
/* filetypes.h - deal with POSIX annoyances
|
||||
Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
/* Include sys/types.h and sys/stat.h before this file. */
|
||||
|
||||
#ifndef S_ISREG /* Doesn't have POSIX.1 stat stuff. */
|
||||
#define mode_t unsigned short
|
||||
#endif
|
||||
|
||||
/* Define the POSIX macros for systems that lack them. */
|
||||
#if !defined(S_ISBLK) && defined(S_IFBLK)
|
||||
#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
|
||||
#endif
|
||||
#if !defined(S_ISCHR) && defined(S_IFCHR)
|
||||
#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
|
||||
#endif
|
||||
#if !defined(S_ISDIR) && defined(S_IFDIR)
|
||||
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
||||
#endif
|
||||
#if !defined(S_ISREG) && defined(S_IFREG)
|
||||
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
|
||||
#endif
|
||||
#if !defined(S_ISFIFO) && defined(S_IFIFO)
|
||||
#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
|
||||
#endif
|
||||
#if !defined(S_ISLNK) && defined(S_IFLNK)
|
||||
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
|
||||
#endif
|
||||
#if !defined(S_ISSOCK) && defined(S_IFSOCK)
|
||||
#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
|
||||
#endif
|
||||
#if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX network special */
|
||||
#define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
|
||||
#endif
|
||||
|
||||
/* Define the file type bits used in cpio archives.
|
||||
They have the same values as the S_IF bits in traditional Unix. */
|
||||
|
||||
#define CP_IFMT 0170000 /* Mask for all file type bits. */
|
||||
|
||||
#if defined(S_ISBLK)
|
||||
#define CP_IFBLK 0060000
|
||||
#endif
|
||||
#if defined(S_ISCHR)
|
||||
#define CP_IFCHR 0020000
|
||||
#endif
|
||||
#if defined(S_ISDIR)
|
||||
#define CP_IFDIR 0040000
|
||||
#endif
|
||||
#if defined(S_ISREG)
|
||||
#define CP_IFREG 0100000
|
||||
#endif
|
||||
#if defined(S_ISFIFO)
|
||||
#define CP_IFIFO 0010000
|
||||
#endif
|
||||
#if defined(S_ISLNK)
|
||||
#define CP_IFLNK 0120000
|
||||
#endif
|
||||
#if defined(S_ISSOCK)
|
||||
#define CP_IFSOCK 0140000
|
||||
#endif
|
||||
#if defined(S_ISNWK)
|
||||
#define CP_IFNWK 0110000
|
||||
#endif
|
||||
|
||||
#ifndef S_ISLNK
|
||||
#define lstat stat
|
||||
#endif
|
||||
int lstat ();
|
||||
int stat ();
|
||||
@@ -1,765 +0,0 @@
|
||||
/* Getopt for GNU.
|
||||
NOTE: getopt is now part of the C library, so if you don't know what
|
||||
"Keep this file name-space clean" means, talk to [email protected]
|
||||
before changing it!
|
||||
|
||||
Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
|
||||
Ditto for AIX 3.2 and <stdlib.h>. */
|
||||
#ifndef _NO_PROTO
|
||||
#define _NO_PROTO
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#if !defined (__STDC__) || !__STDC__
|
||||
/* This is a separate conditional since some stdc systems
|
||||
reject `defined (const)'. */
|
||||
#ifndef const
|
||||
#define const
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* Comment out all this code if we are using the GNU C Library, and are not
|
||||
actually compiling the library itself. This code is part of the GNU C
|
||||
Library, but also included in many other GNU distributions. Compiling
|
||||
and linking in this code is a waste when using the GNU C library
|
||||
(especially if it is a shared library). Rather than having every GNU
|
||||
program understand `configure --with-gnu-libc' and omit the object files,
|
||||
it is simpler to just do this in the source for each such file. */
|
||||
|
||||
#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
|
||||
|
||||
|
||||
/* This needs to come after some library #include
|
||||
to get __GNU_LIBRARY__ defined. */
|
||||
#ifdef __GNU_LIBRARY__
|
||||
/* Don't include stdlib.h for non-GNU C libraries because some of them
|
||||
contain conflicting prototypes for getopt. */
|
||||
#include <stdlib.h>
|
||||
#endif /* GNU C library. */
|
||||
|
||||
#ifndef _
|
||||
/* This is for other GNU distributions with internationalized messages.
|
||||
When compiling libc, the _ macro is predefined. */
|
||||
#ifdef HAVE_LIBINTL_H
|
||||
# include <libintl.h>
|
||||
# define _(msgid) gettext (msgid)
|
||||
#else
|
||||
# define _(msgid) (msgid)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* This version of `getopt' appears to the caller like standard Unix `getopt'
|
||||
but it behaves differently for the user, since it allows the user
|
||||
to intersperse the options with the other arguments.
|
||||
|
||||
As `getopt' works, it permutes the elements of ARGV so that,
|
||||
when it is done, all the options precede everything else. Thus
|
||||
all application programs are extended to handle flexible argument order.
|
||||
|
||||
Setting the environment variable POSIXLY_CORRECT disables permutation.
|
||||
Then the behavior is completely standard.
|
||||
|
||||
GNU application programs can use a third alternative mode in which
|
||||
they can distinguish the relative order of options and other arguments. */
|
||||
|
||||
#include "getopt.h"
|
||||
|
||||
/* For communication from `getopt' to the caller.
|
||||
When `getopt' finds an option that takes an argument,
|
||||
the argument value is returned here.
|
||||
Also, when `ordering' is RETURN_IN_ORDER,
|
||||
each non-option ARGV-element is returned here. */
|
||||
|
||||
char *optarg = NULL;
|
||||
|
||||
/* Index in ARGV of the next element to be scanned.
|
||||
This is used for communication to and from the caller
|
||||
and for communication between successive calls to `getopt'.
|
||||
|
||||
On entry to `getopt', zero means this is the first call; initialize.
|
||||
|
||||
When `getopt' returns EOF, this is the index of the first of the
|
||||
non-option elements that the caller should itself scan.
|
||||
|
||||
Otherwise, `optind' communicates from one call to the next
|
||||
how much of ARGV has been scanned so far. */
|
||||
|
||||
/* XXX 1003.2 says this must be 1 before any call. */
|
||||
int optind = 0;
|
||||
|
||||
/* The next char to be scanned in the option-element
|
||||
in which the last option character we returned was found.
|
||||
This allows us to pick up the scan where we left off.
|
||||
|
||||
If this is zero, or a null string, it means resume the scan
|
||||
by advancing to the next ARGV-element. */
|
||||
|
||||
static char *nextchar;
|
||||
|
||||
/* Callers store zero here to inhibit the error message
|
||||
for unrecognized options. */
|
||||
|
||||
int opterr = 1;
|
||||
|
||||
/* Set to an option character which was unrecognized.
|
||||
This must be initialized on some systems to avoid linking in the
|
||||
system's own getopt implementation. */
|
||||
|
||||
int optopt = '?';
|
||||
|
||||
/* Describe how to deal with options that follow non-option ARGV-elements.
|
||||
|
||||
If the caller did not specify anything,
|
||||
the default is REQUIRE_ORDER if the environment variable
|
||||
POSIXLY_CORRECT is defined, PERMUTE otherwise.
|
||||
|
||||
REQUIRE_ORDER means don't recognize them as options;
|
||||
stop option processing when the first non-option is seen.
|
||||
This is what Unix does.
|
||||
This mode of operation is selected by either setting the environment
|
||||
variable POSIXLY_CORRECT, or using `+' as the first character
|
||||
of the list of option characters.
|
||||
|
||||
PERMUTE is the default. We permute the contents of ARGV as we scan,
|
||||
so that eventually all the non-options are at the end. This allows options
|
||||
to be given in any order, even with programs that were not written to
|
||||
expect this.
|
||||
|
||||
RETURN_IN_ORDER is an option available to programs that were written
|
||||
to expect options and other ARGV-elements in any order and that care about
|
||||
the ordering of the two. We describe each non-option ARGV-element
|
||||
as if it were the argument of an option with character code 1.
|
||||
Using `-' as the first character of the list of option characters
|
||||
selects this mode of operation.
|
||||
|
||||
The special argument `--' forces an end of option-scanning regardless
|
||||
of the value of `ordering'. In the case of RETURN_IN_ORDER, only
|
||||
`--' can cause `getopt' to return EOF with `optind' != ARGC. */
|
||||
|
||||
static enum
|
||||
{
|
||||
REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
|
||||
} ordering;
|
||||
|
||||
/* Value of POSIXLY_CORRECT environment variable. */
|
||||
static char *posixly_correct;
|
||||
|
||||
#ifdef __GNU_LIBRARY__
|
||||
/* We want to avoid inclusion of string.h with non-GNU libraries
|
||||
because there are many ways it can cause trouble.
|
||||
On some systems, it contains special magic macros that don't work
|
||||
in GCC. */
|
||||
#include <string.h>
|
||||
#define my_index strchr
|
||||
#else
|
||||
|
||||
/* Avoid depending on library functions or files
|
||||
whose names are inconsistent. */
|
||||
|
||||
char *getenv ();
|
||||
|
||||
static char *
|
||||
my_index (str, chr)
|
||||
const char *str;
|
||||
int chr;
|
||||
{
|
||||
while (*str)
|
||||
{
|
||||
if (*str == chr)
|
||||
return (char *) str;
|
||||
str++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* If using GCC, we can safely declare strlen this way.
|
||||
If not using GCC, it is ok not to declare it. */
|
||||
#ifdef __GNUC__
|
||||
/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
|
||||
That was relevant to code that was here before. */
|
||||
#if !defined (__STDC__) || !__STDC__
|
||||
/* gcc with -traditional declares the built-in strlen to return int,
|
||||
and has done so at least since version 2.4.5. -- rms. */
|
||||
extern int strlen (const char *);
|
||||
#endif /* not __STDC__ */
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
#endif /* not __GNU_LIBRARY__ */
|
||||
|
||||
/* Handle permutation of arguments. */
|
||||
|
||||
/* Describe the part of ARGV that contains non-options that have
|
||||
been skipped. `first_nonopt' is the index in ARGV of the first of them;
|
||||
`last_nonopt' is the index after the last of them. */
|
||||
|
||||
static int first_nonopt;
|
||||
static int last_nonopt;
|
||||
|
||||
/* Exchange two adjacent subsequences of ARGV.
|
||||
One subsequence is elements [first_nonopt,last_nonopt)
|
||||
which contains all the non-options that have been skipped so far.
|
||||
The other is elements [last_nonopt,optind), which contains all
|
||||
the options processed since those non-options were skipped.
|
||||
|
||||
`first_nonopt' and `last_nonopt' are relocated so that they describe
|
||||
the new indices of the non-options in ARGV after they are moved. */
|
||||
|
||||
static void
|
||||
exchange (argv)
|
||||
char **argv;
|
||||
{
|
||||
int bottom = first_nonopt;
|
||||
int middle = last_nonopt;
|
||||
int top = optind;
|
||||
char *tem;
|
||||
|
||||
/* Exchange the shorter segment with the far end of the longer segment.
|
||||
That puts the shorter segment into the right place.
|
||||
It leaves the longer segment in the right place overall,
|
||||
but it consists of two parts that need to be swapped next. */
|
||||
|
||||
while (top > middle && middle > bottom)
|
||||
{
|
||||
if (top - middle > middle - bottom)
|
||||
{
|
||||
/* Bottom segment is the short one. */
|
||||
int len = middle - bottom;
|
||||
register int i;
|
||||
|
||||
/* Swap it with the top part of the top segment. */
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
tem = argv[bottom + i];
|
||||
argv[bottom + i] = argv[top - (middle - bottom) + i];
|
||||
argv[top - (middle - bottom) + i] = tem;
|
||||
}
|
||||
/* Exclude the moved bottom segment from further swapping. */
|
||||
top -= len;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Top segment is the short one. */
|
||||
int len = top - middle;
|
||||
register int i;
|
||||
|
||||
/* Swap it with the bottom part of the bottom segment. */
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
tem = argv[bottom + i];
|
||||
argv[bottom + i] = argv[middle + i];
|
||||
argv[middle + i] = tem;
|
||||
}
|
||||
/* Exclude the moved top segment from further swapping. */
|
||||
bottom += len;
|
||||
}
|
||||
}
|
||||
|
||||
/* Update records for the slots the non-options now occupy. */
|
||||
|
||||
first_nonopt += (optind - last_nonopt);
|
||||
last_nonopt = optind;
|
||||
}
|
||||
|
||||
/* Initialize the internal data when the first call is made. */
|
||||
|
||||
static const char *
|
||||
_getopt_initialize (optstring)
|
||||
const char *optstring;
|
||||
{
|
||||
/* Start processing options with ARGV-element 1 (since ARGV-element 0
|
||||
is the program name); the sequence of previously skipped
|
||||
non-option ARGV-elements is empty. */
|
||||
|
||||
first_nonopt = last_nonopt = optind = 1;
|
||||
|
||||
nextchar = NULL;
|
||||
|
||||
posixly_correct = getenv ("POSIXLY_CORRECT");
|
||||
|
||||
/* Determine how to handle the ordering of options and nonoptions. */
|
||||
|
||||
if (optstring[0] == '-')
|
||||
{
|
||||
ordering = RETURN_IN_ORDER;
|
||||
++optstring;
|
||||
}
|
||||
else if (optstring[0] == '+')
|
||||
{
|
||||
ordering = REQUIRE_ORDER;
|
||||
++optstring;
|
||||
}
|
||||
else if (posixly_correct != NULL)
|
||||
ordering = REQUIRE_ORDER;
|
||||
else
|
||||
ordering = PERMUTE;
|
||||
|
||||
return optstring;
|
||||
}
|
||||
|
||||
/* Scan elements of ARGV (whose length is ARGC) for option characters
|
||||
given in OPTSTRING.
|
||||
|
||||
If an element of ARGV starts with '-', and is not exactly "-" or "--",
|
||||
then it is an option element. The characters of this element
|
||||
(aside from the initial '-') are option characters. If `getopt'
|
||||
is called repeatedly, it returns successively each of the option characters
|
||||
from each of the option elements.
|
||||
|
||||
If `getopt' finds another option character, it returns that character,
|
||||
updating `optind' and `nextchar' so that the next call to `getopt' can
|
||||
resume the scan with the following option character or ARGV-element.
|
||||
|
||||
If there are no more option characters, `getopt' returns `EOF'.
|
||||
Then `optind' is the index in ARGV of the first ARGV-element
|
||||
that is not an option. (The ARGV-elements have been permuted
|
||||
so that those that are not options now come last.)
|
||||
|
||||
OPTSTRING is a string containing the legitimate option characters.
|
||||
If an option character is seen that is not listed in OPTSTRING,
|
||||
return '?' after printing an error message. If you set `opterr' to
|
||||
zero, the error message is suppressed but we still return '?'.
|
||||
|
||||
If a char in OPTSTRING is followed by a colon, that means it wants an arg,
|
||||
so the following text in the same ARGV-element, or the text of the following
|
||||
ARGV-element, is returned in `optarg'. Two colons mean an option that
|
||||
wants an optional arg; if there is text in the current ARGV-element,
|
||||
it is returned in `optarg', otherwise `optarg' is set to zero.
|
||||
|
||||
If OPTSTRING starts with `-' or `+', it requests different methods of
|
||||
handling the non-option ARGV-elements.
|
||||
See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
|
||||
|
||||
Long-named options begin with `--' instead of `-'.
|
||||
Their names may be abbreviated as long as the abbreviation is unique
|
||||
or is an exact match for some defined option. If they have an
|
||||
argument, it follows the option name in the same ARGV-element, separated
|
||||
from the option name by a `=', or else the in next ARGV-element.
|
||||
When `getopt' finds a long-named option, it returns 0 if that option's
|
||||
`flag' field is nonzero, the value of the option's `val' field
|
||||
if the `flag' field is zero.
|
||||
|
||||
The elements of ARGV aren't really const, because we permute them.
|
||||
But we pretend they're const in the prototype to be compatible
|
||||
with other systems.
|
||||
|
||||
LONGOPTS is a vector of `struct option' terminated by an
|
||||
element containing a name which is zero.
|
||||
|
||||
LONGIND returns the index in LONGOPT of the long-named option found.
|
||||
It is only valid when a long-named option has been found by the most
|
||||
recent call.
|
||||
|
||||
If LONG_ONLY is nonzero, '-' as well as '--' can introduce
|
||||
long-named options. */
|
||||
|
||||
int
|
||||
_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
||||
int argc;
|
||||
char *const *argv;
|
||||
const char *optstring;
|
||||
const struct option *longopts;
|
||||
int *longind;
|
||||
int long_only;
|
||||
{
|
||||
optarg = NULL;
|
||||
|
||||
if (optind == 0)
|
||||
{
|
||||
optstring = _getopt_initialize (optstring);
|
||||
optind = 1; /* Don't scan ARGV[0], the program name. */
|
||||
}
|
||||
|
||||
if (nextchar == NULL || *nextchar == '\0')
|
||||
{
|
||||
/* Advance to the next ARGV-element. */
|
||||
|
||||
if (ordering == PERMUTE)
|
||||
{
|
||||
/* If we have just processed some options following some non-options,
|
||||
exchange them so that the options come first. */
|
||||
|
||||
if (first_nonopt != last_nonopt && last_nonopt != optind)
|
||||
exchange ((char **) argv);
|
||||
else if (last_nonopt != optind)
|
||||
first_nonopt = optind;
|
||||
|
||||
/* Skip any additional non-options
|
||||
and extend the range of non-options previously skipped. */
|
||||
|
||||
while (optind < argc
|
||||
&& (argv[optind][0] != '-' || argv[optind][1] == '\0'))
|
||||
optind++;
|
||||
last_nonopt = optind;
|
||||
}
|
||||
|
||||
/* The special ARGV-element `--' means premature end of options.
|
||||
Skip it like a null option,
|
||||
then exchange with previous non-options as if it were an option,
|
||||
then skip everything else like a non-option. */
|
||||
|
||||
if (optind != argc && !strcmp (argv[optind], "--"))
|
||||
{
|
||||
optind++;
|
||||
|
||||
if (first_nonopt != last_nonopt && last_nonopt != optind)
|
||||
exchange ((char **) argv);
|
||||
else if (first_nonopt == last_nonopt)
|
||||
first_nonopt = optind;
|
||||
last_nonopt = argc;
|
||||
|
||||
optind = argc;
|
||||
}
|
||||
|
||||
/* If we have done all the ARGV-elements, stop the scan
|
||||
and back over any non-options that we skipped and permuted. */
|
||||
|
||||
if (optind == argc)
|
||||
{
|
||||
/* Set the next-arg-index to point at the non-options
|
||||
that we previously skipped, so the caller will digest them. */
|
||||
if (first_nonopt != last_nonopt)
|
||||
optind = first_nonopt;
|
||||
return EOF;
|
||||
}
|
||||
|
||||
/* If we have come to a non-option and did not permute it,
|
||||
either stop the scan or describe it to the caller and pass it by. */
|
||||
|
||||
if ((argv[optind][0] != '-' || argv[optind][1] == '\0'))
|
||||
{
|
||||
if (ordering == REQUIRE_ORDER)
|
||||
return EOF;
|
||||
optarg = argv[optind++];
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* We have found another option-ARGV-element.
|
||||
Skip the initial punctuation. */
|
||||
|
||||
nextchar = (argv[optind] + 1
|
||||
+ (longopts != NULL && argv[optind][1] == '-'));
|
||||
}
|
||||
|
||||
/* Decode the current option-ARGV-element. */
|
||||
|
||||
/* Check whether the ARGV-element is a long option.
|
||||
|
||||
If long_only and the ARGV-element has the form "-f", where f is
|
||||
a valid short option, don't consider it an abbreviated form of
|
||||
a long option that starts with f. Otherwise there would be no
|
||||
way to give the -f short option.
|
||||
|
||||
On the other hand, if there's a long option "fubar" and
|
||||
the ARGV-element is "-fu", do consider that an abbreviation of
|
||||
the long option, just like "--fu", and not "-f" with arg "u".
|
||||
|
||||
This distinction seems to be the most useful approach. */
|
||||
|
||||
if (longopts != NULL
|
||||
&& (argv[optind][1] == '-'
|
||||
|| (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
|
||||
{
|
||||
char *nameend;
|
||||
const struct option *p;
|
||||
const struct option *pfound = NULL;
|
||||
int exact = 0;
|
||||
int ambig = 0;
|
||||
int indfound;
|
||||
int option_index;
|
||||
|
||||
for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
|
||||
/* Do nothing. */ ;
|
||||
|
||||
/* Test all long options for either exact match
|
||||
or abbreviated matches. */
|
||||
for (p = longopts, option_index = 0; p->name; p++, option_index++)
|
||||
if (!strncmp (p->name, nextchar, nameend - nextchar))
|
||||
{
|
||||
if (nameend - nextchar == strlen (p->name))
|
||||
{
|
||||
/* Exact match found. */
|
||||
pfound = p;
|
||||
indfound = option_index;
|
||||
exact = 1;
|
||||
break;
|
||||
}
|
||||
else if (pfound == NULL)
|
||||
{
|
||||
/* First nonexact match found. */
|
||||
pfound = p;
|
||||
indfound = option_index;
|
||||
}
|
||||
else
|
||||
/* Second or later nonexact match found. */
|
||||
ambig = 1;
|
||||
}
|
||||
|
||||
if (ambig && !exact)
|
||||
{
|
||||
if (opterr)
|
||||
fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
|
||||
argv[0], argv[optind]);
|
||||
nextchar += strlen (nextchar);
|
||||
optind++;
|
||||
return '?';
|
||||
}
|
||||
|
||||
if (pfound != NULL)
|
||||
{
|
||||
option_index = indfound;
|
||||
optind++;
|
||||
if (*nameend)
|
||||
{
|
||||
/* Don't test has_arg with >, because some C compilers don't
|
||||
allow it to be used on enums. */
|
||||
if (pfound->has_arg)
|
||||
optarg = nameend + 1;
|
||||
else
|
||||
{
|
||||
if (opterr)
|
||||
if (argv[optind - 1][1] == '-')
|
||||
/* --option */
|
||||
fprintf (stderr,
|
||||
_("%s: option `--%s' doesn't allow an argument\n"),
|
||||
argv[0], pfound->name);
|
||||
else
|
||||
/* +option or -option */
|
||||
fprintf (stderr,
|
||||
_("%s: option `%c%s' doesn't allow an argument\n"),
|
||||
argv[0], argv[optind - 1][0], pfound->name);
|
||||
|
||||
nextchar += strlen (nextchar);
|
||||
return '?';
|
||||
}
|
||||
}
|
||||
else if (pfound->has_arg == 1)
|
||||
{
|
||||
if (optind < argc)
|
||||
optarg = argv[optind++];
|
||||
else
|
||||
{
|
||||
if (opterr)
|
||||
fprintf (stderr,
|
||||
_("%s: option `%s' requires an argument\n"),
|
||||
argv[0], argv[optind - 1]);
|
||||
nextchar += strlen (nextchar);
|
||||
return optstring[0] == ':' ? ':' : '?';
|
||||
}
|
||||
}
|
||||
nextchar += strlen (nextchar);
|
||||
if (longind != NULL)
|
||||
*longind = option_index;
|
||||
if (pfound->flag)
|
||||
{
|
||||
*(pfound->flag) = pfound->val;
|
||||
return 0;
|
||||
}
|
||||
return pfound->val;
|
||||
}
|
||||
|
||||
/* Can't find it as a long option. If this is not getopt_long_only,
|
||||
or the option starts with '--' or is not a valid short
|
||||
option, then it's an error.
|
||||
Otherwise interpret it as a short option. */
|
||||
if (!long_only || argv[optind][1] == '-'
|
||||
|| my_index (optstring, *nextchar) == NULL)
|
||||
{
|
||||
if (opterr)
|
||||
{
|
||||
if (argv[optind][1] == '-')
|
||||
/* --option */
|
||||
fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
|
||||
argv[0], nextchar);
|
||||
else
|
||||
/* +option or -option */
|
||||
fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
|
||||
argv[0], argv[optind][0], nextchar);
|
||||
}
|
||||
nextchar = (char *) "";
|
||||
optind++;
|
||||
return '?';
|
||||
}
|
||||
}
|
||||
|
||||
/* Look at and handle the next short option-character. */
|
||||
|
||||
{
|
||||
char c = *nextchar++;
|
||||
char *temp = my_index (optstring, c);
|
||||
|
||||
/* Increment `optind' when we start to process its last character. */
|
||||
if (*nextchar == '\0')
|
||||
++optind;
|
||||
|
||||
if (temp == NULL || c == ':')
|
||||
{
|
||||
if (opterr)
|
||||
{
|
||||
if (posixly_correct)
|
||||
/* 1003.2 specifies the format of this message. */
|
||||
fprintf (stderr, _("%s: illegal option -- %c\n"),
|
||||
argv[0], c);
|
||||
else
|
||||
fprintf (stderr, _("%s: invalid option -- %c\n"),
|
||||
argv[0], c);
|
||||
}
|
||||
optopt = c;
|
||||
return '?';
|
||||
}
|
||||
if (temp[1] == ':')
|
||||
{
|
||||
if (temp[2] == ':')
|
||||
{
|
||||
/* This is an option that accepts an argument optionally. */
|
||||
if (*nextchar != '\0')
|
||||
{
|
||||
optarg = nextchar;
|
||||
optind++;
|
||||
}
|
||||
else
|
||||
optarg = NULL;
|
||||
nextchar = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* This is an option that requires an argument. */
|
||||
if (*nextchar != '\0')
|
||||
{
|
||||
optarg = nextchar;
|
||||
/* If we end this ARGV-element by taking the rest as an arg,
|
||||
we must advance to the next element now. */
|
||||
optind++;
|
||||
}
|
||||
else if (optind == argc)
|
||||
{
|
||||
if (opterr)
|
||||
{
|
||||
/* 1003.2 specifies the format of this message. */
|
||||
fprintf (stderr,
|
||||
_("%s: option requires an argument -- %c\n"),
|
||||
argv[0], c);
|
||||
}
|
||||
optopt = c;
|
||||
if (optstring[0] == ':')
|
||||
c = ':';
|
||||
else
|
||||
c = '?';
|
||||
}
|
||||
else
|
||||
/* We already incremented `optind' once;
|
||||
increment it again when taking next ARGV-elt as argument. */
|
||||
optarg = argv[optind++];
|
||||
nextchar = NULL;
|
||||
}
|
||||
}
|
||||
return c;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
getopt (argc, argv, optstring)
|
||||
int argc;
|
||||
char *const *argv;
|
||||
const char *optstring;
|
||||
{
|
||||
return _getopt_internal (argc, argv, optstring,
|
||||
(const struct option *) 0,
|
||||
(int *) 0,
|
||||
0);
|
||||
}
|
||||
|
||||
#endif /* _LIBC or not __GNU_LIBRARY__. */
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
/* Compile with -DTEST to make an executable for use in testing
|
||||
the above definition of `getopt'. */
|
||||
|
||||
int
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
int c;
|
||||
int digit_optind = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
int this_option_optind = optind ? optind : 1;
|
||||
|
||||
c = getopt (argc, argv, "abc:d:0123456789");
|
||||
if (c == EOF)
|
||||
break;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
if (digit_optind != 0 && digit_optind != this_option_optind)
|
||||
printf ("digits occur in two different argv-elements.\n");
|
||||
digit_optind = this_option_optind;
|
||||
printf ("option %c\n", c);
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
printf ("option a\n");
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
printf ("option b\n");
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
printf ("option c with value `%s'\n", optarg);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
break;
|
||||
|
||||
default:
|
||||
printf ("?? getopt returned character code 0%o ??\n", c);
|
||||
}
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
printf ("non-option ARGV-elements: ");
|
||||
while (optind < argc)
|
||||
printf ("%s ", argv[optind++]);
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
exit (0);
|
||||
}
|
||||
|
||||
#endif /* TEST */
|
||||
@@ -1,129 +0,0 @@
|
||||
/* Declarations for getopt.
|
||||
Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifndef _GETOPT_H
|
||||
#define _GETOPT_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* For communication from `getopt' to the caller.
|
||||
When `getopt' finds an option that takes an argument,
|
||||
the argument value is returned here.
|
||||
Also, when `ordering' is RETURN_IN_ORDER,
|
||||
each non-option ARGV-element is returned here. */
|
||||
|
||||
extern char *optarg;
|
||||
|
||||
/* Index in ARGV of the next element to be scanned.
|
||||
This is used for communication to and from the caller
|
||||
and for communication between successive calls to `getopt'.
|
||||
|
||||
On entry to `getopt', zero means this is the first call; initialize.
|
||||
|
||||
When `getopt' returns EOF, this is the index of the first of the
|
||||
non-option elements that the caller should itself scan.
|
||||
|
||||
Otherwise, `optind' communicates from one call to the next
|
||||
how much of ARGV has been scanned so far. */
|
||||
|
||||
extern int optind;
|
||||
|
||||
/* Callers store zero here to inhibit the error message `getopt' prints
|
||||
for unrecognized options. */
|
||||
|
||||
extern int opterr;
|
||||
|
||||
/* Set to an option character which was unrecognized. */
|
||||
|
||||
extern int optopt;
|
||||
|
||||
/* Describe the long-named options requested by the application.
|
||||
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
|
||||
of `struct option' terminated by an element containing a name which is
|
||||
zero.
|
||||
|
||||
The field `has_arg' is:
|
||||
no_argument (or 0) if the option does not take an argument,
|
||||
required_argument (or 1) if the option requires an argument,
|
||||
optional_argument (or 2) if the option takes an optional argument.
|
||||
|
||||
If the field `flag' is not NULL, it points to a variable that is set
|
||||
to the value given in the field `val' when the option is found, but
|
||||
left unchanged if the option is not found.
|
||||
|
||||
To have a long-named option do something other than set an `int' to
|
||||
a compiled-in constant, such as set a value from `optarg', set the
|
||||
option's `flag' field to zero and its `val' field to a nonzero
|
||||
value (the equivalent single-letter option character, if there is
|
||||
one). For long options that have a zero `flag' field, `getopt'
|
||||
returns the contents of the `val' field. */
|
||||
|
||||
struct option
|
||||
{
|
||||
#if defined (__STDC__) && __STDC__
|
||||
const char *name;
|
||||
#else
|
||||
char *name;
|
||||
#endif
|
||||
/* has_arg can't be an enum because some compilers complain about
|
||||
type mismatches in all the code that assumes it is an int. */
|
||||
int has_arg;
|
||||
int *flag;
|
||||
int val;
|
||||
};
|
||||
|
||||
/* Names for the values of the `has_arg' field of `struct option'. */
|
||||
|
||||
#define no_argument 0
|
||||
#define required_argument 1
|
||||
#define optional_argument 2
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
#ifdef __GNU_LIBRARY__
|
||||
/* Many other libraries have conflicting prototypes for getopt, with
|
||||
differences in the consts, in stdlib.h. To avoid compilation
|
||||
errors, only prototype getopt for the GNU C library. */
|
||||
extern int getopt (int argc, char *const *argv, const char *shortopts);
|
||||
#else /* not __GNU_LIBRARY__ */
|
||||
extern int getopt ();
|
||||
#endif /* __GNU_LIBRARY__ */
|
||||
extern int getopt_long (int argc, char *const *argv, const char *shortopts,
|
||||
const struct option *longopts, int *longind);
|
||||
extern int getopt_long_only (int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts, int *longind);
|
||||
|
||||
/* Internal only. Users should not call this directly. */
|
||||
extern int _getopt_internal (int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts, int *longind,
|
||||
int long_only);
|
||||
#else /* not __STDC__ */
|
||||
extern int getopt ();
|
||||
extern int getopt_long ();
|
||||
extern int getopt_long_only ();
|
||||
|
||||
extern int _getopt_internal ();
|
||||
#endif /* __STDC__ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _GETOPT_H */
|
||||
@@ -1,180 +0,0 @@
|
||||
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
||||
Copyright (C) 1987, 88, 89, 90, 91, 92, 1993, 1994
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include "getopt.h"
|
||||
|
||||
#if !defined (__STDC__) || !__STDC__
|
||||
/* This is a separate conditional since some stdc systems
|
||||
reject `defined (const)'. */
|
||||
#ifndef const
|
||||
#define const
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* Comment out all this code if we are using the GNU C Library, and are not
|
||||
actually compiling the library itself. This code is part of the GNU C
|
||||
Library, but also included in many other GNU distributions. Compiling
|
||||
and linking in this code is a waste when using the GNU C library
|
||||
(especially if it is a shared library). Rather than having every GNU
|
||||
program understand `configure --with-gnu-libc' and omit the object files,
|
||||
it is simpler to just do this in the source for each such file. */
|
||||
|
||||
#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
|
||||
|
||||
|
||||
/* This needs to come after some library #include
|
||||
to get __GNU_LIBRARY__ defined. */
|
||||
#ifdef __GNU_LIBRARY__
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
char *getenv ();
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
int
|
||||
getopt_long (argc, argv, options, long_options, opt_index)
|
||||
int argc;
|
||||
char *const *argv;
|
||||
const char *options;
|
||||
const struct option *long_options;
|
||||
int *opt_index;
|
||||
{
|
||||
return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
|
||||
}
|
||||
|
||||
/* Like getopt_long, but '-' as well as '--' can indicate a long option.
|
||||
If an option that starts with '-' (not '--') doesn't match a long option,
|
||||
but does match a short option, it is parsed as a short option
|
||||
instead. */
|
||||
|
||||
int
|
||||
getopt_long_only (argc, argv, options, long_options, opt_index)
|
||||
int argc;
|
||||
char *const *argv;
|
||||
const char *options;
|
||||
const struct option *long_options;
|
||||
int *opt_index;
|
||||
{
|
||||
return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
|
||||
}
|
||||
|
||||
|
||||
#endif /* _LIBC or not __GNU_LIBRARY__. */
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
int c;
|
||||
int digit_optind = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
int this_option_optind = optind ? optind : 1;
|
||||
int option_index = 0;
|
||||
static struct option long_options[] =
|
||||
{
|
||||
{"add", 1, 0, 0},
|
||||
{"append", 0, 0, 0},
|
||||
{"delete", 1, 0, 0},
|
||||
{"verbose", 0, 0, 0},
|
||||
{"create", 0, 0, 0},
|
||||
{"file", 1, 0, 0},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
c = getopt_long (argc, argv, "abc:d:0123456789",
|
||||
long_options, &option_index);
|
||||
if (c == EOF)
|
||||
break;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 0:
|
||||
printf ("option %s", long_options[option_index].name);
|
||||
if (optarg)
|
||||
printf (" with arg %s", optarg);
|
||||
printf ("\n");
|
||||
break;
|
||||
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
if (digit_optind != 0 && digit_optind != this_option_optind)
|
||||
printf ("digits occur in two different argv-elements.\n");
|
||||
digit_optind = this_option_optind;
|
||||
printf ("option %c\n", c);
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
printf ("option a\n");
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
printf ("option b\n");
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
printf ("option c with value `%s'\n", optarg);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
printf ("option d with value `%s'\n", optarg);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
break;
|
||||
|
||||
default:
|
||||
printf ("?? getopt returned character code 0%o ??\n", c);
|
||||
}
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
printf ("non-option ARGV-elements: ");
|
||||
while (optind < argc)
|
||||
printf ("%s ", argv[optind++]);
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
exit (0);
|
||||
}
|
||||
|
||||
#endif /* TEST */
|
||||
@@ -1,197 +0,0 @@
|
||||
/* global.c - global variables and initial values for cpio.
|
||||
Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include "cpiohdr.h"
|
||||
#include "dstring.h"
|
||||
#include "system.h"
|
||||
#include "extern.h"
|
||||
|
||||
/* If TRUE, reset access times after reading files (-a). */
|
||||
int reset_time_flag = FALSE;
|
||||
|
||||
/* Block size value, initially 512. -B sets to 5120. */
|
||||
int io_block_size = 512;
|
||||
|
||||
/* The header format to recognize and produce. */
|
||||
enum archive_format archive_format = arf_unknown;
|
||||
|
||||
/* If TRUE, create directories as needed. (-d with -i or -p) */
|
||||
int create_dir_flag = FALSE;
|
||||
|
||||
/* If TRUE, interactively rename files. (-r) */
|
||||
int rename_flag = FALSE;
|
||||
|
||||
/* If non-NULL, the name of a file that will be read to
|
||||
rename all of the files in the archive. --rename-batch-file. */
|
||||
char *rename_batch_file = NULL;
|
||||
|
||||
/* If TRUE, print a table of contents of input. (-t) */
|
||||
int table_flag = FALSE;
|
||||
|
||||
/* If TRUE, copy unconditionally (older replaces newer). (-u) */
|
||||
int unconditional_flag = FALSE;
|
||||
|
||||
/* If TRUE, list the files processed, or ls -l style output with -t. (-v) */
|
||||
int verbose_flag = FALSE;
|
||||
|
||||
/* If TRUE, print a . for each file processed. (-V) */
|
||||
int dot_flag = FALSE;
|
||||
|
||||
/* If TRUE, link files whenever possible. Used with -p option. (-l) */
|
||||
int link_flag = FALSE;
|
||||
|
||||
/* If TRUE, retain previous file modification time. (-m) */
|
||||
int retain_time_flag = FALSE;
|
||||
|
||||
/* Set TRUE if crc_flag is TRUE and we are doing a cpio -i. Used
|
||||
by copy_files so it knows whether to compute the crc. */
|
||||
int crc_i_flag = FALSE;
|
||||
|
||||
/* If TRUE, append to end of archive. (-A) */
|
||||
int append_flag = FALSE;
|
||||
|
||||
/* If TRUE, swap bytes of each file during cpio -i. */
|
||||
int swap_bytes_flag = FALSE;
|
||||
|
||||
/* If TRUE, swap halfwords of each file during cpio -i. */
|
||||
int swap_halfwords_flag = FALSE;
|
||||
|
||||
/* If TRUE, we are swapping halfwords on the current file. */
|
||||
int swapping_halfwords = FALSE;
|
||||
|
||||
/* If TRUE, we are swapping bytes on the current file. */
|
||||
int swapping_bytes = FALSE;
|
||||
|
||||
/* If TRUE, set ownership of all files to UID `set_owner'. */
|
||||
int set_owner_flag = FALSE;
|
||||
uid_t set_owner;
|
||||
|
||||
/* If TRUE, set group ownership of all files to GID `set_group'. */
|
||||
int set_group_flag = FALSE;
|
||||
gid_t set_group;
|
||||
|
||||
/* If TRUE, do not chown the files. */
|
||||
int no_chown_flag = FALSE;
|
||||
|
||||
/* If TRUE, try to write sparse ("holey") files. */
|
||||
int sparse_flag = FALSE;
|
||||
|
||||
/* If TRUE, don't report number of blocks copied. */
|
||||
int quiet_flag = FALSE;
|
||||
|
||||
/* If TRUE, only read the archive and verify the files' CRC's, don't
|
||||
actually extract the files. */
|
||||
int only_verify_crc_flag = FALSE;
|
||||
|
||||
/* If TRUE, don't use any absolute paths, prefix them by `./'. */
|
||||
int no_abs_paths_flag = FALSE;
|
||||
|
||||
#ifdef DEBUG_CPIO
|
||||
/* If TRUE, print debugging information. */
|
||||
int debug_flag = FALSE;
|
||||
#endif
|
||||
|
||||
/* File position of last header read. Only used during -A to determine
|
||||
where the old TRAILER!!! record started. */
|
||||
int last_header_start = 0;
|
||||
|
||||
/* With -i; if TRUE, copy only files that match any of the given patterns;
|
||||
if FALSE, copy only files that do not match any of the patterns. (-f) */
|
||||
int copy_matching_files = TRUE;
|
||||
|
||||
/* With -itv; if TRUE, list numeric uid and gid instead of translating them
|
||||
into names. */
|
||||
int numeric_uid = FALSE;
|
||||
|
||||
/* Name of file containing additional patterns (-E). */
|
||||
char *pattern_file_name = NULL;
|
||||
|
||||
/* Message to print when end of medium is reached (-M). */
|
||||
char *new_media_message = NULL;
|
||||
|
||||
/* With -M with %d, message to print when end of medium is reached. */
|
||||
char *new_media_message_with_number = NULL;
|
||||
char *new_media_message_after_number = NULL;
|
||||
|
||||
/* File descriptor containing the archive. */
|
||||
int archive_des;
|
||||
|
||||
/* Name of file containing the archive, if known; NULL if stdin/out. */
|
||||
char *archive_name = NULL;
|
||||
|
||||
/* CRC checksum. */
|
||||
unsigned long crc;
|
||||
|
||||
/* Input and output buffers. */
|
||||
char *input_buffer, *output_buffer;
|
||||
|
||||
/* The size of the input buffer. */
|
||||
long input_buffer_size;
|
||||
|
||||
/* Current locations in `input_buffer' and `output_buffer'. */
|
||||
char *in_buff, *out_buff;
|
||||
|
||||
/* Current number of bytes stored at `input_buff' and `output_buff'. */
|
||||
long input_size, output_size;
|
||||
|
||||
/* Total number of bytes read and written for all files.
|
||||
Now that many tape drives hold more than 4Gb we need more than 32
|
||||
bits to hold input_bytes and output_bytes. But it's not worth
|
||||
the trouble of adding special multi-precision arithmetic if the
|
||||
compiler doesn't support 64 bit ints since input_bytes and
|
||||
output_bytes are only used to print the number of blocks copied. */
|
||||
#ifdef __GNUC__
|
||||
long long input_bytes, output_bytes;
|
||||
#else
|
||||
long input_bytes, output_bytes;
|
||||
#endif
|
||||
|
||||
/* 512 bytes of 0; used for various padding operations. */
|
||||
char zeros_512[512];
|
||||
|
||||
/* Saving of argument values for later reference. */
|
||||
char *directory_name = NULL;
|
||||
char **save_patterns;
|
||||
int num_patterns;
|
||||
|
||||
/* Character that terminates file names read from stdin. */
|
||||
char name_end = '\n';
|
||||
|
||||
/* TRUE if input (cpio -i) or output (cpio -o) is a device node. */
|
||||
char input_is_special = FALSE;
|
||||
char output_is_special = FALSE;
|
||||
|
||||
/* TRUE if lseek works on the input. */
|
||||
char input_is_seekable = FALSE;
|
||||
|
||||
/* TRUE if lseek works on the output. */
|
||||
char output_is_seekable = FALSE;
|
||||
|
||||
/* If nonzero, don't consider file names that contain a `:' to be
|
||||
on remote hosts; all files are local. */
|
||||
int f_force_local = 0;
|
||||
|
||||
/* The name this program was run with. */
|
||||
char *program_name;
|
||||
|
||||
/* A pointer to either lstat or stat, depending on whether
|
||||
dereferencing of symlinks is done for input files. */
|
||||
int (*xstat) ();
|
||||
|
||||
/* Which copy operation to perform. (-i, -o, -p) */
|
||||
void (*copy_function) () = 0;
|
||||
@@ -1,210 +0,0 @@
|
||||
/* idcache.c -- map user and group IDs, cached for speed
|
||||
Copyright (C) 1985, 1988, 1989, 1990 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#else
|
||||
#include <strings.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#ifndef _POSIX_VERSION
|
||||
struct passwd *getpwuid ();
|
||||
struct passwd *getpwnam ();
|
||||
struct group *getgrgid ();
|
||||
struct group *getgrnam ();
|
||||
#endif
|
||||
|
||||
char *xmalloc ();
|
||||
char *xstrdup ();
|
||||
|
||||
struct userid
|
||||
{
|
||||
union
|
||||
{
|
||||
uid_t u;
|
||||
gid_t g;
|
||||
} id;
|
||||
char *name;
|
||||
struct userid *next;
|
||||
};
|
||||
|
||||
static struct userid *user_alist;
|
||||
|
||||
/* The members of this list have names not in the local passwd file. */
|
||||
static struct userid *nouser_alist;
|
||||
|
||||
/* Translate UID to a login name or a stringified number,
|
||||
with cache. */
|
||||
|
||||
char *
|
||||
getuser (uid)
|
||||
uid_t uid;
|
||||
{
|
||||
register struct userid *tail;
|
||||
struct passwd *pwent;
|
||||
char usernum_string[20];
|
||||
|
||||
for (tail = user_alist; tail; tail = tail->next)
|
||||
if (tail->id.u == uid)
|
||||
return tail->name;
|
||||
|
||||
pwent = getpwuid (uid);
|
||||
tail = (struct userid *) xmalloc (sizeof (struct userid));
|
||||
tail->id.u = uid;
|
||||
if (pwent == 0)
|
||||
{
|
||||
sprintf (usernum_string, "%u", (unsigned) uid);
|
||||
tail->name = xstrdup (usernum_string);
|
||||
}
|
||||
else
|
||||
tail->name = xstrdup (pwent->pw_name);
|
||||
|
||||
/* Add to the head of the list, so most recently used is first. */
|
||||
tail->next = user_alist;
|
||||
user_alist = tail;
|
||||
return tail->name;
|
||||
}
|
||||
|
||||
/* Translate USER to a UID, with cache.
|
||||
Return NULL if there is no such user.
|
||||
(We also cache which user names have no passwd entry,
|
||||
so we don't keep looking them up.) */
|
||||
|
||||
uid_t *
|
||||
getuidbyname (user)
|
||||
char *user;
|
||||
{
|
||||
register struct userid *tail;
|
||||
struct passwd *pwent;
|
||||
|
||||
for (tail = user_alist; tail; tail = tail->next)
|
||||
/* Avoid a function call for the most common case. */
|
||||
if (*tail->name == *user && !strcmp (tail->name, user))
|
||||
return &tail->id.u;
|
||||
|
||||
for (tail = nouser_alist; tail; tail = tail->next)
|
||||
/* Avoid a function call for the most common case. */
|
||||
if (*tail->name == *user && !strcmp (tail->name, user))
|
||||
return 0;
|
||||
|
||||
pwent = getpwnam (user);
|
||||
|
||||
tail = (struct userid *) xmalloc (sizeof (struct userid));
|
||||
tail->name = xstrdup (user);
|
||||
|
||||
/* Add to the head of the list, so most recently used is first. */
|
||||
if (pwent)
|
||||
{
|
||||
tail->id.u = pwent->pw_uid;
|
||||
tail->next = user_alist;
|
||||
user_alist = tail;
|
||||
return &tail->id.u;
|
||||
}
|
||||
|
||||
tail->next = nouser_alist;
|
||||
nouser_alist = tail;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Use the same struct as for userids. */
|
||||
static struct userid *group_alist;
|
||||
static struct userid *nogroup_alist;
|
||||
|
||||
/* Translate GID to a group name or a stringified number,
|
||||
with cache. */
|
||||
|
||||
char *
|
||||
getgroup (gid)
|
||||
gid_t gid;
|
||||
{
|
||||
register struct userid *tail;
|
||||
struct group *grent;
|
||||
char groupnum_string[20];
|
||||
|
||||
for (tail = group_alist; tail; tail = tail->next)
|
||||
if (tail->id.g == gid)
|
||||
return tail->name;
|
||||
|
||||
grent = getgrgid (gid);
|
||||
tail = (struct userid *) xmalloc (sizeof (struct userid));
|
||||
tail->id.g = gid;
|
||||
if (grent == 0)
|
||||
{
|
||||
sprintf (groupnum_string, "%u", (unsigned int) gid);
|
||||
tail->name = xstrdup (groupnum_string);
|
||||
}
|
||||
else
|
||||
tail->name = xstrdup (grent->gr_name);
|
||||
|
||||
/* Add to the head of the list, so most recently used is first. */
|
||||
tail->next = group_alist;
|
||||
group_alist = tail;
|
||||
return tail->name;
|
||||
}
|
||||
|
||||
/* Translate GROUP to a UID, with cache.
|
||||
Return NULL if there is no such group.
|
||||
(We also cache which group names have no group entry,
|
||||
so we don't keep looking them up.) */
|
||||
|
||||
gid_t *
|
||||
getgidbyname (group)
|
||||
char *group;
|
||||
{
|
||||
register struct userid *tail;
|
||||
struct group *grent;
|
||||
|
||||
for (tail = group_alist; tail; tail = tail->next)
|
||||
/* Avoid a function call for the most common case. */
|
||||
if (*tail->name == *group && !strcmp (tail->name, group))
|
||||
return &tail->id.g;
|
||||
|
||||
for (tail = nogroup_alist; tail; tail = tail->next)
|
||||
/* Avoid a function call for the most common case. */
|
||||
if (*tail->name == *group && !strcmp (tail->name, group))
|
||||
return 0;
|
||||
|
||||
grent = getgrnam (group);
|
||||
|
||||
tail = (struct userid *) xmalloc (sizeof (struct userid));
|
||||
tail->name = xstrdup (group);
|
||||
|
||||
/* Add to the head of the list, so most recently used is first. */
|
||||
if (grent)
|
||||
{
|
||||
tail->id.g = grent->gr_gid;
|
||||
tail->next = group_alist;
|
||||
group_alist = tail;
|
||||
return &tail->id.g;
|
||||
}
|
||||
|
||||
tail->next = nogroup_alist;
|
||||
nogroup_alist = tail;
|
||||
return 0;
|
||||
}
|
||||
@@ -1,531 +0,0 @@
|
||||
/* main.c - main program and argument processing for cpio.
|
||||
Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
/* Written by Phil Nelson <[email protected]>,
|
||||
David MacKenzie <[email protected]>,
|
||||
and John Oleynick <[email protected]>. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <getopt.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#ifdef HAVE_SYS_PARAM_H
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
#if (defined(BSD) && (BSD >= 199306))
|
||||
#include <locale.h>
|
||||
#endif
|
||||
#include "filetypes.h"
|
||||
#include "system.h"
|
||||
#include "cpiohdr.h"
|
||||
#include "dstring.h"
|
||||
#include "extern.h"
|
||||
#include "rmt.h"
|
||||
|
||||
struct option long_opts[] =
|
||||
{
|
||||
{"null", 0, 0, '0'},
|
||||
{"append", 0, 0, 'A'},
|
||||
{"block-size", 1, 0, 130},
|
||||
{"create", 0, 0, 'o'},
|
||||
{"dereference", 0, 0, 'L'},
|
||||
{"dot", 0, 0, 'V'},
|
||||
{"extract", 0, 0, 'i'},
|
||||
{"file", 1, 0, 'F'},
|
||||
{"force-local", 0, &f_force_local, 1},
|
||||
{"format", 1, 0, 'H'},
|
||||
{"help", 0, 0, 132},
|
||||
{"io-size", 1, 0, 'C'},
|
||||
{"link", 0, &link_flag, TRUE},
|
||||
{"list", 0, &table_flag, TRUE},
|
||||
{"make-directories", 0, &create_dir_flag, TRUE},
|
||||
{"message", 1, 0, 'M'},
|
||||
{"no-absolute-filenames", 0, 0, 136},
|
||||
{"no-preserve-owner", 0, 0, 134},
|
||||
{"nonmatching", 0, ©_matching_files, FALSE},
|
||||
{"numeric-uid-gid", 0, &numeric_uid, TRUE},
|
||||
{"only-verify-crc", 0, 0, 139},
|
||||
{"owner", 1, 0, 'R'},
|
||||
{"pass-through", 0, 0, 'p'},
|
||||
{"pattern-file", 1, 0, 'E'},
|
||||
{"preserve-modification-time", 0, &retain_time_flag, TRUE},
|
||||
{"rename", 0, &rename_flag, TRUE},
|
||||
{"rename-batch-file", 1, 0, 137},
|
||||
{"quiet", 0, 0, 138},
|
||||
{"sparse", 0, 0, 135},
|
||||
{"swap", 0, 0, 'b'},
|
||||
{"swap-bytes", 0, 0, 's'},
|
||||
{"swap-halfwords", 0, 0, 'S'},
|
||||
{"reset-access-time", 0, &reset_time_flag, TRUE},
|
||||
{"unconditional", 0, &unconditional_flag, TRUE},
|
||||
{"verbose", 0, &verbose_flag, TRUE},
|
||||
{"version", 0, 0, 131},
|
||||
#ifdef DEBUG_CPIO
|
||||
{"debug", 0, &debug_flag, TRUE},
|
||||
#endif
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
/* Print usage message and exit with error. */
|
||||
|
||||
void
|
||||
usage (fp, status)
|
||||
FILE *fp;
|
||||
int status;
|
||||
{
|
||||
fprintf (fp, "\
|
||||
Usage: %s {-o|--create} [-0acvABLV] [-C bytes] [-H format] [-M message]\n\
|
||||
[-O [[user@]host:]archive] [-F [[user@]host:]archive]\n\
|
||||
[--file=[[user@]host:]archive] [--format=format] [--message=message]\n\
|
||||
[--null] [--reset-access-time] [--verbose] [--dot] [--append]\n\
|
||||
[--block-size=blocks] [--dereference] [--io-size=bytes] [--quiet]\n\
|
||||
[--force-local] [--help] [--version] < name-list [> archive]\n", program_name);
|
||||
fprintf (fp, "\
|
||||
%s {-i|--extract} [-bcdfmnrtsuvBSV] [-C bytes] [-E file] [-H format]\n\
|
||||
[-M message] [-R [user][:.][group]] [-I [[user@]host:]archive]\n\
|
||||
[-F [[user@]host:]archive] [--file=[[user@]host:]archive]\n\
|
||||
[--make-directories] [--nonmatching] [--preserve-modification-time]\n\
|
||||
[--numeric-uid-gid] [--rename] [--list] [--swap-bytes] [--swap] [--dot]\n\
|
||||
[--unconditional] [--verbose] [--block-size=blocks] [--swap-halfwords]\n\
|
||||
[--io-size=bytes] [--pattern-file=file] [--format=format]\n\
|
||||
[--owner=[user][:.][group]] [--no-preserve-owner] [--message=message]\n\
|
||||
[--force-local] [--no-absolute-filenames] [--sparse] [--only-verify-crc]\n\
|
||||
[--quiet] [--help] [--version] [pattern...] [< archive]\n",
|
||||
program_name);
|
||||
fprintf (fp, "\
|
||||
%s {-p|--pass-through} [-0adlmuvLV] [-R [user][:.][group]]\n\
|
||||
[--null] [--reset-access-time] [--make-directories] [--link] [--quiet]\n\
|
||||
[--preserve-modification-time] [--unconditional] [--verbose] [--dot]\n\
|
||||
[--dereference] [--owner=[user][:.][group]] [--no-preserve-owner]\n\
|
||||
[--sparse] [--help] [--version] destination-directory < name-list\n", program_name);
|
||||
exit (status);
|
||||
}
|
||||
|
||||
/* Process the arguments. Set all options and set up the copy pass
|
||||
directory or the copy in patterns. */
|
||||
|
||||
void
|
||||
process_args (argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
extern char *version_string;
|
||||
void (*copy_in) (); /* Work around for pcc bug. */
|
||||
void (*copy_out) ();
|
||||
int c;
|
||||
char *input_archive_name = 0;
|
||||
char *output_archive_name = 0;
|
||||
|
||||
if (argc < 2)
|
||||
usage (stderr, 2);
|
||||
|
||||
xstat = lstat;
|
||||
|
||||
while ((c = getopt_long (argc, argv,
|
||||
"0aAbBcC:dfE:F:H:iI:lLmM:noO:prR:sStuvVz",
|
||||
long_opts, (int *) 0)) != -1)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 0: /* A long option that just sets a flag. */
|
||||
break;
|
||||
|
||||
case '0': /* Read null-terminated filenames. */
|
||||
name_end = '\0';
|
||||
break;
|
||||
|
||||
case 'a': /* Reset access times. */
|
||||
reset_time_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'A': /* Append to the archive. */
|
||||
append_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'b': /* Swap bytes and halfwords. */
|
||||
swap_bytes_flag = TRUE;
|
||||
swap_halfwords_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'B': /* Set block size to 5120. */
|
||||
io_block_size = 5120;
|
||||
break;
|
||||
|
||||
case 130: /* --block-size */
|
||||
io_block_size = atoi (optarg);
|
||||
if (io_block_size < 1)
|
||||
error (2, 0, "invalid block size");
|
||||
io_block_size *= 512;
|
||||
break;
|
||||
|
||||
case 'c': /* Use the old portable ASCII format. */
|
||||
if (archive_format != arf_unknown)
|
||||
usage (stderr, 2);
|
||||
#ifdef SVR4_COMPAT
|
||||
archive_format = arf_newascii; /* -H newc. */
|
||||
#else
|
||||
archive_format = arf_oldascii; /* -H odc. */
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 'C': /* Block size. */
|
||||
io_block_size = atoi (optarg);
|
||||
if (io_block_size < 1)
|
||||
error (2, 0, "invalid block size");
|
||||
break;
|
||||
|
||||
case 'd': /* Create directories where needed. */
|
||||
create_dir_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'f': /* Only copy files not matching patterns. */
|
||||
copy_matching_files = FALSE;
|
||||
break;
|
||||
|
||||
case 'E': /* Pattern file name. */
|
||||
pattern_file_name = optarg;
|
||||
break;
|
||||
|
||||
case 'F': /* Archive file name. */
|
||||
archive_name = optarg;
|
||||
break;
|
||||
|
||||
case 'H': /* Header format name. */
|
||||
if (archive_format != arf_unknown)
|
||||
usage (stderr, 2);
|
||||
if (!strcmp (optarg, "crc") || !strcmp (optarg, "CRC"))
|
||||
archive_format = arf_crcascii;
|
||||
else if (!strcmp (optarg, "newc") || !strcmp (optarg, "NEWC"))
|
||||
archive_format = arf_newascii;
|
||||
else if (!strcmp (optarg, "odc") || !strcmp (optarg, "ODC"))
|
||||
archive_format = arf_oldascii;
|
||||
else if (!strcmp (optarg, "bin") || !strcmp (optarg, "BIN"))
|
||||
archive_format = arf_binary;
|
||||
else if (!strcmp (optarg, "ustar") || !strcmp (optarg, "USTAR"))
|
||||
archive_format = arf_ustar;
|
||||
else if (!strcmp (optarg, "tar") || !strcmp (optarg, "TAR"))
|
||||
archive_format = arf_tar;
|
||||
else if (!strcmp (optarg, "hpodc") || !strcmp (optarg, "HPODC"))
|
||||
archive_format = arf_hpoldascii;
|
||||
else if (!strcmp (optarg, "hpbin") || !strcmp (optarg, "HPBIN"))
|
||||
archive_format = arf_hpbinary;
|
||||
else
|
||||
error (2, 0, "\
|
||||
invalid archive format `%s'; valid formats are:\n\
|
||||
crc newc odc bin ustar tar (all-caps also recognized)", optarg);
|
||||
break;
|
||||
|
||||
case 'i': /* Copy-in mode. */
|
||||
if (copy_function != 0)
|
||||
usage (stderr, 2);
|
||||
copy_function = process_copy_in;
|
||||
break;
|
||||
|
||||
case 'I': /* Input archive file name. */
|
||||
input_archive_name = optarg;
|
||||
break;
|
||||
|
||||
case 'k': /* Handle corrupted archives. We always handle
|
||||
corrupted archives, but recognize this
|
||||
option for compatability. */
|
||||
break;
|
||||
|
||||
case 'l': /* Link files when possible. */
|
||||
link_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'L': /* Dereference symbolic links. */
|
||||
xstat = stat;
|
||||
break;
|
||||
|
||||
case 'm': /* Retain previous file modify times. */
|
||||
retain_time_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'M': /* New media message. */
|
||||
set_new_media_message (optarg);
|
||||
break;
|
||||
|
||||
case 'n': /* Long list owner and group as numbers. */
|
||||
numeric_uid = TRUE;
|
||||
break;
|
||||
|
||||
case 136: /* --no-absolute-filenames */
|
||||
no_abs_paths_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 134: /* --no-preserve-owner */
|
||||
if (set_owner_flag || set_group_flag)
|
||||
usage (stderr, 2);
|
||||
no_chown_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'o': /* Copy-out mode. */
|
||||
if (copy_function != 0)
|
||||
usage (stderr, 2);
|
||||
copy_function = process_copy_out;
|
||||
break;
|
||||
|
||||
case 'O': /* Output archive file name. */
|
||||
output_archive_name = optarg;
|
||||
break;
|
||||
|
||||
case 139:
|
||||
only_verify_crc_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'p': /* Copy-pass mode. */
|
||||
if (copy_function != 0)
|
||||
usage (stderr, 2);
|
||||
copy_function = process_copy_pass;
|
||||
break;
|
||||
|
||||
case 'r': /* Interactively rename. */
|
||||
rename_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 137:
|
||||
rename_batch_file = optarg;
|
||||
break;
|
||||
|
||||
case 138:
|
||||
quiet_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'R': /* Set the owner. */
|
||||
if (no_chown_flag)
|
||||
usage (stderr, 2);
|
||||
#ifndef __MSDOS__
|
||||
{
|
||||
char *e, *u, *g;
|
||||
|
||||
e = parse_user_spec (optarg, &set_owner, &set_group, &u, &g);
|
||||
if (e)
|
||||
error (2, 0, "%s: %s", optarg, e);
|
||||
if (u)
|
||||
{
|
||||
free (u);
|
||||
set_owner_flag = TRUE;
|
||||
}
|
||||
if (g)
|
||||
{
|
||||
free (g);
|
||||
set_group_flag = TRUE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 's': /* Swap bytes. */
|
||||
swap_bytes_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'S': /* Swap halfwords. */
|
||||
swap_halfwords_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 't': /* Only print a list. */
|
||||
table_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'u': /* Replace all! Unconditionally! */
|
||||
unconditional_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'v': /* Verbose! */
|
||||
verbose_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 'V': /* Print `.' for each file. */
|
||||
dot_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 131:
|
||||
printf ("GNU cpio %s", version_string);
|
||||
exit (0);
|
||||
break;
|
||||
|
||||
case 135:
|
||||
sparse_flag = TRUE;
|
||||
break;
|
||||
|
||||
case 132: /* --help */
|
||||
usage (stdout, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
usage (stderr, 2);
|
||||
}
|
||||
}
|
||||
|
||||
/* Do error checking and look at other args. */
|
||||
|
||||
if (copy_function == 0)
|
||||
{
|
||||
if (table_flag)
|
||||
copy_function = process_copy_in;
|
||||
else
|
||||
usage (stderr, 2);
|
||||
}
|
||||
|
||||
if ((!table_flag || !verbose_flag) && numeric_uid)
|
||||
usage (stderr, 2);
|
||||
|
||||
/* Work around for pcc bug. */
|
||||
copy_in = process_copy_in;
|
||||
copy_out = process_copy_out;
|
||||
|
||||
if (copy_function == copy_in)
|
||||
{
|
||||
archive_des = 0;
|
||||
if (link_flag || reset_time_flag || xstat != lstat || append_flag
|
||||
|| sparse_flag
|
||||
|| output_archive_name
|
||||
|| (archive_name && input_archive_name))
|
||||
usage (stderr, 2);
|
||||
if (archive_format == arf_crcascii)
|
||||
crc_i_flag = TRUE;
|
||||
num_patterns = argc - optind;
|
||||
save_patterns = &argv[optind];
|
||||
if (input_archive_name)
|
||||
archive_name = input_archive_name;
|
||||
}
|
||||
else if (copy_function == copy_out)
|
||||
{
|
||||
archive_des = 1;
|
||||
if (argc != optind || create_dir_flag || rename_flag
|
||||
|| table_flag || unconditional_flag || link_flag
|
||||
|| retain_time_flag || no_chown_flag || set_owner_flag
|
||||
|| set_group_flag || swap_bytes_flag || swap_halfwords_flag
|
||||
|| (append_flag && !(archive_name || output_archive_name))
|
||||
|| rename_batch_file || no_abs_paths_flag
|
||||
|| input_archive_name || (archive_name && output_archive_name))
|
||||
usage (stderr, 2);
|
||||
if (archive_format == arf_unknown)
|
||||
archive_format = arf_binary;
|
||||
if (output_archive_name)
|
||||
archive_name = output_archive_name;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Copy pass. */
|
||||
archive_des = -1;
|
||||
if (argc - 1 != optind || archive_format != arf_unknown
|
||||
|| swap_bytes_flag || swap_halfwords_flag
|
||||
|| table_flag || rename_flag || append_flag
|
||||
|| rename_batch_file || no_abs_paths_flag)
|
||||
usage (stderr, 2);
|
||||
directory_name = argv[optind];
|
||||
}
|
||||
|
||||
if (archive_name)
|
||||
{
|
||||
if (copy_function != copy_in && copy_function != copy_out)
|
||||
usage (stderr, 2);
|
||||
archive_des = open_archive (archive_name);
|
||||
if (archive_des < 0)
|
||||
error (1, errno, "%s", archive_name);
|
||||
}
|
||||
|
||||
#ifndef __MSDOS__
|
||||
/* Prevent SysV non-root users from giving away files inadvertantly.
|
||||
This happens automatically on BSD, where only root can give
|
||||
away files. */
|
||||
if (set_owner_flag == FALSE && set_group_flag == FALSE && geteuid ())
|
||||
no_chown_flag = TRUE;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Initialize the input and output buffers to their proper size and
|
||||
initialize all variables associated with the input and output
|
||||
buffers. */
|
||||
|
||||
void
|
||||
initialize_buffers ()
|
||||
{
|
||||
int in_buf_size, out_buf_size;
|
||||
|
||||
if (copy_function == process_copy_in)
|
||||
{
|
||||
/* Make sure the input buffer can always hold 2 blocks and that it
|
||||
is big enough to hold 1 tar record (512 bytes) even if it
|
||||
is not aligned on a block boundary. The extra buffer space
|
||||
is needed by process_copyin and peek_in_buf to automatically
|
||||
figure out what kind of archive it is reading. */
|
||||
if (io_block_size >= 512)
|
||||
in_buf_size = 2 * io_block_size;
|
||||
else
|
||||
in_buf_size = 1024;
|
||||
out_buf_size = DISK_IO_BLOCK_SIZE;
|
||||
}
|
||||
else if (copy_function == process_copy_out)
|
||||
{
|
||||
in_buf_size = DISK_IO_BLOCK_SIZE;
|
||||
out_buf_size = io_block_size;
|
||||
}
|
||||
else
|
||||
{
|
||||
in_buf_size = DISK_IO_BLOCK_SIZE;
|
||||
out_buf_size = DISK_IO_BLOCK_SIZE;
|
||||
}
|
||||
|
||||
input_buffer = (char *) xmalloc (in_buf_size);
|
||||
in_buff = input_buffer;
|
||||
input_buffer_size = in_buf_size;
|
||||
input_size = 0;
|
||||
input_bytes = 0;
|
||||
|
||||
output_buffer = (char *) xmalloc (out_buf_size);
|
||||
out_buff = output_buffer;
|
||||
output_size = 0;
|
||||
output_bytes = 0;
|
||||
|
||||
/* Clear the block of zeros. */
|
||||
bzero (zeros_512, 512);
|
||||
}
|
||||
|
||||
void
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
program_name = argv[0];
|
||||
|
||||
#if (defined(BSD) && (BSD >= 199306))
|
||||
(void) setlocale (LC_ALL, "");
|
||||
#endif
|
||||
|
||||
#ifdef __TURBOC__
|
||||
_fmode = O_BINARY; /* Put stdin and stdout in binary mode. */
|
||||
#endif
|
||||
#ifdef __EMX__ /* gcc on OS/2. */
|
||||
_response (&argc, &argv);
|
||||
_wildcard (&argc, &argv);
|
||||
#endif
|
||||
|
||||
process_args (argc, argv);
|
||||
umask (0);
|
||||
|
||||
initialize_buffers ();
|
||||
|
||||
(*copy_function) ();
|
||||
|
||||
if (archive_des >= 0 && rmtclose (archive_des) == -1)
|
||||
error (1, errno, "error closing archive");
|
||||
|
||||
exit (0);
|
||||
}
|
||||
@@ -1,307 +0,0 @@
|
||||
/* makepath.c -- Ensure that a directory path exists.
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
/* Written by David MacKenzie <[email protected]> and
|
||||
Jim Meyering <[email protected]>. */
|
||||
|
||||
/* This copy of makepath is almost like the fileutils one, but has
|
||||
changes for HPUX CDF's. Maybe the 2 versions of makepath can
|
||||
come together again in the future. */
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define alloca __builtin_alloca
|
||||
#else
|
||||
#ifdef HAVE_ALLOCA_H
|
||||
#include <alloca.h>
|
||||
#else
|
||||
#ifdef _AIX
|
||||
#pragma alloca
|
||||
#else
|
||||
char *alloca ();
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#if !defined(S_ISDIR) && defined(S_IFDIR)
|
||||
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#ifdef STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#ifndef index
|
||||
#define index strchr
|
||||
#endif
|
||||
#else
|
||||
#include <strings.h>
|
||||
#endif
|
||||
|
||||
#if defined(__MSDOS__) && !defined(__GNUC__)
|
||||
typedef int uid_t;
|
||||
typedef int gid_t;
|
||||
#endif
|
||||
|
||||
void error ();
|
||||
|
||||
/* Ensure that the directory ARGPATH exists.
|
||||
Remove any trailing slashes from ARGPATH before calling this function.
|
||||
|
||||
Make any leading directories that don't already exist, with
|
||||
permissions PARENT_MODE.
|
||||
If the last element of ARGPATH does not exist, create it as
|
||||
a new directory with permissions MODE.
|
||||
If OWNER and GROUP are non-negative, make them the UID and GID of
|
||||
created directories.
|
||||
If VERBOSE_FMT_STRING is nonzero, use it as a printf format
|
||||
string for printing a message after successfully making a directory,
|
||||
with the name of the directory that was just made as an argument.
|
||||
|
||||
Return 0 if ARGPATH exists as a directory with the proper
|
||||
ownership and permissions when done, otherwise 1. */
|
||||
|
||||
int
|
||||
make_path (argpath, mode, parent_mode, owner, group, verbose_fmt_string)
|
||||
char *argpath;
|
||||
int mode;
|
||||
int parent_mode;
|
||||
uid_t owner;
|
||||
gid_t group;
|
||||
char *verbose_fmt_string;
|
||||
{
|
||||
char *dirpath; /* A copy we can scribble NULs on. */
|
||||
struct stat stats;
|
||||
int retval = 0;
|
||||
int oldmask = umask (0);
|
||||
dirpath = alloca (strlen (argpath) + 1);
|
||||
strcpy (dirpath, argpath);
|
||||
|
||||
if (stat (dirpath, &stats))
|
||||
{
|
||||
char *slash;
|
||||
int tmp_mode; /* Initial perms for leading dirs. */
|
||||
int re_protect; /* Should leading dirs be unwritable? */
|
||||
struct ptr_list
|
||||
{
|
||||
char *dirname_end;
|
||||
struct ptr_list *next;
|
||||
};
|
||||
struct ptr_list *p, *leading_dirs = NULL;
|
||||
|
||||
/* If leading directories shouldn't be writable or executable,
|
||||
or should have set[ug]id or sticky bits set and we are setting
|
||||
their owners, we need to fix their permissions after making them. */
|
||||
if (((parent_mode & 0300) != 0300)
|
||||
|| (owner != (uid_t) -1 && group != (gid_t) -1
|
||||
&& (parent_mode & 07000) != 0))
|
||||
{
|
||||
tmp_mode = 0700;
|
||||
re_protect = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp_mode = parent_mode;
|
||||
re_protect = 0;
|
||||
}
|
||||
|
||||
slash = dirpath;
|
||||
while (*slash == '/')
|
||||
slash++;
|
||||
while ((slash = index (slash, '/')))
|
||||
{
|
||||
#ifdef HPUX_CDF
|
||||
int iscdf;
|
||||
iscdf = 0;
|
||||
#endif
|
||||
*slash = '\0';
|
||||
if (stat (dirpath, &stats))
|
||||
{
|
||||
#ifdef HPUX_CDF
|
||||
/* If this component of the pathname ends in `+' and is
|
||||
followed by 2 `/'s, then this is a CDF. We remove the
|
||||
`+' from the name and create the directory. Later
|
||||
we will "hide" the directory. */
|
||||
if ( (*(slash +1) == '/') && (*(slash -1) == '+') )
|
||||
{
|
||||
iscdf = 1;
|
||||
*(slash -1) = '\0';
|
||||
}
|
||||
#endif
|
||||
if (mkdir (dirpath, tmp_mode))
|
||||
{
|
||||
error (0, errno, "cannot make directory `%s'", dirpath);
|
||||
umask (oldmask);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (verbose_fmt_string != NULL)
|
||||
error (0, 0, verbose_fmt_string, dirpath);
|
||||
|
||||
if (owner != (uid_t) -1 && group != (gid_t) -1
|
||||
&& chown (dirpath, owner, group)
|
||||
#ifdef AFS
|
||||
&& errno != EPERM
|
||||
#endif
|
||||
)
|
||||
{
|
||||
error (0, errno, "%s", dirpath);
|
||||
retval = 1;
|
||||
}
|
||||
if (re_protect)
|
||||
{
|
||||
struct ptr_list *new = (struct ptr_list *)
|
||||
alloca (sizeof (struct ptr_list));
|
||||
new->dirname_end = slash;
|
||||
new->next = leading_dirs;
|
||||
leading_dirs = new;
|
||||
}
|
||||
#ifdef HPUX_CDF
|
||||
if (iscdf)
|
||||
{
|
||||
/* If this is a CDF, "hide" the directory by setting
|
||||
its hidden/setuid bit. Also add the `+' back to
|
||||
its name (since once it's "hidden" we must refer
|
||||
to as `name+' instead of `name'). */
|
||||
chmod (dirpath, 04700);
|
||||
*(slash - 1) = '+';
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else if (!S_ISDIR (stats.st_mode))
|
||||
{
|
||||
error (0, 0, "`%s' exists but is not a directory", dirpath);
|
||||
umask (oldmask);
|
||||
return 1;
|
||||
}
|
||||
|
||||
*slash++ = '/';
|
||||
|
||||
/* Avoid unnecessary calls to `stat' when given
|
||||
pathnames containing multiple adjacent slashes. */
|
||||
while (*slash == '/')
|
||||
slash++;
|
||||
}
|
||||
|
||||
/* We're done making leading directories.
|
||||
Make the final component of the path. */
|
||||
|
||||
if (mkdir (dirpath, mode))
|
||||
{
|
||||
/* In some cases, if the final component in dirpath was `.' then we
|
||||
just got an EEXIST error from that last mkdir(). If that's
|
||||
the case, ignore it. */
|
||||
if ( (errno != EEXIST) ||
|
||||
(stat (dirpath, &stats) != 0) ||
|
||||
(!S_ISDIR (stats.st_mode) ) )
|
||||
{
|
||||
error (0, errno, "cannot make directory `%s'", dirpath);
|
||||
umask (oldmask);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (verbose_fmt_string != NULL)
|
||||
error (0, 0, verbose_fmt_string, dirpath);
|
||||
|
||||
if (owner != (uid_t) -1 && group != (gid_t) -1)
|
||||
{
|
||||
if (chown (dirpath, owner, group)
|
||||
#ifdef AFS
|
||||
&& errno != EPERM
|
||||
#endif
|
||||
)
|
||||
{
|
||||
error (0, errno, "%s", dirpath);
|
||||
retval = 1;
|
||||
}
|
||||
}
|
||||
/* chown may have turned off some permission bits we wanted. */
|
||||
if ((mode & 07000) != 0 && chmod (dirpath, mode))
|
||||
{
|
||||
error (0, errno, "%s", dirpath);
|
||||
retval = 1;
|
||||
}
|
||||
|
||||
/* If the mode for leading directories didn't include owner "wx"
|
||||
privileges, we have to reset their protections to the correct
|
||||
value. */
|
||||
for (p = leading_dirs; p != NULL; p = p->next)
|
||||
{
|
||||
*(p->dirname_end) = '\0';
|
||||
#if 0
|
||||
/* cpio always calls make_path with parent mode 0700, so
|
||||
we don't have to do this. If we ever do have to do this,
|
||||
we have to stat the directory first to get the setuid
|
||||
bit so we don't break HP CDF's. */
|
||||
if (chmod (dirpath, parent_mode))
|
||||
{
|
||||
error (0, errno, "%s", dirpath);
|
||||
retval = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We get here if the entire path already exists. */
|
||||
|
||||
if (!S_ISDIR (stats.st_mode))
|
||||
{
|
||||
error (0, 0, "`%s' exists but is not a directory", dirpath);
|
||||
umask (oldmask);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* chown must precede chmod because on some systems,
|
||||
chown clears the set[ug]id bits for non-superusers,
|
||||
resulting in incorrect permissions.
|
||||
On System V, users can give away files with chown and then not
|
||||
be able to chmod them. So don't give files away. */
|
||||
|
||||
if (owner != (uid_t) -1 && group != (gid_t) -1
|
||||
&& chown (dirpath, owner, group)
|
||||
#ifdef AFS
|
||||
&& errno != EPERM
|
||||
#endif
|
||||
)
|
||||
{
|
||||
error (0, errno, "%s", dirpath);
|
||||
retval = 1;
|
||||
}
|
||||
if (chmod (dirpath, mode))
|
||||
{
|
||||
error (0, errno, "%s", dirpath);
|
||||
retval = 1;
|
||||
}
|
||||
}
|
||||
|
||||
umask (oldmask);
|
||||
return retval;
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
/* Definitions for communicating with a remote tape drive.
|
||||
Copyright (C) 1988, 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if !defined(_POSIX_VERSION)
|
||||
#ifdef __MSDOS__
|
||||
#include <io.h>
|
||||
#else /* !__MSDOS__ */
|
||||
extern off_t lseek ();
|
||||
#endif /* __MSDOS__ */
|
||||
#endif /* _POSIX_VERSION */
|
||||
|
||||
#ifdef NO_REMOTE
|
||||
#define _isrmt(f) 0
|
||||
#define rmtopen open
|
||||
#define rmtaccess access
|
||||
#define rmtstat stat
|
||||
#define rmtcreat creat
|
||||
#define rmtlstat lstat
|
||||
#define rmtread read
|
||||
#define rmtwrite write
|
||||
#define rmtlseek lseek
|
||||
#define rmtclose close
|
||||
#define rmtioctl ioctl
|
||||
#define rmtdup dup
|
||||
#define rmtfstat fstat
|
||||
#define rmtfcntl fcntl
|
||||
#define rmtisatty isatty
|
||||
|
||||
#else /* !NO_REMOTE */
|
||||
|
||||
#define __REM_BIAS 128
|
||||
#define RMTIOCTL
|
||||
|
||||
#ifndef O_CREAT
|
||||
#define O_CREAT 01000
|
||||
#endif
|
||||
|
||||
extern char *__rmt_path;
|
||||
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#ifndef index
|
||||
#define index strchr
|
||||
#endif
|
||||
#else
|
||||
extern char *index ();
|
||||
#endif
|
||||
|
||||
#define _remdev(path) (!f_force_local && (__rmt_path=index(path, ':')))
|
||||
#define _isrmt(fd) ((fd) >= __REM_BIAS)
|
||||
|
||||
#define rmtopen(path,oflag,mode) (_remdev(path) ? __rmt_open(path, oflag, mode, __REM_BIAS) : open(path, oflag, mode))
|
||||
#define rmtaccess(path, amode) (_remdev(path) ? 0 : access(path, amode))
|
||||
#define rmtstat(path, buf) (_remdev(path) ? (errno = EOPNOTSUPP), -1 : stat(path, buf))
|
||||
#define rmtcreat(path, mode) (_remdev(path) ? __rmt_open (path, 1 | O_CREAT, mode, __REM_BIAS) : creat(path, mode))
|
||||
#define rmtlstat(path,buf) (_remdev(path) ? (errno = EOPNOTSUPP), -1 : lstat(path,buf))
|
||||
|
||||
#define rmtread(fd, buf, n) (_isrmt(fd) ? __rmt_read(fd - __REM_BIAS, buf, n) : read(fd, buf, n))
|
||||
#define rmtwrite(fd, buf, n) (_isrmt(fd) ? __rmt_write(fd - __REM_BIAS, buf, n) : write(fd, buf, n))
|
||||
#define rmtlseek(fd, off, wh) (_isrmt(fd) ? __rmt_lseek(fd - __REM_BIAS, off, wh) : lseek(fd, off, wh))
|
||||
#define rmtclose(fd) (_isrmt(fd) ? __rmt_close(fd - __REM_BIAS) : close(fd))
|
||||
#ifdef RMTIOCTL
|
||||
#define rmtioctl(fd,req,arg) (_isrmt(fd) ? __rmt_ioctl(fd - __REM_BIAS, req, arg) : ioctl(fd, req, arg))
|
||||
#else
|
||||
#define rmtioctl(fd,req,arg) (_isrmt(fd) ? (errno = EOPNOTSUPP), -1 : ioctl(fd, req, arg))
|
||||
#endif
|
||||
#define rmtdup(fd) (_isrmt(fd) ? (errno = EOPNOTSUPP), -1 : dup(fd))
|
||||
#define rmtfstat(fd, buf) (_isrmt(fd) ? (errno = EOPNOTSUPP), -1 : fstat(fd, buf))
|
||||
#define rmtfcntl(fd,cmd,arg) (_isrmt(fd) ? (errno = EOPNOTSUPP), -1 : fcntl (fd, cmd, arg))
|
||||
#define rmtisatty(fd) (_isrmt(fd) ? 0 : isatty(fd))
|
||||
|
||||
#undef RMTIOCTL
|
||||
|
||||
int __rmt_open ();
|
||||
int __rmt_close ();
|
||||
int __rmt_read ();
|
||||
int __rmt_write ();
|
||||
long __rmt_lseek ();
|
||||
int __rmt_ioctl ();
|
||||
#endif /* !NO_REMOTE */
|
||||
@@ -1,566 +0,0 @@
|
||||
/* Functions for communicating with a remote tape drive.
|
||||
Copyright (C) 1988, 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
/* The man page rmt(8) for /etc/rmt documents the remote mag tape
|
||||
protocol which rdump and rrestore use. Unfortunately, the man
|
||||
page is *WRONG*. The author of the routines I'm including originally
|
||||
wrote his code just based on the man page, and it didn't work, so he
|
||||
went to the rdump source to figure out why. The only thing he had to
|
||||
change was to check for the 'F' return code in addition to the 'E',
|
||||
and to separate the various arguments with \n instead of a space. I
|
||||
personally don't think that this is much of a problem, but I wanted to
|
||||
point it out. -- Arnold Robbins
|
||||
|
||||
Originally written by Jeff Lee, modified some by Arnold Robbins.
|
||||
Redone as a library that can replace open, read, write, etc., by
|
||||
Fred Fish, with some additional work by Arnold Robbins.
|
||||
Modified to make all rmtXXX calls into macros for speed by Jay Fenlason.
|
||||
Use -DHAVE_NETDB_H for rexec code, courtesy of Dan Kegel, srs!dan. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <signal.h>
|
||||
|
||||
#ifdef HAVE_SYS_MTIO_H
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mtio.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <setjmp.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#ifdef STDC_HEADERS
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
/* Maximum size of a fully qualified host name. */
|
||||
#define MAXHOSTLEN 257
|
||||
|
||||
/* Size of buffers for reading and writing commands to rmt.
|
||||
(An arbitrary limit.) */
|
||||
#define CMDBUFSIZE 64
|
||||
|
||||
#ifndef RETSIGTYPE
|
||||
#define RETSIGTYPE void
|
||||
#endif
|
||||
|
||||
/* Maximum number of simultaneous remote tape connections.
|
||||
(Another arbitrary limit.) */
|
||||
#define MAXUNIT 4
|
||||
|
||||
/* Return the parent's read side of remote tape connection FILDES. */
|
||||
#define READ(fildes) (from_rmt[fildes][0])
|
||||
|
||||
/* Return the parent's write side of remote tape connection FILDES. */
|
||||
#define WRITE(fildes) (to_rmt[fildes][1])
|
||||
|
||||
/* The pipes for receiving data from remote tape drives. */
|
||||
static int from_rmt[MAXUNIT][2] =
|
||||
{-1, -1, -1, -1, -1, -1, -1, -1};
|
||||
|
||||
/* The pipes for sending data to remote tape drives. */
|
||||
static int to_rmt[MAXUNIT][2] =
|
||||
{-1, -1, -1, -1, -1, -1, -1, -1};
|
||||
|
||||
/* Temporary variable used by macros in rmt.h. */
|
||||
char *__rmt_path;
|
||||
|
||||
/* Close remote tape connection FILDES. */
|
||||
|
||||
static void
|
||||
_rmt_shutdown (fildes)
|
||||
int fildes;
|
||||
{
|
||||
close (READ (fildes));
|
||||
close (WRITE (fildes));
|
||||
READ (fildes) = -1;
|
||||
WRITE (fildes) = -1;
|
||||
}
|
||||
|
||||
/* Attempt to perform the remote tape command specified in BUF
|
||||
on remote tape connection FILDES.
|
||||
Return 0 if successful, -1 on error. */
|
||||
|
||||
static int
|
||||
command (fildes, buf)
|
||||
int fildes;
|
||||
char *buf;
|
||||
{
|
||||
register int buflen;
|
||||
RETSIGTYPE (*pipe_handler) ();
|
||||
|
||||
/* Save the current pipe handler and try to make the request. */
|
||||
|
||||
pipe_handler = signal (SIGPIPE, SIG_IGN);
|
||||
buflen = strlen (buf);
|
||||
if (write (WRITE (fildes), buf, buflen) == buflen)
|
||||
{
|
||||
signal (SIGPIPE, pipe_handler);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Something went wrong. Close down and go home. */
|
||||
|
||||
signal (SIGPIPE, pipe_handler);
|
||||
_rmt_shutdown (fildes);
|
||||
errno = EIO;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Read and return the status from remote tape connection FILDES.
|
||||
If an error occurred, return -1 and set errno. */
|
||||
|
||||
static int
|
||||
status (fildes)
|
||||
int fildes;
|
||||
{
|
||||
int i;
|
||||
char c, *cp;
|
||||
char buffer[CMDBUFSIZE];
|
||||
|
||||
/* Read the reply command line. */
|
||||
|
||||
for (i = 0, cp = buffer; i < CMDBUFSIZE; i++, cp++)
|
||||
{
|
||||
if (read (READ (fildes), cp, 1) != 1)
|
||||
{
|
||||
_rmt_shutdown (fildes);
|
||||
errno = EIO;
|
||||
return -1;
|
||||
}
|
||||
if (*cp == '\n')
|
||||
{
|
||||
*cp = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == CMDBUFSIZE)
|
||||
{
|
||||
_rmt_shutdown (fildes);
|
||||
errno = EIO;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Check the return status. */
|
||||
|
||||
for (cp = buffer; *cp; cp++)
|
||||
if (*cp != ' ')
|
||||
break;
|
||||
|
||||
if (*cp == 'E' || *cp == 'F')
|
||||
{
|
||||
errno = atoi (cp + 1);
|
||||
/* Skip the error message line. */
|
||||
while (read (READ (fildes), &c, 1) == 1)
|
||||
if (c == '\n')
|
||||
break;
|
||||
|
||||
if (*cp == 'F')
|
||||
_rmt_shutdown (fildes);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Check for mis-synced pipes. */
|
||||
|
||||
if (*cp != 'A')
|
||||
{
|
||||
_rmt_shutdown (fildes);
|
||||
errno = EIO;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Got an `A' (success) response. */
|
||||
return atoi (cp + 1);
|
||||
}
|
||||
|
||||
#ifdef HAVE_NETDB_H
|
||||
/* Execute /etc/rmt as user USER on remote system HOST using rexec.
|
||||
Return a file descriptor of a bidirectional socket for stdin and stdout.
|
||||
If USER is NULL, or an empty string, use the current username.
|
||||
|
||||
By default, this code is not used, since it requires that
|
||||
the user have a .netrc file in his/her home directory, or that the
|
||||
application designer be willing to have rexec prompt for login and
|
||||
password info. This may be unacceptable, and .rhosts files for use
|
||||
with rsh are much more common on BSD systems. */
|
||||
|
||||
static int
|
||||
_rmt_rexec (host, user)
|
||||
char *host;
|
||||
char *user;
|
||||
{
|
||||
struct servent *rexecserv;
|
||||
int save_stdin = dup (fileno (stdin));
|
||||
int save_stdout = dup (fileno (stdout));
|
||||
int tape_fd; /* Return value. */
|
||||
|
||||
/* When using cpio -o < filename, stdin is no longer the tty.
|
||||
But the rexec subroutine reads the login and the passwd on stdin,
|
||||
to allow remote execution of the command.
|
||||
So, reopen stdin and stdout on /dev/tty before the rexec and
|
||||
give them back their original value after. */
|
||||
if (freopen ("/dev/tty", "r", stdin) == NULL)
|
||||
freopen ("/dev/null", "r", stdin);
|
||||
if (freopen ("/dev/tty", "w", stdout) == NULL)
|
||||
freopen ("/dev/null", "w", stdout);
|
||||
|
||||
rexecserv = getservbyname ("exec", "tcp");
|
||||
if (NULL == rexecserv)
|
||||
{
|
||||
fprintf (stderr, "exec/tcp: service not available");
|
||||
exit (1);
|
||||
}
|
||||
if (user != NULL && *user == '\0')
|
||||
user = NULL;
|
||||
tape_fd = rexec (&host, rexecserv->s_port, user, NULL,
|
||||
"/etc/rmt", (int *) NULL);
|
||||
fclose (stdin);
|
||||
fdopen (save_stdin, "r");
|
||||
fclose (stdout);
|
||||
fdopen (save_stdout, "w");
|
||||
|
||||
return tape_fd;
|
||||
}
|
||||
|
||||
#endif /* HAVE_NETDB_H */
|
||||
|
||||
/* Open a magtape device on the system specified in PATH, as the given user.
|
||||
PATH has the form `[user@]system:/dev/????'.
|
||||
If COMPAT is defined, it can also have the form `system[.user]:/dev/????'.
|
||||
|
||||
OFLAG is O_RDONLY, O_WRONLY, etc.
|
||||
MODE is ignored; 0666 is always used.
|
||||
|
||||
If successful, return the remote tape pipe number plus BIAS.
|
||||
On error, return -1. */
|
||||
|
||||
int
|
||||
__rmt_open (path, oflag, mode, bias)
|
||||
char *path;
|
||||
int oflag;
|
||||
int mode;
|
||||
int bias;
|
||||
{
|
||||
int i, rc;
|
||||
char buffer[CMDBUFSIZE]; /* Command buffer. */
|
||||
char system[MAXHOSTLEN]; /* The remote host name. */
|
||||
char device[CMDBUFSIZE]; /* The remote device name. */
|
||||
char login[CMDBUFSIZE]; /* The remote user name. */
|
||||
char *sys, *dev, *user; /* For copying into the above buffers. */
|
||||
|
||||
sys = system;
|
||||
dev = device;
|
||||
user = login;
|
||||
|
||||
/* Find an unused pair of file descriptors. */
|
||||
|
||||
for (i = 0; i < MAXUNIT; i++)
|
||||
if (READ (i) == -1 && WRITE (i) == -1)
|
||||
break;
|
||||
|
||||
if (i == MAXUNIT)
|
||||
{
|
||||
errno = EMFILE;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Pull apart the system and device, and optional user.
|
||||
Don't munge the original string. */
|
||||
|
||||
while (*path != '@'
|
||||
#ifdef COMPAT
|
||||
&& *path != '.'
|
||||
#endif
|
||||
&& *path != ':')
|
||||
{
|
||||
*sys++ = *path++;
|
||||
}
|
||||
*sys = '\0';
|
||||
path++;
|
||||
|
||||
if (*(path - 1) == '@')
|
||||
{
|
||||
/* Saw user part of user@host. Start over. */
|
||||
strcpy (user, system);
|
||||
sys = system;
|
||||
while (*path != ':')
|
||||
{
|
||||
*sys++ = *path++;
|
||||
}
|
||||
*sys = '\0';
|
||||
path++;
|
||||
}
|
||||
#ifdef COMPAT
|
||||
else if (*(path - 1) == '.')
|
||||
{
|
||||
while (*path != ':')
|
||||
{
|
||||
*user++ = *path++;
|
||||
}
|
||||
*user = '\0';
|
||||
path++;
|
||||
}
|
||||
#endif
|
||||
else
|
||||
*user = '\0';
|
||||
|
||||
while (*path)
|
||||
{
|
||||
*dev++ = *path++;
|
||||
}
|
||||
*dev = '\0';
|
||||
|
||||
#ifdef HAVE_NETDB_H
|
||||
/* Execute the remote command using rexec. */
|
||||
READ (i) = WRITE (i) = _rmt_rexec (system, login);
|
||||
if (READ (i) < 0)
|
||||
return -1;
|
||||
#else /* !HAVE_NETDB_H */
|
||||
/* Set up the pipes for the `rsh' command, and fork. */
|
||||
|
||||
if (pipe (to_rmt[i]) == -1 || pipe (from_rmt[i]) == -1)
|
||||
return -1;
|
||||
|
||||
rc = fork ();
|
||||
if (rc == -1)
|
||||
return -1;
|
||||
|
||||
if (rc == 0)
|
||||
{
|
||||
/* Child. */
|
||||
close (0);
|
||||
dup (to_rmt[i][0]);
|
||||
close (to_rmt[i][0]);
|
||||
close (to_rmt[i][1]);
|
||||
|
||||
close (1);
|
||||
dup (from_rmt[i][1]);
|
||||
close (from_rmt[i][0]);
|
||||
close (from_rmt[i][1]);
|
||||
|
||||
setuid (getuid ());
|
||||
setgid (getgid ());
|
||||
|
||||
if (*login)
|
||||
{
|
||||
execl ("/usr/bin/rsh", "rsh", "-l", login, system,
|
||||
"/etc/rmt", (char *) 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
execl ("/usr/bin/rsh", "rsh", system,
|
||||
"/etc/rmt", (char *) 0);
|
||||
}
|
||||
|
||||
/* Bad problems if we get here. */
|
||||
|
||||
perror ("cannot execute remote shell");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
/* Parent. */
|
||||
close (to_rmt[i][0]);
|
||||
close (from_rmt[i][1]);
|
||||
#endif /* !HAVE_NETDB_H */
|
||||
|
||||
/* Attempt to open the tape device. */
|
||||
|
||||
sprintf (buffer, "O%s\n%d\n", device, oflag);
|
||||
if (command (i, buffer) == -1 || status (i) == -1)
|
||||
return -1;
|
||||
|
||||
return i + bias;
|
||||
}
|
||||
|
||||
/* Close remote tape connection FILDES and shut down.
|
||||
Return 0 if successful, -1 on error. */
|
||||
|
||||
int
|
||||
__rmt_close (fildes)
|
||||
int fildes;
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (command (fildes, "C\n") == -1)
|
||||
return -1;
|
||||
|
||||
rc = status (fildes);
|
||||
_rmt_shutdown (fildes);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Read up to NBYTE bytes into BUF from remote tape connection FILDES.
|
||||
Return the number of bytes read on success, -1 on error. */
|
||||
|
||||
int
|
||||
__rmt_read (fildes, buf, nbyte)
|
||||
int fildes;
|
||||
char *buf;
|
||||
unsigned int nbyte;
|
||||
{
|
||||
int rc, i;
|
||||
char buffer[CMDBUFSIZE];
|
||||
|
||||
sprintf (buffer, "R%d\n", nbyte);
|
||||
if (command (fildes, buffer) == -1 || (rc = status (fildes)) == -1)
|
||||
return -1;
|
||||
|
||||
for (i = 0; i < rc; i += nbyte, buf += nbyte)
|
||||
{
|
||||
nbyte = read (READ (fildes), buf, rc - i);
|
||||
if (nbyte <= 0)
|
||||
{
|
||||
_rmt_shutdown (fildes);
|
||||
errno = EIO;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Write NBYTE bytes from BUF to remote tape connection FILDES.
|
||||
Return the number of bytes written on success, -1 on error. */
|
||||
|
||||
int
|
||||
__rmt_write (fildes, buf, nbyte)
|
||||
int fildes;
|
||||
char *buf;
|
||||
unsigned int nbyte;
|
||||
{
|
||||
char buffer[CMDBUFSIZE];
|
||||
RETSIGTYPE (*pipe_handler) ();
|
||||
|
||||
sprintf (buffer, "W%d\n", nbyte);
|
||||
if (command (fildes, buffer) == -1)
|
||||
return -1;
|
||||
|
||||
pipe_handler = signal (SIGPIPE, SIG_IGN);
|
||||
if (write (WRITE (fildes), buf, nbyte) == nbyte)
|
||||
{
|
||||
signal (SIGPIPE, pipe_handler);
|
||||
return status (fildes);
|
||||
}
|
||||
|
||||
/* Write error. */
|
||||
signal (SIGPIPE, pipe_handler);
|
||||
_rmt_shutdown (fildes);
|
||||
errno = EIO;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Perform an imitation lseek operation on remote tape connection FILDES.
|
||||
Return the new file offset if successful, -1 if on error. */
|
||||
|
||||
long
|
||||
__rmt_lseek (fildes, offset, whence)
|
||||
int fildes;
|
||||
long offset;
|
||||
int whence;
|
||||
{
|
||||
char buffer[CMDBUFSIZE];
|
||||
|
||||
sprintf (buffer, "L%ld\n%d\n", offset, whence);
|
||||
if (command (fildes, buffer) == -1)
|
||||
return -1;
|
||||
|
||||
return status (fildes);
|
||||
}
|
||||
|
||||
/* Perform a raw tape operation on remote tape connection FILDES.
|
||||
Return the results of the ioctl, or -1 on error. */
|
||||
|
||||
#ifdef MTIOCTOP
|
||||
int
|
||||
__rmt_ioctl (fildes, op, arg)
|
||||
int fildes, op;
|
||||
char *arg;
|
||||
{
|
||||
char c;
|
||||
int rc, cnt;
|
||||
char buffer[CMDBUFSIZE];
|
||||
|
||||
switch (op)
|
||||
{
|
||||
default:
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
|
||||
case MTIOCTOP:
|
||||
/* MTIOCTOP is the easy one. Nothing is transfered in binary. */
|
||||
sprintf (buffer, "I%d\n%d\n", ((struct mtop *) arg)->mt_op,
|
||||
((struct mtop *) arg)->mt_count);
|
||||
if (command (fildes, buffer) == -1)
|
||||
return -1;
|
||||
return status (fildes); /* Return the count. */
|
||||
|
||||
case MTIOCGET:
|
||||
/* Grab the status and read it directly into the structure.
|
||||
This assumes that the status buffer is not padded
|
||||
and that 2 shorts fit in a long without any word
|
||||
alignment problems; i.e., the whole struct is contiguous.
|
||||
NOTE - this is probably NOT a good assumption. */
|
||||
|
||||
if (command (fildes, "S") == -1 || (rc = status (fildes)) == -1)
|
||||
return -1;
|
||||
|
||||
for (; rc > 0; rc -= cnt, arg += cnt)
|
||||
{
|
||||
cnt = read (READ (fildes), arg, rc);
|
||||
if (cnt <= 0)
|
||||
{
|
||||
_rmt_shutdown (fildes);
|
||||
errno = EIO;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for byte position. mt_type is a small integer field
|
||||
(normally) so we will check its magnitude. If it is larger than
|
||||
256, we will assume that the bytes are swapped and go through
|
||||
and reverse all the bytes. */
|
||||
|
||||
if (((struct mtget *) arg)->mt_type < 256)
|
||||
return 0;
|
||||
|
||||
for (cnt = 0; cnt < rc; cnt += 2)
|
||||
{
|
||||
c = arg[cnt];
|
||||
arg[cnt] = arg[cnt + 1];
|
||||
arg[cnt + 1] = c;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1 +0,0 @@
|
||||
#define SAFE_STAT(path,pbuf) stat(path,pbuf)
|
||||
@@ -1,43 +0,0 @@
|
||||
/* stripslash.c -- remove trailing slashes from a string
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#else
|
||||
#include <strings.h>
|
||||
#endif
|
||||
|
||||
/* Remove trailing slashes from PATH.
|
||||
This is useful when using filename completion from a shell that
|
||||
adds a "/" after directory names (such as tcsh and bash), because
|
||||
the Unix rename and rmdir system calls return an "Invalid argument" error
|
||||
when given a path that ends in "/" (except for the root directory). */
|
||||
|
||||
void
|
||||
strip_trailing_slashes (path)
|
||||
char *path;
|
||||
{
|
||||
int last;
|
||||
|
||||
last = strlen (path) - 1;
|
||||
while (last > 0 && path[last] == '/')
|
||||
path[last--] = '\0';
|
||||
}
|
||||
@@ -1,142 +0,0 @@
|
||||
/* System dependent declarations. Requires sys/types.h.
|
||||
Copyright (C) 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#ifndef index
|
||||
#define index strchr
|
||||
#endif
|
||||
#ifndef rindex
|
||||
#define rindex strrchr
|
||||
#endif
|
||||
#ifndef bcmp
|
||||
#define bcmp(s1, s2, n) memcmp ((s1), (s2), (n))
|
||||
#endif
|
||||
#ifndef bzero
|
||||
#define bzero(s, n) memset ((s), 0, (n))
|
||||
#endif
|
||||
#else
|
||||
#include <strings.h>
|
||||
#endif
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifndef SEEK_SET
|
||||
#define SEEK_SET 0
|
||||
#define SEEK_CUR 1
|
||||
#define SEEK_END 2
|
||||
#endif
|
||||
|
||||
#ifndef _POSIX_VERSION
|
||||
#if defined(__MSDOS__) && !defined(__GNUC__)
|
||||
typedef long off_t;
|
||||
#endif
|
||||
off_t lseek ();
|
||||
#endif
|
||||
|
||||
/* Since major is a function on SVR4, we can't use `ifndef major'. */
|
||||
#ifdef MAJOR_IN_MKDEV
|
||||
#include <sys/mkdev.h>
|
||||
#define HAVE_MAJOR
|
||||
#endif
|
||||
|
||||
#ifdef MAJOR_IN_SYSMACROS
|
||||
#include <sys/sysmacros.h>
|
||||
#define HAVE_MAJOR
|
||||
#endif
|
||||
|
||||
#ifdef major /* Might be defined in sys/types.h. */
|
||||
#define HAVE_MAJOR
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_MAJOR
|
||||
#define major(dev) (((dev) >> 8) & 0xff)
|
||||
#define minor(dev) ((dev) & 0xff)
|
||||
#define makedev(ma, mi) (((ma) << 8) | (mi))
|
||||
#endif
|
||||
#undef HAVE_MAJOR
|
||||
|
||||
#if defined(__MSDOS__) || defined(_POSIX_VERSION) || defined(HAVE_FCNTL_H)
|
||||
#include <fcntl.h>
|
||||
#else
|
||||
#include <sys/file.h>
|
||||
#endif
|
||||
#ifndef O_BINARY
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
#ifdef __EMX__ /* gcc on OS/2. */
|
||||
#define EPERM EACCES
|
||||
#define ENXIO EIO
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UTIME_H
|
||||
#include <utime.h>
|
||||
#else
|
||||
struct utimbuf
|
||||
{
|
||||
time_t actime;
|
||||
time_t modtime;
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef TRUE
|
||||
#undef TRUE
|
||||
#endif
|
||||
#define TRUE 1
|
||||
#ifdef FALSE
|
||||
#undef FALSE
|
||||
#endif
|
||||
#define FALSE 0
|
||||
|
||||
#ifndef __MSDOS__
|
||||
#define CONSOLE "/dev/tty"
|
||||
#else
|
||||
#define CONSOLE "con"
|
||||
#endif
|
||||
|
||||
#if defined(__MSDOS__) && !defined(__GNUC__)
|
||||
typedef int uid_t;
|
||||
typedef int gid_t;
|
||||
#endif
|
||||
|
||||
/* On most systems symlink() always creates links with rwxrwxrwx
|
||||
protection modes, but on some (HP/UX 8.07; I think maybe DEC's OSF
|
||||
on MIPS too) symlink() uses the value of umask, so links' protection modes
|
||||
aren't always rwxrwxrwx. There doesn't seem to be any way to change
|
||||
the modes of a link (no system call like, say, lchmod() ), it seems
|
||||
the only way to set the modes right is to set umask before calling
|
||||
symlink(). */
|
||||
|
||||
#ifndef SYMLINK_USES_UMASK
|
||||
#define UMASKED_SYMLINK(name1,name2,mode) symlink(name1,name2)
|
||||
#else
|
||||
#define UMASKED_SYMLINK(name1,name2,mode) umasked_symlink(name1,name2,mode)
|
||||
#endif /* SYMLINK_USES_UMASK */
|
||||
|
||||
@@ -1,522 +0,0 @@
|
||||
/* tar.c - read in write tar headers for cpio
|
||||
Copyright (C) 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "filetypes.h"
|
||||
#include "system.h"
|
||||
#include "cpiohdr.h"
|
||||
#include "dstring.h"
|
||||
#include "extern.h"
|
||||
#include "rmt.h"
|
||||
#include "tarhdr.h"
|
||||
|
||||
static void to_oct ();
|
||||
static char *stash_tar_linkname ();
|
||||
static char *stash_tar_filename ();
|
||||
|
||||
/* Compute and return a checksum for TAR_HDR,
|
||||
counting the checksum bytes as if they were spaces. */
|
||||
|
||||
unsigned long
|
||||
tar_checksum (tar_hdr)
|
||||
struct tar_header *tar_hdr;
|
||||
{
|
||||
unsigned long sum = 0;
|
||||
char *p = (char *) tar_hdr;
|
||||
char *q = p + TARRECORDSIZE;
|
||||
int i;
|
||||
|
||||
while (p < tar_hdr->chksum)
|
||||
sum += *p++ & 0xff;
|
||||
for (i = 0; i < 8; ++i)
|
||||
{
|
||||
sum += ' ';
|
||||
++p;
|
||||
}
|
||||
while (p < q)
|
||||
sum += *p++ & 0xff;
|
||||
return sum;
|
||||
}
|
||||
|
||||
/* Write out header FILE_HDR, including the file name, to file
|
||||
descriptor OUT_DES. */
|
||||
|
||||
void
|
||||
write_out_tar_header (file_hdr, out_des)
|
||||
struct new_cpio_header *file_hdr;
|
||||
int out_des;
|
||||
{
|
||||
int name_len;
|
||||
union tar_record tar_rec;
|
||||
struct tar_header *tar_hdr = (struct tar_header *) &tar_rec;
|
||||
|
||||
bzero ((char *) &tar_rec, TARRECORDSIZE);
|
||||
|
||||
/* process_copy_out must ensure that file_hdr->c_name is short enough,
|
||||
or we will lose here. */
|
||||
|
||||
name_len = strlen (file_hdr->c_name);
|
||||
if (name_len <= TARNAMESIZE)
|
||||
{
|
||||
strncpy (tar_hdr->name, file_hdr->c_name, name_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Fit as much as we can into `name', the rest into `prefix'. */
|
||||
char *suffix = file_hdr->c_name + name_len - TARNAMESIZE;
|
||||
|
||||
/* We have to put the boundary at a slash. */
|
||||
name_len = TARNAMESIZE;
|
||||
while (*suffix != '/')
|
||||
{
|
||||
--name_len;
|
||||
++suffix;
|
||||
}
|
||||
strncpy (tar_hdr->name, suffix + 1, name_len);
|
||||
strncpy (tar_hdr->prefix, file_hdr->c_name, suffix - file_hdr->c_name);
|
||||
}
|
||||
|
||||
/* SVR4 seems to want the whole mode, not just protection modes.
|
||||
Nobody else seems to care, so we might as well put it all in. */
|
||||
to_oct (file_hdr->c_mode, 8, tar_hdr->mode);
|
||||
to_oct (file_hdr->c_uid, 8, tar_hdr->uid);
|
||||
to_oct (file_hdr->c_gid, 8, tar_hdr->gid);
|
||||
to_oct (file_hdr->c_filesize, 12, tar_hdr->size);
|
||||
to_oct (file_hdr->c_mtime, 12, tar_hdr->mtime);
|
||||
|
||||
switch (file_hdr->c_mode & CP_IFMT)
|
||||
{
|
||||
case CP_IFREG:
|
||||
if (file_hdr->c_tar_linkname)
|
||||
{
|
||||
/* process_copy_out makes sure that c_tar_linkname is shorter
|
||||
than TARLINKNAMESIZE. */
|
||||
strncpy (tar_hdr->linkname, file_hdr->c_tar_linkname,
|
||||
TARLINKNAMESIZE);
|
||||
tar_hdr->typeflag = LNKTYPE;
|
||||
to_oct (0, 12, tar_hdr->size);
|
||||
}
|
||||
else
|
||||
tar_hdr->typeflag = REGTYPE;
|
||||
break;
|
||||
case CP_IFDIR:
|
||||
tar_hdr->typeflag = DIRTYPE;
|
||||
break;
|
||||
#ifndef __MSDOS__
|
||||
case CP_IFCHR:
|
||||
tar_hdr->typeflag = CHRTYPE;
|
||||
break;
|
||||
case CP_IFBLK:
|
||||
tar_hdr->typeflag = BLKTYPE;
|
||||
break;
|
||||
#ifdef CP_IFIFO
|
||||
case CP_IFIFO:
|
||||
tar_hdr->typeflag = FIFOTYPE;
|
||||
break;
|
||||
#endif /* CP_IFIFO */
|
||||
#ifdef CP_IFLNK
|
||||
case CP_IFLNK:
|
||||
tar_hdr->typeflag = SYMTYPE;
|
||||
/* process_copy_out makes sure that c_tar_linkname is shorter
|
||||
than TARLINKNAMESIZE. */
|
||||
strncpy (tar_hdr->linkname, file_hdr->c_tar_linkname,
|
||||
TARLINKNAMESIZE);
|
||||
to_oct (0, 12, tar_hdr->size);
|
||||
break;
|
||||
#endif /* CP_IFLNK */
|
||||
#endif /* !__MSDOS__ */
|
||||
}
|
||||
|
||||
if (archive_format == arf_ustar)
|
||||
{
|
||||
char *name;
|
||||
|
||||
strncpy (tar_hdr->magic, TMAGIC, TMAGLEN);
|
||||
strncpy (tar_hdr->magic + TMAGLEN, TVERSION, TVERSLEN);
|
||||
|
||||
#ifndef __MSDOS__
|
||||
name = getuser (file_hdr->c_uid);
|
||||
if (name)
|
||||
strcpy (tar_hdr->uname, name);
|
||||
name = getgroup (file_hdr->c_gid);
|
||||
if (name)
|
||||
strcpy (tar_hdr->gname, name);
|
||||
#endif
|
||||
|
||||
to_oct (file_hdr->c_rdev_maj, 8, tar_hdr->devmajor);
|
||||
to_oct (file_hdr->c_rdev_min, 8, tar_hdr->devminor);
|
||||
}
|
||||
|
||||
to_oct (tar_checksum (tar_hdr), 8, tar_hdr->chksum);
|
||||
|
||||
tape_buffered_write ((char *) &tar_rec, out_des, TARRECORDSIZE);
|
||||
}
|
||||
|
||||
/* Return nonzero iff all the bytes in BLOCK are NUL.
|
||||
SIZE is the number of bytes to check in BLOCK; it must be a
|
||||
multiple of sizeof (long). */
|
||||
|
||||
int
|
||||
null_block (block, size)
|
||||
long *block;
|
||||
int size;
|
||||
{
|
||||
register long *p = block;
|
||||
register int i = size / sizeof (long);
|
||||
|
||||
while (i--)
|
||||
if (*p++)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Read a tar header, including the file name, from file descriptor IN_DES
|
||||
into FILE_HDR. */
|
||||
|
||||
void
|
||||
read_in_tar_header (file_hdr, in_des)
|
||||
struct new_cpio_header *file_hdr;
|
||||
int in_des;
|
||||
{
|
||||
long bytes_skipped = 0;
|
||||
int warned = FALSE;
|
||||
union tar_record tar_rec;
|
||||
struct tar_header *tar_hdr = (struct tar_header *) &tar_rec;
|
||||
#ifndef __MSDOS__
|
||||
uid_t *uidp;
|
||||
gid_t *gidp;
|
||||
#endif
|
||||
|
||||
tape_buffered_read ((char *) &tar_rec, in_des, TARRECORDSIZE);
|
||||
|
||||
/* Check for a block of 0's. */
|
||||
if (null_block ((long *) &tar_rec, TARRECORDSIZE))
|
||||
{
|
||||
#if 0
|
||||
/* Found one block of 512 0's. If the next block is also all 0's
|
||||
then this is the end of the archive. If not, assume the
|
||||
previous block was all corruption and continue reading
|
||||
the archive. */
|
||||
/* Commented out because GNU tar sometimes creates archives with
|
||||
only one block of 0's at the end. This happened for the
|
||||
cpio 2.0 distribution! */
|
||||
tape_buffered_read ((char *) &tar_rec, in_des, TARRECORDSIZE);
|
||||
if (null_block ((long *) &tar_rec, TARRECORDSIZE))
|
||||
#endif
|
||||
{
|
||||
file_hdr->c_name = "TRAILER!!!";
|
||||
return;
|
||||
}
|
||||
#if 0
|
||||
bytes_skipped = TARRECORDSIZE;
|
||||
#endif
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
otoa (tar_hdr->chksum, &file_hdr->c_chksum);
|
||||
|
||||
if (file_hdr->c_chksum != tar_checksum (tar_hdr))
|
||||
{
|
||||
/* If the checksum is bad, skip 1 byte and try again. When
|
||||
we try again we do not look for an EOF record (all zeros),
|
||||
because when we start skipping bytes in a corrupted archive
|
||||
the chances are pretty good that we might stumble across
|
||||
2 blocks of 512 zeros (that probably is not really the last
|
||||
record) and it is better to miss the EOF and give the user
|
||||
a "premature EOF" error than to give up too soon on a corrupted
|
||||
archive. */
|
||||
if (!warned)
|
||||
{
|
||||
error (0, 0, "invalid header: checksum error");
|
||||
warned = TRUE;
|
||||
}
|
||||
bcopy (((char *) &tar_rec) + 1, (char *) &tar_rec,
|
||||
TARRECORDSIZE - 1);
|
||||
tape_buffered_read (((char *) &tar_rec) + (TARRECORDSIZE - 1), in_des, 1);
|
||||
++bytes_skipped;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (archive_format != arf_ustar)
|
||||
file_hdr->c_name = stash_tar_filename (NULL, tar_hdr->name);
|
||||
else
|
||||
file_hdr->c_name = stash_tar_filename (tar_hdr->prefix, tar_hdr->name);
|
||||
file_hdr->c_nlink = 1;
|
||||
otoa (tar_hdr->mode, &file_hdr->c_mode);
|
||||
file_hdr->c_mode = file_hdr->c_mode & 07777;
|
||||
#ifndef __MSDOS__
|
||||
if (archive_format == arf_ustar
|
||||
&& (uidp = getuidbyname (tar_hdr->uname)))
|
||||
file_hdr->c_uid = *uidp;
|
||||
else
|
||||
#endif
|
||||
otoa (tar_hdr->uid, &file_hdr->c_uid);
|
||||
#ifndef __MSDOS__
|
||||
if (archive_format == arf_ustar
|
||||
&& (gidp = getgidbyname (tar_hdr->gname)))
|
||||
file_hdr->c_gid = *gidp;
|
||||
else
|
||||
#endif
|
||||
otoa (tar_hdr->gid, &file_hdr->c_gid);
|
||||
otoa (tar_hdr->size, &file_hdr->c_filesize);
|
||||
otoa (tar_hdr->mtime, &file_hdr->c_mtime);
|
||||
otoa (tar_hdr->devmajor, (unsigned long *) &file_hdr->c_rdev_maj);
|
||||
otoa (tar_hdr->devminor, (unsigned long *) &file_hdr->c_rdev_min);
|
||||
file_hdr->c_tar_linkname = NULL;
|
||||
|
||||
switch (tar_hdr->typeflag)
|
||||
{
|
||||
case REGTYPE:
|
||||
case CONTTYPE: /* For now, punt. */
|
||||
default:
|
||||
file_hdr->c_mode |= CP_IFREG;
|
||||
break;
|
||||
case DIRTYPE:
|
||||
file_hdr->c_mode |= CP_IFDIR;
|
||||
break;
|
||||
#ifndef __MSDOS__
|
||||
case CHRTYPE:
|
||||
file_hdr->c_mode |= CP_IFCHR;
|
||||
/* If a POSIX tar header has a valid linkname it's always supposed
|
||||
to set typeflag to be LNKTYPE. System V.4 tar seems to
|
||||
be broken, and for device files with multiple links it
|
||||
puts the name of the link into linkname, but leaves typeflag
|
||||
as CHRTYPE, BLKTYPE, FIFOTYPE, etc. */
|
||||
file_hdr->c_tar_linkname = stash_tar_linkname (tar_hdr->linkname);
|
||||
|
||||
/* Does POSIX say that the filesize must be 0 for devices? We
|
||||
assume so, but HPUX's POSIX tar sets it to be 1 which causes
|
||||
us problems (when reading an archive we assume we can always
|
||||
skip to the next file by skipping filesize bytes). For
|
||||
now at least, it's easier to clear filesize for devices,
|
||||
rather than check everywhere we skip in copyin.c. */
|
||||
file_hdr->c_filesize = 0;
|
||||
break;
|
||||
case BLKTYPE:
|
||||
file_hdr->c_mode |= CP_IFBLK;
|
||||
file_hdr->c_tar_linkname = stash_tar_linkname (tar_hdr->linkname);
|
||||
file_hdr->c_filesize = 0;
|
||||
break;
|
||||
#ifdef CP_IFIFO
|
||||
case FIFOTYPE:
|
||||
file_hdr->c_mode |= CP_IFIFO;
|
||||
file_hdr->c_tar_linkname = stash_tar_linkname (tar_hdr->linkname);
|
||||
file_hdr->c_filesize = 0;
|
||||
break;
|
||||
#endif
|
||||
case SYMTYPE:
|
||||
#ifdef CP_IFLNK
|
||||
file_hdr->c_mode |= CP_IFLNK;
|
||||
file_hdr->c_tar_linkname = stash_tar_linkname (tar_hdr->linkname);
|
||||
file_hdr->c_filesize = 0;
|
||||
break;
|
||||
/* Else fall through. */
|
||||
#endif
|
||||
case LNKTYPE:
|
||||
file_hdr->c_mode |= CP_IFREG;
|
||||
file_hdr->c_tar_linkname = stash_tar_linkname (tar_hdr->linkname);
|
||||
file_hdr->c_filesize = 0;
|
||||
break;
|
||||
#endif /* !__MSDOS__ */
|
||||
case AREGTYPE:
|
||||
/* Old tar format; if the last char in filename is '/' then it is
|
||||
a directory, otherwise it's a regular file. */
|
||||
if (file_hdr->c_name[strlen (file_hdr->c_name) - 1] == '/')
|
||||
file_hdr->c_mode |= CP_IFDIR;
|
||||
else
|
||||
file_hdr->c_mode |= CP_IFREG;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (bytes_skipped > 0)
|
||||
error (0, 0, "warning: skipped %ld bytes of junk", bytes_skipped);
|
||||
}
|
||||
|
||||
/* Stash the tar linkname in static storage. */
|
||||
|
||||
static char *
|
||||
stash_tar_linkname (linkname)
|
||||
char *linkname;
|
||||
{
|
||||
static char hold_tar_linkname[TARLINKNAMESIZE + 1];
|
||||
|
||||
strncpy (hold_tar_linkname, linkname, TARLINKNAMESIZE);
|
||||
hold_tar_linkname[TARLINKNAMESIZE] = '\0';
|
||||
return hold_tar_linkname;
|
||||
}
|
||||
|
||||
/* Stash the tar filename and optional prefix in static storage. */
|
||||
|
||||
static char *
|
||||
stash_tar_filename (prefix, filename)
|
||||
char *prefix;
|
||||
char *filename;
|
||||
{
|
||||
static char hold_tar_filename[TARNAMESIZE + TARPREFIXSIZE + 2];
|
||||
if (prefix == NULL || *prefix == '\0')
|
||||
{
|
||||
strncpy (hold_tar_filename, filename, TARNAMESIZE);
|
||||
hold_tar_filename[TARNAMESIZE] = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy (hold_tar_filename, prefix, TARPREFIXSIZE);
|
||||
hold_tar_filename[TARPREFIXSIZE] = '\0';
|
||||
strcat (hold_tar_filename, "/");
|
||||
strncat (hold_tar_filename, filename, TARNAMESIZE);
|
||||
hold_tar_filename[TARPREFIXSIZE + TARNAMESIZE] = '\0';
|
||||
}
|
||||
return hold_tar_filename;
|
||||
}
|
||||
|
||||
/* Convert the string of octal digits S into a number and store
|
||||
it in *N. Return nonzero if the whole string was converted,
|
||||
zero if there was something after the number.
|
||||
Skip leading and trailing spaces. */
|
||||
|
||||
int
|
||||
otoa (s, n)
|
||||
char *s;
|
||||
unsigned long *n;
|
||||
{
|
||||
unsigned long val = 0;
|
||||
|
||||
while (*s == ' ')
|
||||
++s;
|
||||
while (*s >= '0' && *s <= '7')
|
||||
val = 8 * val + *s++ - '0';
|
||||
while (*s == ' ')
|
||||
++s;
|
||||
*n = val;
|
||||
return *s == '\0';
|
||||
}
|
||||
|
||||
/* Convert a number into a string of octal digits.
|
||||
Convert long VALUE into a DIGITS-digit field at WHERE,
|
||||
including a trailing space and room for a NUL. DIGITS==3 means
|
||||
1 digit, a space, and room for a NUL.
|
||||
|
||||
We assume the trailing NUL is already there and don't fill it in.
|
||||
This fact is used by start_header and finish_header, so don't change it!
|
||||
|
||||
This is be equivalent to:
|
||||
sprintf (where, "%*lo ", digits - 2, value);
|
||||
except that sprintf fills in the trailing NUL and we don't. */
|
||||
|
||||
static void
|
||||
to_oct (value, digits, where)
|
||||
register long value;
|
||||
register int digits;
|
||||
register char *where;
|
||||
{
|
||||
--digits; /* Leave the trailing NUL slot alone. */
|
||||
where[--digits] = ' '; /* Put in the space, though. */
|
||||
|
||||
/* Produce the digits -- at least one. */
|
||||
do
|
||||
{
|
||||
where[--digits] = '0' + (char) (value & 7); /* One octal digit. */
|
||||
value >>= 3;
|
||||
}
|
||||
while (digits > 0 && value != 0);
|
||||
|
||||
/* Add leading spaces, if necessary. */
|
||||
while (digits > 0)
|
||||
where[--digits] = ' ';
|
||||
}
|
||||
|
||||
/* Return
|
||||
2 if BUF is a valid POSIX tar header (the checksum is correct
|
||||
and it has the "ustar" magic string),
|
||||
1 if BUF is a valid old tar header (the checksum is correct),
|
||||
0 otherwise. */
|
||||
|
||||
int
|
||||
is_tar_header (buf)
|
||||
char *buf;
|
||||
{
|
||||
struct tar_header *tar_hdr = (struct tar_header *) buf;
|
||||
unsigned long chksum;
|
||||
|
||||
otoa (tar_hdr->chksum, &chksum);
|
||||
|
||||
if (chksum != tar_checksum (tar_hdr))
|
||||
return 0;
|
||||
|
||||
/* GNU tar 1.10 and previous set the magic field to be "ustar " instead
|
||||
of "ustar\0". Only look at the first 5 characters of the magic
|
||||
field so we can recognize old GNU tar ustar archives. */
|
||||
if (!strncmp (tar_hdr->magic, TMAGIC, TMAGLEN - 1))
|
||||
return 2;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Return TRUE if the filename is too long to fit in a tar header.
|
||||
For old tar headers, if the filename's length is less than or equal
|
||||
to 100 then it will fit, otherwise it will not. For POSIX tar headers,
|
||||
if the filename's length is less than or equal to 100 then it
|
||||
will definitely fit, and if it is greater than 256 then it
|
||||
will definitely not fit. If the length is between 100 and 256,
|
||||
then the filename will fit only if it is possible to break it
|
||||
into a 155 character "prefix" and 100 character "name". There
|
||||
must be a slash between the "prefix" and the "name", although
|
||||
the slash is not stored or counted in either the "prefix" or
|
||||
the "name", and there must be at least one character in both
|
||||
the "prefix" and the "name". If it is not possible to break down
|
||||
the filename like this then it will not fit. */
|
||||
|
||||
int
|
||||
is_tar_filename_too_long (name)
|
||||
char *name;
|
||||
{
|
||||
int whole_name_len;
|
||||
int prefix_name_len;
|
||||
char *p;
|
||||
|
||||
whole_name_len = strlen (name);
|
||||
if (whole_name_len <= TARNAMESIZE)
|
||||
return FALSE;
|
||||
|
||||
if (archive_format != arf_ustar)
|
||||
return TRUE;
|
||||
|
||||
if (whole_name_len > TARNAMESIZE + TARPREFIXSIZE + 1)
|
||||
return TRUE;
|
||||
|
||||
/* See whether we can split up the name into acceptably-sized
|
||||
`prefix' and `name' (`p') pieces. Start out by making `name'
|
||||
as big as possible, then shrink it by looking for the first '/'. */
|
||||
p = name + whole_name_len - TARNAMESIZE;
|
||||
while (*p != '/' && *p != '\0')
|
||||
++p;
|
||||
if (*p == '\0')
|
||||
/* The last component of the path is longer than TARNAMESIZE. */
|
||||
return TRUE;
|
||||
|
||||
prefix_name_len = p - name - 1;
|
||||
/* Interestingly, a name consisting of a slash followed by
|
||||
TARNAMESIZE characters can't be stored, because the prefix
|
||||
would be empty, and thus ignored. */
|
||||
if (prefix_name_len > TARPREFIXSIZE || prefix_name_len == 0)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@@ -1,112 +0,0 @@
|
||||
/* Extended tar format from POSIX.1.
|
||||
Copyright (C) 1992 Free Software Foundation, Inc.
|
||||
Written by David J. MacKenzie.
|
||||
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifndef _TAR_H
|
||||
|
||||
#define _TAR_H 1
|
||||
|
||||
|
||||
/* A tar archive consists of 512-byte blocks.
|
||||
Each file in the archive has a header block followed by 0+ data blocks.
|
||||
Two blocks of NUL bytes indicate the end of the archive. */
|
||||
|
||||
/* The fields of header blocks:
|
||||
All strings are stored as ISO 646 (approximately ASCII) strings.
|
||||
|
||||
Fields are numeric unless otherwise noted below; numbers are ISO 646
|
||||
representations of octal numbers, with leading zeros as needed.
|
||||
|
||||
linkname is only valid when typeflag==LNKTYPE. It doesn't use prefix;
|
||||
files that are links to pathnames >100 chars long can not be stored
|
||||
in a tar archive.
|
||||
|
||||
If typeflag=={LNKTYPE,SYMTYPE,DIRTYPE} then size must be 0.
|
||||
|
||||
devmajor and devminor are only valid for typeflag=={BLKTYPE,CHRTYPE}.
|
||||
|
||||
chksum contains the sum of all 512 bytes in the header block,
|
||||
treating each byte as an 8-bit unsigned value and treating the
|
||||
8 bytes of chksum as blank characters.
|
||||
|
||||
uname and gname are used in preference to uid and gid, if those
|
||||
names exist locally.
|
||||
|
||||
Field Name Byte Offset Length in Bytes Field Type
|
||||
name 0 100 NUL-terminated if NUL fits
|
||||
mode 100 8
|
||||
uid 108 8
|
||||
gid 116 8
|
||||
size 124 12
|
||||
mtime 136 12
|
||||
chksum 148 8
|
||||
typeflag 156 1 see below
|
||||
linkname 157 100 NUL-terminated if NUL fits
|
||||
magic 257 6 must be TMAGIC (NUL term.)
|
||||
version 263 2 must be TVERSION
|
||||
uname 265 32 NUL-terminated
|
||||
gname 297 32 NUL-terminated
|
||||
devmajor 329 8
|
||||
devminor 337 8
|
||||
prefix 345 155 NUL-terminated if NUL fits
|
||||
|
||||
If the first character of prefix is '\0', the file name is name;
|
||||
otherwise, it is prefix/name. Files whose pathnames don't fit in that
|
||||
length can not be stored in a tar archive. */
|
||||
|
||||
/* The bits in mode: */
|
||||
#define TSUID 04000
|
||||
#define TSGID 02000
|
||||
#define TSVTX 01000
|
||||
#define TUREAD 00400
|
||||
#define TUWRITE 00200
|
||||
#define TUEXEC 00100
|
||||
#define TGREAD 00040
|
||||
#define TGWRITE 00020
|
||||
#define TGEXEC 00010
|
||||
#define TOREAD 00004
|
||||
#define TOWRITE 00002
|
||||
#define TOEXEC 00001
|
||||
|
||||
/* The values for typeflag:
|
||||
Values 'A'-'Z' are reserved for custom implementations.
|
||||
All other values are reserved for future POSIX.1 revisions. */
|
||||
|
||||
#define REGTYPE '0' /* Regular file (preferred code). */
|
||||
#define AREGTYPE '\0' /* Regular file (alternate code). */
|
||||
#define LNKTYPE '1' /* Hard link. */
|
||||
#define SYMTYPE '2' /* Symbolic link (hard if not supported). */
|
||||
#define CHRTYPE '3' /* Character special. */
|
||||
#define BLKTYPE '4' /* Block special. */
|
||||
#define DIRTYPE '5' /* Directory. */
|
||||
#define FIFOTYPE '6' /* Named pipe. */
|
||||
#define CONTTYPE '7' /* Contiguous file */
|
||||
/* (regular file if not supported). */
|
||||
|
||||
/* Contents of magic field and its length. */
|
||||
#define TMAGIC "ustar"
|
||||
#define TMAGLEN 6
|
||||
|
||||
/* Contents of the version field and its length. */
|
||||
#define TVERSION "00"
|
||||
#define TVERSLEN 2
|
||||
|
||||
|
||||
#endif /* tar.h */
|
||||
@@ -1,62 +0,0 @@
|
||||
/* Extended tar header from POSIX.1.
|
||||
Copyright (C) 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifndef _TARHDR_H
|
||||
|
||||
#define _TARHDR_H 1
|
||||
|
||||
#include <tar.h>
|
||||
|
||||
/* Size of `name' field. */
|
||||
#define TARNAMESIZE 100
|
||||
|
||||
/* Size of `linkname' field. */
|
||||
#define TARLINKNAMESIZE 100
|
||||
|
||||
/* Size of `prefix' field. */
|
||||
#define TARPREFIXSIZE 155
|
||||
|
||||
/* Size of entire tar header. */
|
||||
#define TARRECORDSIZE 512
|
||||
|
||||
struct tar_header
|
||||
{
|
||||
char name[TARNAMESIZE];
|
||||
char mode[8];
|
||||
char uid[8];
|
||||
char gid[8];
|
||||
char size[12];
|
||||
char mtime[12];
|
||||
char chksum[8];
|
||||
char typeflag;
|
||||
char linkname[TARLINKNAMESIZE];
|
||||
char magic[6];
|
||||
char version[2];
|
||||
char uname[32];
|
||||
char gname[32];
|
||||
char devmajor[8];
|
||||
char devminor[8];
|
||||
char prefix[TARPREFIXSIZE];
|
||||
};
|
||||
|
||||
union tar_record
|
||||
{
|
||||
struct tar_header header;
|
||||
char buffer[TARRECORDSIZE];
|
||||
};
|
||||
|
||||
#endif /* tarhdr.h */
|
||||
@@ -1,277 +0,0 @@
|
||||
/* userspec.c -- Parse a user and group string.
|
||||
Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
/* Written by David MacKenzie <[email protected]>. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define alloca __builtin_alloca
|
||||
#else
|
||||
#ifdef HAVE_ALLOCA_H
|
||||
#include <alloca.h>
|
||||
#else
|
||||
#ifdef _AIX
|
||||
#pragma alloca
|
||||
#else
|
||||
char *alloca ();
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#ifndef index
|
||||
#define index strchr
|
||||
#endif
|
||||
#else
|
||||
#include <strings.h>
|
||||
#endif
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifndef _POSIX_VERSION
|
||||
struct passwd *getpwnam ();
|
||||
struct group *getgrnam ();
|
||||
struct group *getgrgid ();
|
||||
#endif
|
||||
|
||||
#ifdef _POSIX_SOURCE
|
||||
#define endpwent()
|
||||
#define endgrent()
|
||||
#endif
|
||||
|
||||
/* Perform the equivalent of the statement `dest = strdup (src);',
|
||||
but obtaining storage via alloca instead of from the heap. */
|
||||
|
||||
#define V_STRDUP(dest, src) \
|
||||
do \
|
||||
{ \
|
||||
int _len = strlen ((src)); \
|
||||
(dest) = (char *) alloca (_len + 1); \
|
||||
strcpy (dest, src); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
#define isdigit(c) ((c) >= '0' && (c) <= '9')
|
||||
|
||||
char *strdup ();
|
||||
|
||||
/* Return nonzero if STR represents an unsigned decimal integer,
|
||||
otherwise return 0. */
|
||||
|
||||
static int
|
||||
isnumber (str)
|
||||
const char *str;
|
||||
{
|
||||
for (; *str; str++)
|
||||
if (!isdigit (*str))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Extract from NAME, which has the form "[user][:.][group]",
|
||||
a USERNAME, UID U, GROUPNAME, and GID G.
|
||||
Either user or group, or both, must be present.
|
||||
If the group is omitted but the ":" or "." separator is given,
|
||||
use the given user's login group.
|
||||
|
||||
USERNAME and GROUPNAME will be in newly malloc'd memory.
|
||||
Either one might be NULL instead, indicating that it was not
|
||||
given and the corresponding numeric ID was left unchanged.
|
||||
|
||||
Return NULL if successful, a static error message string if not. */
|
||||
|
||||
const char *
|
||||
parse_user_spec (spec_arg, uid, gid, username_arg, groupname_arg)
|
||||
const char *spec_arg;
|
||||
uid_t *uid;
|
||||
gid_t *gid;
|
||||
char **username_arg, **groupname_arg;
|
||||
{
|
||||
static const char *tired = "virtual memory exhausted";
|
||||
const char *error_msg;
|
||||
char *spec; /* A copy we can write on. */
|
||||
struct passwd *pwd;
|
||||
struct group *grp;
|
||||
char *g, *u, *separator;
|
||||
char *groupname;
|
||||
|
||||
error_msg = NULL;
|
||||
*username_arg = *groupname_arg = NULL;
|
||||
groupname = NULL;
|
||||
|
||||
V_STRDUP (spec, spec_arg);
|
||||
|
||||
/* Find the separator if there is one. */
|
||||
separator = index (spec, ':');
|
||||
if (separator == NULL)
|
||||
separator = index (spec, '.');
|
||||
|
||||
/* Replace separator with a NUL. */
|
||||
if (separator != NULL)
|
||||
*separator = '\0';
|
||||
|
||||
/* Set U and G to non-zero length strings corresponding to user and
|
||||
group specifiers or to NULL. */
|
||||
u = (*spec == '\0' ? NULL : spec);
|
||||
|
||||
g = (separator == NULL || *(separator + 1) == '\0'
|
||||
? NULL
|
||||
: separator + 1);
|
||||
|
||||
if (u == NULL && g == NULL)
|
||||
return "can not omit both user and group";
|
||||
|
||||
if (u != NULL)
|
||||
{
|
||||
pwd = getpwnam (u);
|
||||
if (pwd == NULL)
|
||||
{
|
||||
|
||||
if (!isnumber (u))
|
||||
error_msg = "invalid user";
|
||||
else
|
||||
{
|
||||
int use_login_group;
|
||||
use_login_group = (separator != NULL && g == NULL);
|
||||
if (use_login_group)
|
||||
error_msg = "cannot get the login group of a numeric UID";
|
||||
else
|
||||
*uid = atoi (u);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*uid = pwd->pw_uid;
|
||||
if (g == NULL && separator != NULL)
|
||||
{
|
||||
/* A separator was given, but a group was not specified,
|
||||
so get the login group. */
|
||||
*gid = pwd->pw_gid;
|
||||
grp = getgrgid (pwd->pw_gid);
|
||||
if (grp == NULL)
|
||||
{
|
||||
/* This is enough room to hold the unsigned decimal
|
||||
representation of any 32-bit quantity and the trailing
|
||||
zero byte. */
|
||||
char uint_buf[21];
|
||||
sprintf (uint_buf, "%u", (unsigned) (pwd->pw_gid));
|
||||
V_STRDUP (groupname, uint_buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
V_STRDUP (groupname, grp->gr_name);
|
||||
}
|
||||
endgrent ();
|
||||
}
|
||||
}
|
||||
endpwent ();
|
||||
}
|
||||
|
||||
if (g != NULL && error_msg == NULL)
|
||||
{
|
||||
/* Explicit group. */
|
||||
grp = getgrnam (g);
|
||||
if (grp == NULL)
|
||||
{
|
||||
if (!isnumber (g))
|
||||
error_msg = "invalid group";
|
||||
else
|
||||
*gid = atoi (g);
|
||||
}
|
||||
else
|
||||
*gid = grp->gr_gid;
|
||||
endgrent (); /* Save a file descriptor. */
|
||||
|
||||
if (error_msg == NULL)
|
||||
V_STRDUP (groupname, g);
|
||||
}
|
||||
|
||||
if (error_msg == NULL)
|
||||
{
|
||||
if (u != NULL)
|
||||
{
|
||||
*username_arg = strdup (u);
|
||||
if (*username_arg == NULL)
|
||||
error_msg = tired;
|
||||
}
|
||||
|
||||
if (groupname != NULL && error_msg == NULL)
|
||||
{
|
||||
*groupname_arg = strdup (groupname);
|
||||
if (*groupname_arg == NULL)
|
||||
{
|
||||
if (*username_arg != NULL)
|
||||
{
|
||||
free (*username_arg);
|
||||
*username_arg = NULL;
|
||||
}
|
||||
error_msg = tired;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return error_msg;
|
||||
}
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
#define NULL_CHECK(s) ((s) == NULL ? "(null)" : (s))
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 1; i < argc; i++)
|
||||
{
|
||||
const char *e;
|
||||
char *username, *groupname;
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
char *tmp;
|
||||
|
||||
tmp = strdup (argv[i]);
|
||||
e = parse_user_spec (tmp, &uid, &gid, &username, &groupname);
|
||||
free (tmp);
|
||||
printf ("%s: %u %u %s %s %s\n",
|
||||
argv[i],
|
||||
(unsigned int) uid,
|
||||
(unsigned int) gid,
|
||||
NULL_CHECK (username),
|
||||
NULL_CHECK (groupname),
|
||||
NULL_CHECK (e));
|
||||
}
|
||||
|
||||
exit (0);
|
||||
}
|
||||
|
||||
#endif
|
||||
-1343
File diff suppressed because it is too large.
Load diff
@@ -1,2 +0,0 @@
|
||||
/* The version number of cpio and mt. */
|
||||
char *version_string = "version 2.4.2\n";
|
||||
@@ -1,103 +0,0 @@
|
||||
/* xmalloc.c -- malloc with out of memory checking
|
||||
Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#if __STDC__
|
||||
#define VOID void
|
||||
#else
|
||||
#define VOID char
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#if STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
VOID *malloc ();
|
||||
VOID *realloc ();
|
||||
void free ();
|
||||
#endif
|
||||
|
||||
/* This is for other GNU distributions with internationalized messages.
|
||||
The GNU C Library itself does not yet support such messages. */
|
||||
#if HAVE_LIBINTL_H
|
||||
# include <libintl.h>
|
||||
#else
|
||||
# define gettext(msgid) (msgid)
|
||||
#endif
|
||||
|
||||
#ifndef EXIT_FAILURE
|
||||
#define EXIT_FAILURE 1
|
||||
#endif
|
||||
|
||||
/* Exit value when the requested amount of memory is not available.
|
||||
The caller may set it to some other value. */
|
||||
int xmalloc_exit_failure = EXIT_FAILURE;
|
||||
|
||||
#if __STDC__ && (HAVE_VPRINTF || HAVE_DOPRNT)
|
||||
void error (int, int, const char *, ...);
|
||||
#else
|
||||
void error ();
|
||||
#endif
|
||||
|
||||
static VOID *
|
||||
fixup_null_alloc (n)
|
||||
size_t n;
|
||||
{
|
||||
VOID *p;
|
||||
|
||||
p = 0;
|
||||
if (n == 0)
|
||||
p = malloc ((size_t) 1);
|
||||
if (p == 0)
|
||||
error (xmalloc_exit_failure, 0, gettext ("Memory exhausted"));
|
||||
return p;
|
||||
}
|
||||
|
||||
/* Allocate N bytes of memory dynamically, with error checking. */
|
||||
|
||||
VOID *
|
||||
xmalloc (n)
|
||||
size_t n;
|
||||
{
|
||||
VOID *p;
|
||||
|
||||
p = malloc (n);
|
||||
if (p == 0)
|
||||
p = fixup_null_alloc (n);
|
||||
return p;
|
||||
}
|
||||
|
||||
/* Change the size of an allocated block of memory P to N bytes,
|
||||
with error checking.
|
||||
If P is NULL, run xmalloc. */
|
||||
|
||||
VOID *
|
||||
xrealloc (p, n)
|
||||
VOID *p;
|
||||
size_t n;
|
||||
{
|
||||
if (p == 0)
|
||||
return xmalloc (n);
|
||||
p = realloc (p, n);
|
||||
if (p == 0)
|
||||
p = fixup_null_alloc (n);
|
||||
return p;
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/* xstrdup.c -- copy a string with out of memory checking
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#else
|
||||
#include <strings.h>
|
||||
#endif
|
||||
char *xmalloc ();
|
||||
|
||||
/* Return a newly allocated copy of STRING. */
|
||||
|
||||
char *
|
||||
xstrdup (string)
|
||||
char *string;
|
||||
{
|
||||
return strcpy (xmalloc (strlen (string) + 1), string);
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
This directory is for the EXACT same use as src/contrib, execpt it
|
||||
holds crypto sources. As a consequence of USA law, this makes it export
|
||||
controlled, so it has to be kept separate.
|
||||
|
||||
Please do not export the contents of this direcory and its
|
||||
subdirectories from the USA without the necessary permits.
|
||||
|
||||
Mark Murray
|
||||
3 May, 1997
|
||||
@@ -1,62 +0,0 @@
|
||||
#include "f2c.h"
|
||||
|
||||
#ifndef LONGBITS
|
||||
#define LONGBITS 32
|
||||
#endif
|
||||
|
||||
integer
|
||||
#ifdef KR_headers
|
||||
lbit_bits(a, b, len) integer a, b, len;
|
||||
#else
|
||||
lbit_bits(integer a, integer b, integer len)
|
||||
#endif
|
||||
{
|
||||
/* Assume 2's complement arithmetic */
|
||||
|
||||
unsigned long x, y;
|
||||
|
||||
x = (unsigned long) a;
|
||||
y = (unsigned long)-1L;
|
||||
x >>= b;
|
||||
y <<= len;
|
||||
return (integer)(x & ~y);
|
||||
}
|
||||
|
||||
integer
|
||||
#ifdef KR_headers
|
||||
lbit_cshift(a, b, len) integer a, b, len;
|
||||
#else
|
||||
lbit_cshift(integer a, integer b, integer len)
|
||||
#endif
|
||||
{
|
||||
unsigned long x, y, z;
|
||||
|
||||
x = (unsigned long)a;
|
||||
if (len <= 0) {
|
||||
if (len == 0)
|
||||
return 0;
|
||||
goto full_len;
|
||||
}
|
||||
if (len >= LONGBITS) {
|
||||
full_len:
|
||||
if (b >= 0) {
|
||||
b %= LONGBITS;
|
||||
return (integer)(x << b | x >> LONGBITS -b );
|
||||
}
|
||||
b = -b;
|
||||
b %= LONGBITS;
|
||||
return (integer)(x << LONGBITS - b | x >> b);
|
||||
}
|
||||
y = z = (unsigned long)-1;
|
||||
y <<= len;
|
||||
z &= ~y;
|
||||
y &= x;
|
||||
x &= z;
|
||||
if (b >= 0) {
|
||||
b %= len;
|
||||
return (integer)(y | z & (x << b | x >> len - b));
|
||||
}
|
||||
b = -b;
|
||||
b %= len;
|
||||
return (integer)(y | z & (x >> b | x << len - b));
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
#include "f2c.h"
|
||||
|
||||
integer
|
||||
#ifdef KR_headers
|
||||
lbit_shift(a, b) integer a; integer b;
|
||||
#else
|
||||
lbit_shift(integer a, integer b)
|
||||
#endif
|
||||
{
|
||||
return b >= 0 ? a << b : (integer)((uinteger)a >> -b);
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
/* You may need to adjust the definition of signal1 to supply a */
|
||||
/* cast to the correct argument type. This detail is system- and */
|
||||
/* compiler-dependent. The #define below assumes signal.h declares */
|
||||
/* type SIG_PF for the signal function's second argument. */
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
#ifndef Sigret_t
|
||||
#define Sigret_t void
|
||||
#endif
|
||||
#ifndef Sigarg_t
|
||||
#ifdef KR_headers
|
||||
#define Sigarg_t
|
||||
#else
|
||||
#define Sigarg_t int
|
||||
#endif
|
||||
#endif /*Sigarg_t*/
|
||||
|
||||
#ifdef USE_SIG_PF /* compile with -DUSE_SIG_PF under IRIX */
|
||||
#define sig_pf SIG_PF
|
||||
#else
|
||||
typedef Sigret_t (*sig_pf)(Sigarg_t);
|
||||
#endif
|
||||
|
||||
#define signal1(a,b) signal(a,(sig_pf)b)
|
||||
@@ -1,25 +0,0 @@
|
||||
# $Id$
|
||||
#
|
||||
# This file contains make rules that are shared by libc and libc_r.
|
||||
#
|
||||
.include "${.CURDIR}/../libc/db/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/compat-43/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/gen/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/gmon/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/locale/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/net/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/nls/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/quad/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/regex/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/stdio/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/stdlib/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/stdtime/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/string/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/sys/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/rpc/Makefile.inc"
|
||||
.include "${.CURDIR}/../libc/xdr/Makefile.inc"
|
||||
.if !defined(NO_YP_LIBC)
|
||||
CFLAGS+= -DYP
|
||||
.include "${.CURDIR}/../libc/yp/Makefile.inc"
|
||||
.endif
|
||||
.include "${.CURDIR}/../libc/${MACHINE}/sys/Makefile.inc"
|
||||
@@ -1,2 +0,0 @@
|
||||
#define MEMCOPY
|
||||
#include "bcopy.S"
|
||||
@@ -1,321 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 1995 by International Business Machines, Inc.
|
||||
*
|
||||
* International Business Machines, Inc. (hereinafter called IBM) grants
|
||||
* permission under its copyrights to use, copy, modify, and distribute this
|
||||
* Software with or without fee, provided that the above copyright notice and
|
||||
* all paragraphs of this notice appear in all copies, and that the name of IBM
|
||||
* not be used in connection with the marketing of any product incorporating
|
||||
* the Software or modifications thereof, without specific, written prior
|
||||
* permission.
|
||||
*
|
||||
* To the extent it has a right to do so, IBM grants an immunity from suit
|
||||
* under its patents, if any, for the use, sale or manufacture of products to
|
||||
* the extent that such products are used for performing Domain Name System
|
||||
* dynamic updates in TCP/IP networks by means of the Software. No immunity is
|
||||
* granted for any product per se or for any other function of any product.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
* PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
|
||||
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
|
||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
|
||||
* IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <arpa/nameser.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <resolv.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#if defined(BSD) && (BSD >= 199103) && defined(AF_INET6)
|
||||
# include <stdlib.h>
|
||||
# include <string.h>
|
||||
#else
|
||||
# include "../conf/portability.h"
|
||||
#endif
|
||||
|
||||
#define Assert(Cond) if (!(Cond)) abort()
|
||||
|
||||
static const char Base64[] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
static const char Pad64 = '=';
|
||||
|
||||
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
|
||||
The following encoding technique is taken from RFC 1521 by Borenstein
|
||||
and Freed. It is reproduced here in a slightly edited form for
|
||||
convenience.
|
||||
|
||||
A 65-character subset of US-ASCII is used, enabling 6 bits to be
|
||||
represented per printable character. (The extra 65th character, "=",
|
||||
is used to signify a special processing function.)
|
||||
|
||||
The encoding process represents 24-bit groups of input bits as output
|
||||
strings of 4 encoded characters. Proceeding from left to right, a
|
||||
24-bit input group is formed by concatenating 3 8-bit input groups.
|
||||
These 24 bits are then treated as 4 concatenated 6-bit groups, each
|
||||
of which is translated into a single digit in the base64 alphabet.
|
||||
|
||||
Each 6-bit group is used as an index into an array of 64 printable
|
||||
characters. The character referenced by the index is placed in the
|
||||
output string.
|
||||
|
||||
Table 1: The Base64 Alphabet
|
||||
|
||||
Value Encoding Value Encoding Value Encoding Value Encoding
|
||||
0 A 17 R 34 i 51 z
|
||||
1 B 18 S 35 j 52 0
|
||||
2 C 19 T 36 k 53 1
|
||||
3 D 20 U 37 l 54 2
|
||||
4 E 21 V 38 m 55 3
|
||||
5 F 22 W 39 n 56 4
|
||||
6 G 23 X 40 o 57 5
|
||||
7 H 24 Y 41 p 58 6
|
||||
8 I 25 Z 42 q 59 7
|
||||
9 J 26 a 43 r 60 8
|
||||
10 K 27 b 44 s 61 9
|
||||
11 L 28 c 45 t 62 +
|
||||
12 M 29 d 46 u 63 /
|
||||
13 N 30 e 47 v
|
||||
14 O 31 f 48 w (pad) =
|
||||
15 P 32 g 49 x
|
||||
16 Q 33 h 50 y
|
||||
|
||||
Special processing is performed if fewer than 24 bits are available
|
||||
at the end of the data being encoded. A full encoding quantum is
|
||||
always completed at the end of a quantity. When fewer than 24 input
|
||||
bits are available in an input group, zero bits are added (on the
|
||||
right) to form an integral number of 6-bit groups. Padding at the
|
||||
end of the data is performed using the '=' character.
|
||||
|
||||
Since all base64 input is an integral number of octets, only the
|
||||
-------------------------------------------------
|
||||
following cases can arise:
|
||||
|
||||
(1) the final quantum of encoding input is an integral
|
||||
multiple of 24 bits; here, the final unit of encoded
|
||||
output will be an integral multiple of 4 characters
|
||||
with no "=" padding,
|
||||
(2) the final quantum of encoding input is exactly 8 bits;
|
||||
here, the final unit of encoded output will be two
|
||||
characters followed by two "=" padding characters, or
|
||||
(3) the final quantum of encoding input is exactly 16 bits;
|
||||
here, the final unit of encoded output will be three
|
||||
characters followed by one "=" padding character.
|
||||
*/
|
||||
|
||||
int
|
||||
b64_ntop(src, srclength, target, targsize)
|
||||
u_char const *src;
|
||||
size_t srclength;
|
||||
char *target;
|
||||
size_t targsize;
|
||||
{
|
||||
size_t datalength = 0;
|
||||
u_char input[3];
|
||||
u_char output[4];
|
||||
int i;
|
||||
|
||||
while (2 < srclength) {
|
||||
input[0] = *src++;
|
||||
input[1] = *src++;
|
||||
input[2] = *src++;
|
||||
srclength -= 3;
|
||||
|
||||
output[0] = input[0] >> 2;
|
||||
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
|
||||
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
|
||||
output[3] = input[2] & 0x3f;
|
||||
Assert(output[0] < 64);
|
||||
Assert(output[1] < 64);
|
||||
Assert(output[2] < 64);
|
||||
Assert(output[3] < 64);
|
||||
|
||||
if (datalength + 4 > targsize)
|
||||
return (-1);
|
||||
target[datalength++] = Base64[output[0]];
|
||||
target[datalength++] = Base64[output[1]];
|
||||
target[datalength++] = Base64[output[2]];
|
||||
target[datalength++] = Base64[output[3]];
|
||||
}
|
||||
|
||||
/* Now we worry about padding. */
|
||||
if (0 != srclength) {
|
||||
/* Get what's left. */
|
||||
input[0] = input[1] = input[2] = '\0';
|
||||
for (i = 0; i < srclength; i++)
|
||||
input[i] = *src++;
|
||||
|
||||
output[0] = input[0] >> 2;
|
||||
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
|
||||
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
|
||||
Assert(output[0] < 64);
|
||||
Assert(output[1] < 64);
|
||||
Assert(output[2] < 64);
|
||||
|
||||
if (datalength + 4 > targsize)
|
||||
return (-1);
|
||||
target[datalength++] = Base64[output[0]];
|
||||
target[datalength++] = Base64[output[1]];
|
||||
if (srclength == 1)
|
||||
target[datalength++] = Pad64;
|
||||
else
|
||||
target[datalength++] = Base64[output[2]];
|
||||
target[datalength++] = Pad64;
|
||||
}
|
||||
if (datalength >= targsize)
|
||||
return (-1);
|
||||
target[datalength] = '\0'; /* Returned value doesn't count \0. */
|
||||
return (datalength);
|
||||
}
|
||||
|
||||
/* skips all whitespace anywhere.
|
||||
converts characters, four at a time, starting at (or after)
|
||||
src from base - 64 numbers into three 8 bit bytes in the target area.
|
||||
it returns the number of data bytes stored at the target, or -1 on error.
|
||||
*/
|
||||
|
||||
int
|
||||
b64_pton(src, target, targsize)
|
||||
char const *src;
|
||||
u_char *target;
|
||||
size_t targsize;
|
||||
{
|
||||
int tarindex, state, ch;
|
||||
char *pos;
|
||||
|
||||
state = 0;
|
||||
tarindex = 0;
|
||||
|
||||
while ((ch = *src++) != '\0') {
|
||||
if (isspace(ch)) /* Skip whitespace anywhere. */
|
||||
continue;
|
||||
|
||||
if (ch == Pad64)
|
||||
break;
|
||||
|
||||
pos = strchr(Base64, ch);
|
||||
if (pos == 0) /* A non-base64 character. */
|
||||
return (-1);
|
||||
|
||||
switch (state) {
|
||||
case 0:
|
||||
if (target) {
|
||||
if (tarindex >= targsize)
|
||||
return (-1);
|
||||
target[tarindex] = (pos - Base64) << 2;
|
||||
}
|
||||
state = 1;
|
||||
break;
|
||||
case 1:
|
||||
if (target) {
|
||||
if (tarindex + 1 >= targsize)
|
||||
return (-1);
|
||||
target[tarindex] |= (pos - Base64) >> 4;
|
||||
target[tarindex+1] = ((pos - Base64) & 0x0f)
|
||||
<< 4 ;
|
||||
}
|
||||
tarindex++;
|
||||
state = 2;
|
||||
break;
|
||||
case 2:
|
||||
if (target) {
|
||||
if (tarindex + 1 >= targsize)
|
||||
return (-1);
|
||||
target[tarindex] |= (pos - Base64) >> 2;
|
||||
target[tarindex+1] = ((pos - Base64) & 0x03)
|
||||
<< 6;
|
||||
}
|
||||
tarindex++;
|
||||
state = 3;
|
||||
break;
|
||||
case 3:
|
||||
if (target) {
|
||||
if (tarindex >= targsize)
|
||||
return (-1);
|
||||
target[tarindex] |= (pos - Base64);
|
||||
}
|
||||
tarindex++;
|
||||
state = 0;
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* We are done decoding Base-64 chars. Let's see if we ended
|
||||
* on a byte boundary, and/or with erroneous trailing characters.
|
||||
*/
|
||||
|
||||
if (ch == Pad64) { /* We got a pad char. */
|
||||
ch = *src++; /* Skip it, get next. */
|
||||
switch (state) {
|
||||
case 0: /* Invalid = in first position */
|
||||
case 1: /* Invalid = in second position */
|
||||
return (-1);
|
||||
|
||||
case 2: /* Valid, means one byte of info */
|
||||
/* Skip any number of spaces. */
|
||||
for (NULL; ch != '\0'; ch = *src++)
|
||||
if (!isspace(ch))
|
||||
break;
|
||||
/* Make sure there is another trailing = sign. */
|
||||
if (ch != Pad64)
|
||||
return (-1);
|
||||
ch = *src++; /* Skip the = */
|
||||
/* Fall through to "single trailing =" case. */
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case 3: /* Valid, means two bytes of info */
|
||||
/*
|
||||
* We know this char is an =. Is there anything but
|
||||
* whitespace after it?
|
||||
*/
|
||||
for (NULL; ch != '\0'; ch = *src++)
|
||||
if (!isspace(ch))
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Now make sure for cases 2 and 3 that the "extra"
|
||||
* bits that slopped past the last full byte were
|
||||
* zeros. If we don't check them, they become a
|
||||
* subliminal channel.
|
||||
*/
|
||||
if (target && target[tarindex] != 0)
|
||||
return (-1);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* We ended by seeing the end of the string. Make sure we
|
||||
* have no partial bytes lying around.
|
||||
*/
|
||||
if (state != 0)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (tarindex);
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char orig_rcsid[] = "From Id: inet_net_ntop.c,v 8.2 1996/08/08 06:54:44 vixie Exp";
|
||||
static const char rcsid[] = "$Id$";
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef SPRINTF_CHAR
|
||||
# define SPRINTF(x) strlen(sprintf/**/x)
|
||||
#else
|
||||
# define SPRINTF(x) ((size_t)sprintf x)
|
||||
#endif
|
||||
|
||||
static char * inet_net_ntop_ipv4 __P((const u_char *src, int bits,
|
||||
char *dst, size_t size));
|
||||
|
||||
/*
|
||||
* char *
|
||||
* inet_net_ntop(af, src, bits, dst, size)
|
||||
* convert network number from network to presentation format.
|
||||
* generates CIDR style result always.
|
||||
* return:
|
||||
* pointer to dst, or NULL if an error occurred (check errno).
|
||||
* author:
|
||||
* Paul Vixie (ISC), July 1996
|
||||
*/
|
||||
char *
|
||||
inet_net_ntop(af, src, bits, dst, size)
|
||||
int af;
|
||||
const void *src;
|
||||
int bits;
|
||||
char *dst;
|
||||
size_t size;
|
||||
{
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
return (inet_net_ntop_ipv4(src, bits, dst, size));
|
||||
default:
|
||||
errno = EAFNOSUPPORT;
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* static char *
|
||||
* inet_net_ntop_ipv4(src, bits, dst, size)
|
||||
* convert IPv4 network number from network to presentation format.
|
||||
* generates CIDR style result always.
|
||||
* return:
|
||||
* pointer to dst, or NULL if an error occurred (check errno).
|
||||
* note:
|
||||
* network byte order assumed. this means 192.5.5.240/28 has
|
||||
* 0x11110000 in its fourth octet.
|
||||
* author:
|
||||
* Paul Vixie (ISC), July 1996
|
||||
*/
|
||||
static char *
|
||||
inet_net_ntop_ipv4(src, bits, dst, size)
|
||||
const u_char *src;
|
||||
int bits;
|
||||
char *dst;
|
||||
size_t size;
|
||||
{
|
||||
char *odst = dst;
|
||||
char *t;
|
||||
u_int m;
|
||||
int b;
|
||||
|
||||
if (bits < 0 || bits > 32) {
|
||||
errno = EINVAL;
|
||||
return (NULL);
|
||||
}
|
||||
if (bits == 0) {
|
||||
if (size < sizeof "0")
|
||||
goto emsgsize;
|
||||
*dst++ = '0';
|
||||
*dst = '\0';
|
||||
}
|
||||
|
||||
/* Format whole octets. */
|
||||
for (b = bits / 8; b > 0; b--) {
|
||||
if (size < sizeof "255.")
|
||||
goto emsgsize;
|
||||
t = dst;
|
||||
dst += SPRINTF((dst, "%u", *src++));
|
||||
if (b > 1) {
|
||||
*dst++ = '.';
|
||||
*dst = '\0';
|
||||
}
|
||||
size -= (size_t)(dst - t);
|
||||
}
|
||||
|
||||
/* Format partial octet. */
|
||||
b = bits % 8;
|
||||
if (b > 0) {
|
||||
if (size < sizeof ".255")
|
||||
goto emsgsize;
|
||||
t = dst;
|
||||
if (dst != odst)
|
||||
*dst++ = '.';
|
||||
m = ((1 << b) - 1) << (8 - b);
|
||||
dst += SPRINTF((dst, "%u", *src & m));
|
||||
size -= (size_t)(dst - t);
|
||||
}
|
||||
|
||||
/* Format CIDR /width. */
|
||||
if (size < sizeof "/32")
|
||||
goto emsgsize;
|
||||
dst += SPRINTF((dst, "/%u", bits));
|
||||
return (odst);
|
||||
|
||||
emsgsize:
|
||||
errno = EMSGSIZE;
|
||||
return (NULL);
|
||||
}
|
||||
@@ -1,208 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char orig_rcsid[] = "From Id: inet_net_pton.c,v 8.3 1996/11/11 06:36:52 vixie Exp";
|
||||
static const char rcsid[] = "$Id$";
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef SPRINTF_CHAR
|
||||
# define SPRINTF(x) strlen(sprintf/**/x)
|
||||
#else
|
||||
# define SPRINTF(x) ((size_t)sprintf x)
|
||||
#endif
|
||||
|
||||
static int inet_net_pton_ipv4 __P((const char *src, u_char *dst,
|
||||
size_t size));
|
||||
|
||||
/*
|
||||
* static int
|
||||
* inet_net_pton(af, src, dst, size)
|
||||
* convert network number from presentation to network format.
|
||||
* accepts hex octets, hex strings, decimal octets, and /CIDR.
|
||||
* "size" is in bytes and describes "dst".
|
||||
* return:
|
||||
* number of bits, either imputed classfully or specified with /CIDR,
|
||||
* or -1 if some failure occurred (check errno). ENOENT means it was
|
||||
* not a valid network specification.
|
||||
* author:
|
||||
* Paul Vixie (ISC), June 1996
|
||||
*/
|
||||
int
|
||||
inet_net_pton(af, src, dst, size)
|
||||
int af;
|
||||
const char *src;
|
||||
void *dst;
|
||||
size_t size;
|
||||
{
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
return (inet_net_pton_ipv4(src, dst, size));
|
||||
default:
|
||||
errno = EAFNOSUPPORT;
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* static int
|
||||
* inet_net_pton_ipv4(src, dst, size)
|
||||
* convert IPv4 network number from presentation to network format.
|
||||
* accepts hex octets, hex strings, decimal octets, and /CIDR.
|
||||
* "size" is in bytes and describes "dst".
|
||||
* return:
|
||||
* number of bits, either imputed classfully or specified with /CIDR,
|
||||
* or -1 if some failure occurred (check errno). ENOENT means it was
|
||||
* not an IPv4 network specification.
|
||||
* note:
|
||||
* network byte order assumed. this means 192.5.5.240/28 has
|
||||
* 0x11110000 in its fourth octet.
|
||||
* author:
|
||||
* Paul Vixie (ISC), June 1996
|
||||
*/
|
||||
static int
|
||||
inet_net_pton_ipv4(src, dst, size)
|
||||
const char *src;
|
||||
u_char *dst;
|
||||
size_t size;
|
||||
{
|
||||
static const char
|
||||
xdigits[] = "0123456789abcdef",
|
||||
digits[] = "0123456789";
|
||||
int n, ch, tmp, dirty, bits;
|
||||
const u_char *odst = dst;
|
||||
|
||||
ch = *src++;
|
||||
if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
|
||||
&& isascii(src[1]) && isxdigit(src[1])) {
|
||||
/* Hexadecimal: Eat nybble string. */
|
||||
if (size <= 0)
|
||||
goto emsgsize;
|
||||
*dst = 0, dirty = 0;
|
||||
src++; /* skip x or X. */
|
||||
while ((ch = *src++) != '\0' &&
|
||||
isascii(ch) && isxdigit(ch)) {
|
||||
if (isupper(ch))
|
||||
ch = tolower(ch);
|
||||
n = strchr(xdigits, ch) - xdigits;
|
||||
assert(n >= 0 && n <= 15);
|
||||
*dst |= n;
|
||||
if (!dirty++)
|
||||
*dst <<= 4;
|
||||
else if (size-- > 0)
|
||||
*++dst = 0, dirty = 0;
|
||||
else
|
||||
goto emsgsize;
|
||||
}
|
||||
if (dirty)
|
||||
size--;
|
||||
} else if (isascii(ch) && isdigit(ch)) {
|
||||
/* Decimal: eat dotted digit string. */
|
||||
for (;;) {
|
||||
tmp = 0;
|
||||
do {
|
||||
n = strchr(digits, ch) - digits;
|
||||
assert(n >= 0 && n <= 9);
|
||||
tmp *= 10;
|
||||
tmp += n;
|
||||
if (tmp > 255)
|
||||
goto enoent;
|
||||
} while ((ch = *src++) != '\0' &&
|
||||
isascii(ch) && isdigit(ch));
|
||||
if (size-- <= 0)
|
||||
goto emsgsize;
|
||||
*dst++ = (u_char) tmp;
|
||||
if (ch == '\0' || ch == '/')
|
||||
break;
|
||||
if (ch != '.')
|
||||
goto enoent;
|
||||
ch = *src++;
|
||||
if (!isascii(ch) || !isdigit(ch))
|
||||
goto enoent;
|
||||
}
|
||||
} else
|
||||
goto enoent;
|
||||
|
||||
bits = -1;
|
||||
if (ch == '/' && isascii(src[0]) && isdigit(src[0]) && dst > odst) {
|
||||
/* CIDR width specifier. Nothing can follow it. */
|
||||
ch = *src++; /* Skip over the /. */
|
||||
bits = 0;
|
||||
do {
|
||||
n = strchr(digits, ch) - digits;
|
||||
assert(n >= 0 && n <= 9);
|
||||
bits *= 10;
|
||||
bits += n;
|
||||
} while ((ch = *src++) != '\0' &&
|
||||
isascii(ch) && isdigit(ch));
|
||||
if (ch != '\0')
|
||||
goto enoent;
|
||||
if (bits > 32)
|
||||
goto emsgsize;
|
||||
}
|
||||
|
||||
/* Firey death and destruction unless we prefetched EOS. */
|
||||
if (ch != '\0')
|
||||
goto enoent;
|
||||
|
||||
/* If nothing was written to the destination, we found no address. */
|
||||
if (dst == odst)
|
||||
goto enoent;
|
||||
/* If no CIDR spec was given, infer width from net class. */
|
||||
if (bits == -1) {
|
||||
if (*odst >= 240) /* Class E */
|
||||
bits = 32;
|
||||
else if (*odst >= 224) /* Class D */
|
||||
bits = 4;
|
||||
else if (*odst >= 192) /* Class C */
|
||||
bits = 24;
|
||||
else if (*odst >= 128) /* Class B */
|
||||
bits = 16;
|
||||
else /* Class A */
|
||||
bits = 8;
|
||||
/* If imputed mask is narrower than specified octets, widen. */
|
||||
if (bits >= 8 && bits < ((dst - odst) * 8))
|
||||
bits = (dst - odst) * 8;
|
||||
}
|
||||
/* Extend network to cover the actual mask. */
|
||||
while (bits > ((dst - odst) * 8)) {
|
||||
if (size-- <= 0)
|
||||
goto emsgsize;
|
||||
*dst++ = '\0';
|
||||
}
|
||||
return (bits);
|
||||
|
||||
enoent:
|
||||
errno = ENOENT;
|
||||
return (-1);
|
||||
|
||||
emsgsize:
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
@@ -1,83 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char orig_rcsid[] = "From Id: inet_neta.c,v 8.2 1996/08/08 06:54:44 vixie Exp";
|
||||
static const char rcsid[] = "$Id$";
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef SPRINTF_CHAR
|
||||
# define SPRINTF(x) strlen(sprintf/**/x)
|
||||
#else
|
||||
# define SPRINTF(x) ((size_t)sprintf x)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* char *
|
||||
* inet_neta(src, dst, size)
|
||||
* format a u_long network number into presentation format.
|
||||
* return:
|
||||
* pointer to dst, or NULL if an error occurred (check errno).
|
||||
* note:
|
||||
* format of ``src'' is as for inet_network().
|
||||
* author:
|
||||
* Paul Vixie (ISC), July 1996
|
||||
*/
|
||||
char *
|
||||
inet_neta(src, dst, size)
|
||||
u_long src;
|
||||
char *dst;
|
||||
size_t size;
|
||||
{
|
||||
char *odst = dst;
|
||||
char *tp;
|
||||
|
||||
while (src & 0xffffffff) {
|
||||
u_char b = (src & 0xff000000) >> 24;
|
||||
|
||||
src <<= 8;
|
||||
if (b) {
|
||||
if (size < sizeof "255.")
|
||||
goto emsgsize;
|
||||
tp = dst;
|
||||
dst += SPRINTF((dst, "%u", b));
|
||||
if (src != 0L) {
|
||||
*dst++ = '.';
|
||||
*dst = '\0';
|
||||
}
|
||||
size -= (size_t)(dst - tp);
|
||||
}
|
||||
}
|
||||
if (dst == odst) {
|
||||
if (size < sizeof "0.0.0.0")
|
||||
goto emsgsize;
|
||||
strcpy(dst, "0.0.0.0");
|
||||
}
|
||||
return (odst);
|
||||
|
||||
emsgsize:
|
||||
errno = EMSGSIZE;
|
||||
return (NULL);
|
||||
}
|
||||
@@ -1,94 +0,0 @@
|
||||
.\" $OpenBSD: issetugid.2,v 1.7 1997/02/18 00:16:09 deraadt Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1980, 1991, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by the University of
|
||||
.\" California, Berkeley and its contributors.
|
||||
.\" 4. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $Id: issetugid.2,v 1.3 1997/04/01 18:45:57 mpp Exp $
|
||||
.\"
|
||||
.Dd August, 25 1996
|
||||
.Dt ISSETUGID 2
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm issetugid
|
||||
.Nd is current process tainted by uid or gid changes
|
||||
.Sh SYNOPSIS
|
||||
.Fd #include <unistd.h>
|
||||
.Ft int
|
||||
.Fn issetugid void
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fn issetugid
|
||||
function returns 1 if the process environment or memory address space
|
||||
is considered ``tainted'', and returns 0 otherwise.
|
||||
.Pp
|
||||
A process is tainted if it was created as a result of an
|
||||
.Xr execve 2
|
||||
system call which had either of the setuid or setgid bits set (and extra
|
||||
privileges were given as a result) or if it has changed any of it's real,
|
||||
effective or saved user or group ID's since it began execution.
|
||||
.Pp
|
||||
This system call exists so that library routines (eg: libc, libtermcap)
|
||||
can reliably determine if it is safe to use information
|
||||
that was obtained from the user, in particular the results from
|
||||
.Xr getenv 3
|
||||
should be viewed with suspicion if it is used to control operation.
|
||||
.Pp
|
||||
A ``tainted'' status is inherited by child processes as a result of the
|
||||
.Xr fork 2
|
||||
system call (or other library code that calls fork, such as
|
||||
.Xr popen 3 ) .
|
||||
.Pp
|
||||
It is assumed that a program that clears all privileges as it prepares
|
||||
to execute another will also reset the environment, hence the ``tainted''
|
||||
status will not be passed on. This is important for programs such as
|
||||
.Xr su 1
|
||||
which begin setuid but need to be able to create an untainted process.
|
||||
.Sh ERRORS
|
||||
The
|
||||
.Fn issetugid
|
||||
function is always successful, and no return value is reserved to
|
||||
indicate an error.
|
||||
.Sh SEE ALSO
|
||||
.Xr execve 2 ,
|
||||
.Xr fork 2 ,
|
||||
.Xr setgid 2 ,
|
||||
.Xr setegid 2 ,
|
||||
.Xr seteuid 2 ,
|
||||
.Xr setregid 2 ,
|
||||
.Xr setreuid 2 ,
|
||||
.Xr setuid 2
|
||||
.Sh HISTORY
|
||||
A
|
||||
.Fn issetugid
|
||||
function call first appeared in
|
||||
.Ox 2.0
|
||||
and was also implemented in
|
||||
.Fx 3.0 .
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997 John Birrell <[email protected]>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <errno.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Check for invalid arguments: */
|
||||
if (attr == NULL || *attr == NULL || detachstate == NULL)
|
||||
ret = EINVAL;
|
||||
else {
|
||||
/* Check if the detached flag is set: */
|
||||
if ((*attr)->flags & PTHREAD_DETACHED)
|
||||
/* Return detached: */
|
||||
*detachstate = PTHREAD_CREATE_DETACHED;
|
||||
else
|
||||
/* Return joinable: */
|
||||
*detachstate = PTHREAD_CREATE_JOINABLE;
|
||||
ret = 0;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
#endif
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997 John Birrell <[email protected]>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <errno.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stackaddr)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Check for invalid arguments: */
|
||||
if (attr == NULL || *attr == NULL || stackaddr == NULL)
|
||||
ret = EINVAL;
|
||||
else {
|
||||
/* Return the stack address: */
|
||||
*stackaddr = (*attr)->stackaddr_attr;
|
||||
ret = 0;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
#endif
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997 John Birrell <[email protected]>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <errno.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Check for invalid arguments: */
|
||||
if (attr == NULL || *attr == NULL || stacksize == NULL)
|
||||
ret = EINVAL;
|
||||
else {
|
||||
/* Return the stack size: */
|
||||
*stacksize = (*attr)->stacksize_attr;
|
||||
ret = 0;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
#endif
|
||||
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997 John Birrell <[email protected]>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <errno.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Check for invalid arguments: */
|
||||
if (attr == NULL || *attr == NULL ||
|
||||
(detachstate != PTHREAD_CREATE_DETACHED &&
|
||||
detachstate != PTHREAD_CREATE_JOINABLE))
|
||||
ret = EINVAL;
|
||||
else {
|
||||
/* Check if detached state: */
|
||||
if (detachstate == PTHREAD_CREATE_DETACHED)
|
||||
/* Set the detached flag: */
|
||||
(*attr)->flags |= PTHREAD_DETACHED;
|
||||
else
|
||||
/* Reset the detached flag: */
|
||||
(*attr)->flags &= ~PTHREAD_DETACHED;
|
||||
ret = 0;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
#endif
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997 John Birrell <[email protected]>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <errno.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Check for invalid arguments: */
|
||||
if (attr == NULL || *attr == NULL || stackaddr == NULL)
|
||||
ret = EINVAL;
|
||||
else {
|
||||
/* Save the stack address: */
|
||||
(*attr)->stackaddr_attr = stackaddr;
|
||||
ret = 0;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
#endif
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997 John Birrell <[email protected]>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int pthread_condattr_destroy(pthread_condattr_t *attr)
|
||||
{
|
||||
int ret;
|
||||
if (attr == NULL || *attr == NULL) {
|
||||
errno = EINVAL;
|
||||
ret = -1;
|
||||
} else {
|
||||
free(*attr);
|
||||
*attr = NULL;
|
||||
ret = 0;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
#endif
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997 John Birrell <[email protected]>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int
|
||||
pthread_condattr_init(pthread_condattr_t *attr)
|
||||
{
|
||||
int ret;
|
||||
pthread_condattr_t pattr;
|
||||
|
||||
if ((pattr = (pthread_condattr_t)
|
||||
malloc(sizeof(struct pthread_cond_attr))) == NULL) {
|
||||
errno = ENOMEM;
|
||||
ret = -1;
|
||||
} else {
|
||||
memcpy(pattr, &pthread_condattr_default,
|
||||
sizeof(struct pthread_cond_attr));
|
||||
*attr = pattr;
|
||||
ret = 0;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
#endif
|
||||
@@ -1,78 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997 John Birrell <[email protected]>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int
|
||||
pthread_kill(pthread_t pthread, int sig)
|
||||
{
|
||||
int rval = 0;
|
||||
int status;
|
||||
pthread_t p_pthread;
|
||||
|
||||
/* Check for invalid signal numbers: */
|
||||
if (sig < 0 || sig >= NSIG)
|
||||
/* Invalid signal: */
|
||||
rval = EINVAL;
|
||||
else {
|
||||
/* Assume that the search will succeed: */
|
||||
rval = 0;
|
||||
|
||||
/* Block signals: */
|
||||
_thread_kern_sig_block(&status);
|
||||
|
||||
/* Search for the thread: */
|
||||
p_pthread = _thread_link_list;
|
||||
while (p_pthread != NULL && p_pthread != pthread) {
|
||||
p_pthread = p_pthread->nxt;
|
||||
}
|
||||
|
||||
/* Check if the thread was not found: */
|
||||
if (p_pthread == NULL)
|
||||
/* Can't find the thread: */
|
||||
rval = ESRCH;
|
||||
else
|
||||
/* Increment the pending signal count: */
|
||||
p_pthread->sigpend[sig] += 1;
|
||||
|
||||
/* Unblock signals: */
|
||||
_thread_kern_sig_unblock(status);
|
||||
}
|
||||
|
||||
/* Return the completion status: */
|
||||
return (rval);
|
||||
}
|
||||
#endif
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996 Jeffrey Hsu <[email protected]>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int
|
||||
pthread_mutexattr_init(pthread_mutexattr_t *attr)
|
||||
{
|
||||
int ret;
|
||||
pthread_mutexattr_t pattr;
|
||||
|
||||
if ((pattr = (pthread_mutexattr_t)
|
||||
malloc(sizeof(struct pthread_mutex_attr))) == NULL) {
|
||||
errno = ENOMEM;
|
||||
ret = -1;
|
||||
} else {
|
||||
memcpy(pattr, &pthread_mutexattr_default,
|
||||
sizeof(struct pthread_mutex_attr));
|
||||
*attr = pattr;
|
||||
ret = 0;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
#endif
|
||||
@@ -1,64 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996 Jeffrey Hsu <[email protected]>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <errno.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int
|
||||
pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind)
|
||||
{
|
||||
int ret;
|
||||
if (attr == NULL || *attr == NULL) {
|
||||
errno = EINVAL;
|
||||
ret = -1;
|
||||
} else {
|
||||
(*attr)->m_type = kind;
|
||||
ret = 0;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
int
|
||||
pthread_mutexattr_getkind_np(pthread_mutexattr_t attr)
|
||||
{
|
||||
int ret;
|
||||
if (attr == NULL) {
|
||||
errno = EINVAL;
|
||||
ret = -1;
|
||||
} else {
|
||||
ret = attr->m_type;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
#endif
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997 John Birrell <[email protected]>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr)
|
||||
{
|
||||
int ret;
|
||||
if (attr == NULL || *attr == NULL) {
|
||||
errno = EINVAL;
|
||||
ret = -1;
|
||||
} else {
|
||||
free(*attr);
|
||||
*attr = NULL;
|
||||
ret = 0;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
#endif
|
||||
@@ -1,92 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997 John Birrell <[email protected]>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int
|
||||
pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
|
||||
{
|
||||
int ret = 0;
|
||||
int status;
|
||||
|
||||
/* Check if the existing signal process mask is to be returned: */
|
||||
if (oset != NULL) {
|
||||
/* Return the current mask: */
|
||||
*oset = _thread_run->sigmask;
|
||||
}
|
||||
/* Check if a new signal set was provided by the caller: */
|
||||
if (set != NULL) {
|
||||
/* Block signals while the signal mask is changed: */
|
||||
_thread_kern_sig_block(&status);
|
||||
|
||||
/* Process according to what to do: */
|
||||
switch (how) {
|
||||
/* Block signals: */
|
||||
case SIG_BLOCK:
|
||||
/* Add signals to the existing mask: */
|
||||
_thread_run->sigmask |= *set;
|
||||
break;
|
||||
|
||||
/* Unblock signals: */
|
||||
case SIG_UNBLOCK:
|
||||
/* Clear signals from the existing mask: */
|
||||
_thread_run->sigmask &= ~(*set);
|
||||
break;
|
||||
|
||||
/* Set the signal process mask: */
|
||||
case SIG_SETMASK:
|
||||
/* Set the new mask: */
|
||||
_thread_run->sigmask = *set;
|
||||
break;
|
||||
|
||||
/* Trap invalid actions: */
|
||||
default:
|
||||
/* Return an invalid argument: */
|
||||
errno = EINVAL;
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Schedule the next thread in case there are signals that
|
||||
* now need to be acted on:
|
||||
*/
|
||||
_thread_kern_sched(NULL);
|
||||
}
|
||||
/* Return the completion status: */
|
||||
return (ret);
|
||||
}
|
||||
#endif
|
||||
@@ -1,73 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997 John Birrell <[email protected]>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by John Birrell.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
#ifdef _THREAD_SAFE
|
||||
#include <pthread.h>
|
||||
#include "pthread_private.h"
|
||||
|
||||
int
|
||||
sigwait(const sigset_t * set, int *sig)
|
||||
{
|
||||
int ret;
|
||||
int status;
|
||||
sigset_t oset;
|
||||
|
||||
/* Block signals: */
|
||||
_thread_kern_sig_block(&status);
|
||||
|
||||
/* Save the current sigmal mask: */
|
||||
oset = _thread_run->sigmask;
|
||||
|
||||
/* Combine the caller's mask with the current one: */
|
||||
_thread_run->sigmask |= *set;
|
||||
|
||||
/* Wait for a signal: */
|
||||
_thread_kern_sched_state(PS_SIGWAIT, __FILE__, __LINE__);
|
||||
|
||||
/* Block signals again: */
|
||||
_thread_kern_sig_block(NULL);
|
||||
|
||||
/* Return the signal number to the caller: */
|
||||
*sig = _thread_run->signo;
|
||||
|
||||
/* Restore the signal mask: */
|
||||
_thread_run->sigmask = oset;
|
||||
|
||||
/* Unblock signals: */
|
||||
_thread_kern_sig_unblock(status);
|
||||
|
||||
/* Return the completion status: */
|
||||
return (ret);
|
||||
}
|
||||
#endif
|
||||
@@ -1,71 +0,0 @@
|
||||
.\" Copyright (c) 1995 David Nugent <[email protected]>
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, is permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice immediately at the beginning of the file, without modification,
|
||||
.\" this list of conditions, and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. This work was done expressly for inclusion into FreeBSD. Other use
|
||||
.\" is permitted provided this notation is included.
|
||||
.\" 4. Absolutely no warranty of function or purpose is made by the author
|
||||
.\" David Nugent.
|
||||
.\" 5. Modifications may be freely made to this file providing the above
|
||||
.\" conditions are met.
|
||||
.\"
|
||||
.\" $Id$
|
||||
.\"
|
||||
.Dd December 29, 1996
|
||||
.Os FreeBSD
|
||||
.Dt LOGIN_AUTH 3
|
||||
.Sh NAME
|
||||
.Nm authenticate
|
||||
.Nm auth_script
|
||||
.Nm auth_env
|
||||
.Nm auth_scan
|
||||
.Nm auth_rmfiles
|
||||
.Nm auth_checknologin
|
||||
.Nm auth_cat
|
||||
.Nm auth_ttyok
|
||||
.Nm auth_hostok
|
||||
.Nm auth_timesok
|
||||
.Nd Authentication style support library for login class capabilities database.
|
||||
.Sh SYNOPSIS
|
||||
.Fd #include <sys/types.h>
|
||||
.Fd #include <login_cap.h>
|
||||
.Ft int
|
||||
.Fn authenticate "const char *name" "const char *classname" "const char *style" "const char *service"
|
||||
.Ft int
|
||||
.Fn auth_script "const char * path" ...
|
||||
.Ft int
|
||||
.Fn auth_env "void"
|
||||
.Ft int
|
||||
.Fn auth_scan "int ok"
|
||||
.Ft int
|
||||
.Fn auth_rmfiles "void"
|
||||
.Ft int
|
||||
.Fn auth_checknologin "login_cap_t *lc"
|
||||
.Ft int
|
||||
.Fn auth_cat "const char *file"
|
||||
.Ft int
|
||||
.Fn auth_ttyok "login_cap_t *lc" "const char *tty"
|
||||
.Ft int
|
||||
.Fn auth_hostok "login_cap_t *lc" "const char *hostname" "char const *ip"
|
||||
.Ft int
|
||||
.Fn auth_timesok "login_cap_t *lc" "time_t now"
|
||||
.Sh DESCRIPTION
|
||||
This set of functions support the login class authorisation style interface provided
|
||||
by
|
||||
.Xr login.conf 5 .
|
||||
|
||||
.Sh RETURN VALUES
|
||||
.Sh SEE ALSO
|
||||
.Xr getcap 3 ,
|
||||
.Xr login_cap 3 ,
|
||||
.Xr login_class 3 ,
|
||||
.Xr login.conf 5 ,
|
||||
.Xr termcap 5
|
||||
@@ -1,46 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997 Peter Wemm.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed for the FreeBSD Project
|
||||
* by Peter Wemm.
|
||||
* 4. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* so there!
|
||||
*
|
||||
* $Id: ifconfig.h,v 1.2 1997/05/10 14:47:35 peter Exp $
|
||||
*/
|
||||
|
||||
extern struct ifreq ifr;
|
||||
|
||||
extern char name[32]; /* name of interface */
|
||||
extern int allmedia;
|
||||
struct afswtch;
|
||||
|
||||
extern void setmedia(const char *, int, int, const struct afswtch *rafp);
|
||||
extern void setmediaopt(const char *, int, int, const struct afswtch *rafp);
|
||||
extern void unsetmediaopt(const char *, int, int, const struct afswtch *rafp);
|
||||
extern void media_status(int s, struct rt_addrinfo *);
|
||||
@@ -1,530 +0,0 @@
|
||||
/* $NetBSD: ifconfig.c,v 1.34 1997/04/21 01:17:58 lukem Exp $ */
|
||||
/* $Id: ifmedia.c,v 1.2 1997/05/10 14:47:35 peter Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1997 Jason R. Thorpe.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed for the NetBSD Project
|
||||
* by Jason R. Thorpe.
|
||||
* 4. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/if_dl.h>
|
||||
#include <net/if_types.h>
|
||||
#include <net/if_media.h>
|
||||
#include <net/route.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "ifconfig.h"
|
||||
|
||||
static void domediaopt __P((const char *, int, int));
|
||||
static int get_media_subtype __P((int, const char *));
|
||||
static int get_media_options __P((int, const char *));
|
||||
static int lookup_media_word __P((struct ifmedia_description *, const char *));
|
||||
static void print_media_word __P((int));
|
||||
|
||||
void
|
||||
media_status(s, info)
|
||||
int s;
|
||||
struct rt_addrinfo *info __unused;
|
||||
{
|
||||
struct ifmediareq ifmr;
|
||||
int *media_list, i;
|
||||
|
||||
(void) memset(&ifmr, 0, sizeof(ifmr));
|
||||
(void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
|
||||
|
||||
if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
|
||||
/*
|
||||
* Interface doesn't support SIOC{G,S}IFMEDIA.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
if (ifmr.ifm_count == 0) {
|
||||
warnx("%s: no media types?", name);
|
||||
return;
|
||||
}
|
||||
|
||||
media_list = (int *)malloc(ifmr.ifm_count * sizeof(int));
|
||||
if (media_list == NULL)
|
||||
err(1, "malloc");
|
||||
ifmr.ifm_ulist = media_list;
|
||||
|
||||
if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
|
||||
err(1, "SIOCGIFMEDIA");
|
||||
|
||||
printf("\tmedia: ");
|
||||
print_media_word(ifmr.ifm_current);
|
||||
if (ifmr.ifm_active != ifmr.ifm_current) {
|
||||
putchar(' ');
|
||||
putchar('(');
|
||||
print_media_word(ifmr.ifm_active);
|
||||
putchar(')');
|
||||
}
|
||||
|
||||
if (ifmr.ifm_status & IFM_AVALID) {
|
||||
printf(" status: ");
|
||||
switch (IFM_TYPE(ifmr.ifm_active)) {
|
||||
case IFM_ETHER:
|
||||
if (ifmr.ifm_status & IFM_ACTIVE)
|
||||
printf("active");
|
||||
else
|
||||
printf("no carrier");
|
||||
break;
|
||||
|
||||
case IFM_FDDI:
|
||||
case IFM_TOKEN:
|
||||
if (ifmr.ifm_status & IFM_ACTIVE)
|
||||
printf("inserted");
|
||||
else
|
||||
printf("no ring");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
putchar('\n');
|
||||
|
||||
if (allmedia) {
|
||||
printf("\tsupported media:");
|
||||
for (i = 0; i < ifmr.ifm_count; i++) {
|
||||
putchar(' ');
|
||||
print_media_word(media_list[i]);
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
free(media_list);
|
||||
}
|
||||
|
||||
void
|
||||
setmedia(val, d, s, afp)
|
||||
const char *val;
|
||||
int d;
|
||||
int s;
|
||||
const struct afswtch *afp;
|
||||
{
|
||||
struct ifmediareq ifmr;
|
||||
int first_type, subtype;
|
||||
|
||||
(void) memset(&ifmr, 0, sizeof(ifmr));
|
||||
(void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
|
||||
|
||||
ifmr.ifm_count = 1;
|
||||
ifmr.ifm_ulist = &first_type;
|
||||
if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
|
||||
/*
|
||||
* If we get E2BIG, the kernel is telling us
|
||||
* that there are more, so we can ignore it.
|
||||
*/
|
||||
if (errno != E2BIG)
|
||||
err(1, "SIOCGIFMEDIA");
|
||||
}
|
||||
|
||||
if (ifmr.ifm_count == 0)
|
||||
errx(1, "%s: no media types?", name);
|
||||
|
||||
/*
|
||||
* We are primarily concerned with the top-level type.
|
||||
* However, "current" may be only IFM_NONE, so we just look
|
||||
* for the top-level type in the first "supported type"
|
||||
* entry.
|
||||
*
|
||||
* (I'm assuming that all supported media types for a given
|
||||
* interface will be the same top-level type..)
|
||||
*/
|
||||
subtype = get_media_subtype(IFM_TYPE(first_type), val);
|
||||
|
||||
strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
|
||||
ifr.ifr_media = (ifmr.ifm_current & ~(IFM_NMASK|IFM_TMASK)) |
|
||||
IFM_TYPE(first_type) | subtype;
|
||||
|
||||
if (ioctl(s, SIOCSIFMEDIA, (caddr_t)&ifr) < 0)
|
||||
err(1, "SIOCSIFMEDIA");
|
||||
}
|
||||
|
||||
void
|
||||
setmediaopt(val, d, s, afp)
|
||||
const char *val;
|
||||
int d;
|
||||
int s;
|
||||
const struct afswtch *afp;
|
||||
{
|
||||
|
||||
domediaopt(val, 0, s);
|
||||
}
|
||||
|
||||
void
|
||||
unsetmediaopt(val, d, s, afp)
|
||||
const char *val;
|
||||
int d;
|
||||
int s;
|
||||
const struct afswtch *afp;
|
||||
{
|
||||
|
||||
domediaopt(val, 1, s);
|
||||
}
|
||||
|
||||
static void
|
||||
domediaopt(val, clear, s)
|
||||
const char *val;
|
||||
int clear;
|
||||
int s;
|
||||
{
|
||||
struct ifmediareq ifmr;
|
||||
int *mwords, options;
|
||||
|
||||
(void) memset(&ifmr, 0, sizeof(ifmr));
|
||||
(void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
|
||||
|
||||
/*
|
||||
* We must go through the motions of reading all
|
||||
* supported media because we need to know both
|
||||
* the current media type and the top-level type.
|
||||
*/
|
||||
|
||||
if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
|
||||
err(1, "SIOCGIFMEDIA");
|
||||
|
||||
if (ifmr.ifm_count == 0)
|
||||
errx(1, "%s: no media types?", name);
|
||||
|
||||
mwords = (int *)malloc(ifmr.ifm_count * sizeof(int));
|
||||
if (mwords == NULL)
|
||||
err(1, "malloc");
|
||||
|
||||
ifmr.ifm_ulist = mwords;
|
||||
if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
|
||||
err(1, "SIOCGIFMEDIA");
|
||||
|
||||
options = get_media_options(IFM_TYPE(mwords[0]), val);
|
||||
|
||||
free(mwords);
|
||||
|
||||
strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
|
||||
ifr.ifr_media = ifmr.ifm_current;
|
||||
if (clear)
|
||||
ifr.ifr_media &= ~options;
|
||||
else
|
||||
ifr.ifr_media |= options;
|
||||
|
||||
if (ioctl(s, SIOCSIFMEDIA, (caddr_t)&ifr) < 0)
|
||||
err(1, "SIOCSIFMEDIA");
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* A good chunk of this is duplicated from sys/net/ifmedia.c
|
||||
**********************************************************************/
|
||||
|
||||
static struct ifmedia_description ifm_type_descriptions[] =
|
||||
IFM_TYPE_DESCRIPTIONS;
|
||||
|
||||
static struct ifmedia_description ifm_subtype_ethernet_descriptions[] =
|
||||
IFM_SUBTYPE_ETHERNET_DESCRIPTIONS;
|
||||
|
||||
static struct ifmedia_description ifm_subtype_ethernet_aliases[] =
|
||||
IFM_SUBTYPE_ETHERNET_ALIASES;
|
||||
|
||||
static struct ifmedia_description ifm_subtype_ethernet_option_descriptions[] =
|
||||
IFM_SUBTYPE_ETHERNET_OPTION_DESCRIPTIONS;
|
||||
|
||||
static struct ifmedia_description ifm_subtype_tokenring_descriptions[] =
|
||||
IFM_SUBTYPE_TOKENRING_DESCRIPTIONS;
|
||||
|
||||
static struct ifmedia_description ifm_subtype_tokenring_aliases[] =
|
||||
IFM_SUBTYPE_TOKENRING_ALIASES;
|
||||
|
||||
static struct ifmedia_description ifm_subtype_tokenring_option_descriptions[] =
|
||||
IFM_SUBTYPE_TOKENRING_OPTION_DESCRIPTIONS;
|
||||
|
||||
static struct ifmedia_description ifm_subtype_fddi_descriptions[] =
|
||||
IFM_SUBTYPE_FDDI_DESCRIPTIONS;
|
||||
|
||||
static struct ifmedia_description ifm_subtype_fddi_aliases[] =
|
||||
IFM_SUBTYPE_FDDI_ALIASES;
|
||||
|
||||
static struct ifmedia_description ifm_subtype_fddi_option_descriptions[] =
|
||||
IFM_SUBTYPE_FDDI_OPTION_DESCRIPTIONS;
|
||||
|
||||
static struct ifmedia_description ifm_subtype_shared_descriptions[] =
|
||||
IFM_SUBTYPE_SHARED_DESCRIPTIONS;
|
||||
|
||||
static struct ifmedia_description ifm_subtype_shared_aliases[] =
|
||||
IFM_SUBTYPE_SHARED_ALIASES;
|
||||
|
||||
static struct ifmedia_description ifm_shared_option_descriptions[] =
|
||||
IFM_SHARED_OPTION_DESCRIPTIONS;
|
||||
|
||||
struct ifmedia_type_to_subtype {
|
||||
struct {
|
||||
struct ifmedia_description *desc;
|
||||
int alias;
|
||||
} subtypes[5];
|
||||
struct {
|
||||
struct ifmedia_description *desc;
|
||||
int alias;
|
||||
} options[3];
|
||||
};
|
||||
|
||||
/* must be in the same order as IFM_TYPE_DESCRIPTIONS */
|
||||
static struct ifmedia_type_to_subtype ifmedia_types_to_subtypes[] = {
|
||||
{
|
||||
{
|
||||
{ &ifm_subtype_shared_descriptions[0], 0 },
|
||||
{ &ifm_subtype_shared_aliases[0], 1 },
|
||||
{ &ifm_subtype_ethernet_descriptions[0], 0 },
|
||||
{ &ifm_subtype_ethernet_aliases[0], 1 },
|
||||
{ NULL, 0 },
|
||||
},
|
||||
{
|
||||
{ &ifm_shared_option_descriptions[0], 0 },
|
||||
{ &ifm_subtype_ethernet_option_descriptions[0], 1 },
|
||||
{ NULL, 0 },
|
||||
},
|
||||
},
|
||||
{
|
||||
{
|
||||
{ &ifm_subtype_shared_descriptions[0], 0 },
|
||||
{ &ifm_subtype_shared_aliases[0], 1 },
|
||||
{ &ifm_subtype_tokenring_descriptions[0], 0 },
|
||||
{ &ifm_subtype_tokenring_aliases[0], 1 },
|
||||
{ NULL, 0 },
|
||||
},
|
||||
{
|
||||
{ &ifm_shared_option_descriptions[0], 0 },
|
||||
{ &ifm_subtype_tokenring_option_descriptions[0], 1 },
|
||||
{ NULL, 0 },
|
||||
},
|
||||
},
|
||||
{
|
||||
{
|
||||
{ &ifm_subtype_shared_descriptions[0], 0 },
|
||||
{ &ifm_subtype_shared_aliases[0], 1 },
|
||||
{ &ifm_subtype_fddi_descriptions[0], 0 },
|
||||
{ &ifm_subtype_fddi_aliases[0], 1 },
|
||||
{ NULL, 0 },
|
||||
},
|
||||
{
|
||||
{ &ifm_shared_option_descriptions[0], 0 },
|
||||
{ &ifm_subtype_fddi_option_descriptions[0], 1 },
|
||||
{ NULL, 0 },
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static int
|
||||
get_media_subtype(type, val)
|
||||
int type;
|
||||
const char *val;
|
||||
{
|
||||
struct ifmedia_description *desc;
|
||||
struct ifmedia_type_to_subtype *ttos;
|
||||
int rval, i;
|
||||
|
||||
/* Find the top-level interface type. */
|
||||
for (desc = ifm_type_descriptions, ttos = ifmedia_types_to_subtypes;
|
||||
desc->ifmt_string != NULL; desc++, ttos++)
|
||||
if (type == desc->ifmt_word)
|
||||
break;
|
||||
if (desc->ifmt_string == NULL)
|
||||
errx(1, "unknown media type 0x%x", type);
|
||||
|
||||
for (i = 0; ttos->subtypes[i].desc != NULL; i++) {
|
||||
rval = lookup_media_word(ttos->subtypes[i].desc, val);
|
||||
if (rval != -1)
|
||||
return (rval);
|
||||
}
|
||||
errx(1, "unknown media subtype: %s", val);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
static int
|
||||
get_media_options(type, val)
|
||||
int type;
|
||||
const char *val;
|
||||
{
|
||||
struct ifmedia_description *desc;
|
||||
struct ifmedia_type_to_subtype *ttos;
|
||||
char *optlist, *optptr;
|
||||
int option = 0, i, rval = 0;
|
||||
|
||||
/* We muck with the string, so copy it. */
|
||||
optlist = strdup(val);
|
||||
if (optlist == NULL)
|
||||
err(1, "strdup");
|
||||
|
||||
/* Find the top-level interface type. */
|
||||
for (desc = ifm_type_descriptions, ttos = ifmedia_types_to_subtypes;
|
||||
desc->ifmt_string != NULL; desc++, ttos++)
|
||||
if (type == desc->ifmt_word)
|
||||
break;
|
||||
if (desc->ifmt_string == NULL)
|
||||
errx(1, "unknown media type 0x%x", type);
|
||||
|
||||
/*
|
||||
* Look up the options in the user-provided comma-separated
|
||||
* list.
|
||||
*/
|
||||
optptr = optlist;
|
||||
for (; (optptr = strtok(optptr, ",")) != NULL; optptr = NULL) {
|
||||
for (i = 0; ttos->options[i].desc != NULL; i++) {
|
||||
option = lookup_media_word(ttos->options[i].desc, optptr);
|
||||
if (option != -1)
|
||||
break;
|
||||
}
|
||||
if (option == 0)
|
||||
errx(1, "unknown option: %s", optptr);
|
||||
rval |= option;
|
||||
}
|
||||
|
||||
free(optlist);
|
||||
return (rval);
|
||||
}
|
||||
|
||||
static int
|
||||
lookup_media_word(desc, val)
|
||||
struct ifmedia_description *desc;
|
||||
const char *val;
|
||||
{
|
||||
|
||||
for (; desc->ifmt_string != NULL; desc++)
|
||||
if (strcasecmp(desc->ifmt_string, val) == 0)
|
||||
return (desc->ifmt_word);
|
||||
|
||||
return (-1);
|
||||
}
|
||||
|
||||
static void
|
||||
print_media_word(ifmw)
|
||||
int ifmw;
|
||||
{
|
||||
struct ifmedia_description *desc;
|
||||
struct ifmedia_type_to_subtype *ttos;
|
||||
int seen_option = 0, i;
|
||||
|
||||
/* Find the top-level interface type. */
|
||||
for (desc = ifm_type_descriptions, ttos = ifmedia_types_to_subtypes;
|
||||
desc->ifmt_string != NULL; desc++, ttos++)
|
||||
if (IFM_TYPE(ifmw) == desc->ifmt_word)
|
||||
break;
|
||||
if (desc->ifmt_string == NULL) {
|
||||
printf("<unknown type>");
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Don't print the top-level type; it's not like we can
|
||||
* change it, or anything.
|
||||
*/
|
||||
|
||||
/* Find subtype. */
|
||||
for (i = 0; ttos->subtypes[i].desc != NULL; i++) {
|
||||
if (ttos->subtypes[i].alias)
|
||||
continue;
|
||||
for (desc = ttos->subtypes[i].desc;
|
||||
desc->ifmt_string != NULL; desc++) {
|
||||
if (IFM_SUBTYPE(ifmw) == desc->ifmt_word)
|
||||
goto got_subtype;
|
||||
}
|
||||
}
|
||||
|
||||
/* Falling to here means unknown subtype. */
|
||||
printf("<unknown subtype>");
|
||||
return;
|
||||
|
||||
got_subtype:
|
||||
printf("%s", desc->ifmt_string);
|
||||
|
||||
/* Find options. */
|
||||
for (i = 0; ttos->options[i].desc != NULL; i++) {
|
||||
if (ttos->options[i].alias)
|
||||
continue;
|
||||
for (desc = ttos->options[i].desc;
|
||||
desc->ifmt_string != NULL; desc++) {
|
||||
if (ifmw & desc->ifmt_word) {
|
||||
if (seen_option == 0)
|
||||
printf(" <");
|
||||
printf("%s%s", seen_option++ ? "," : "",
|
||||
desc->ifmt_string);
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s", seen_option ? ">" : "");
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* ...until here.
|
||||
**********************************************************************/
|
||||
@@ -1,195 +0,0 @@
|
||||
<!-- $Id: russian.sgml,v 1.3 1997/05/02 08:07:35 ache Exp $ -->
|
||||
<!-- The FreeBSD Documentation Project -->
|
||||
|
||||
<sect><heading>Russian Language (KOI8-R encoding)<label id="russian"></heading>
|
||||
<p><em>Contributed by &a.ache;<newline>
|
||||
1 May 1997</em>.
|
||||
<p>See more info about KOI8-R encoding at
|
||||
<htmlurl url="http://www.nagual.pp.ru/~ache/koi8.html"
|
||||
name="KOI8-R References (Russian Net Character Set)">.
|
||||
|
||||
<sect1><heading>Console Setup<label id="russian:console"></heading>
|
||||
<p>
|
||||
<enum>
|
||||
<item>Russian console entry in <tt>/etc/rc.conf</tt> should looks like
|
||||
<verb>
|
||||
keymap=ru.koi8-r
|
||||
keychange="61 ^[[K"
|
||||
scrnmap=koi8-r2cp866
|
||||
font8x16=cp866b-8x16
|
||||
font8x14=cp866-8x14
|
||||
font8x8=cp866-8x8
|
||||
</verb>
|
||||
<p>
|
||||
<it>NOTE:</it> ^[ means that real ESC character must be entered into
|
||||
<tt>/etc/rc.conf</tt>,
|
||||
not just ^[ string.
|
||||
<p>
|
||||
This tuning means KOI8-R keyboard with Alternative
|
||||
screen font mapped to KOI8-R encoding to
|
||||
preserve pseudographics, <it>Gray Delete</it> key remapped to match Russian
|
||||
<tt>termcap(5)</tt> entry for FreeBSD console.
|
||||
<p>
|
||||
RUS/LAT switch will be <bf>CapsLock</bf>. Old CapsLock function still
|
||||
available via <bf>Shift+CapsLock</bf>. CapsLock LED will
|
||||
indicate RUS mode, not CapsLock mode.
|
||||
|
||||
<item>For each <tt>ttyv?</tt> entry in <tt>/etc/ttys</tt>
|
||||
change terminal type from <tt>cons25</tt> to
|
||||
<tt>cons25r</tt>, i.e. each entry should looks like
|
||||
<verb>
|
||||
ttyv0 "/usr/libexec/getty Pc" cons25r on secure
|
||||
</verb>
|
||||
</enum>
|
||||
|
||||
<sect1><heading>Locale Setup<label id="russian:locale"></heading>
|
||||
<p><label id="russian:env">
|
||||
There is two environment variables for locale setup:
|
||||
<itemize>
|
||||
<item><tt>LANG</tt>
|
||||
for POSIX <tt>setlocale(3)</tt> family functions;
|
||||
<item><tt>MM_CHARSET</tt>
|
||||
for applications MIME chararter set.
|
||||
</itemize>
|
||||
<p>
|
||||
The best way is using <tt>/etc/login.conf</tt>
|
||||
<tt>russian</tt> user's login class
|
||||
in <tt>passwd(5)</tt> entry login class position.
|
||||
See <tt>login.conf(5)</tt> for details.
|
||||
|
||||
<sect2><heading>Login Class Method<label id="russian:class"></heading>
|
||||
<p>
|
||||
First of all check your <tt>/etc/login.conf</tt> have
|
||||
<tt>russian</tt> login class, this entry may looks like:
|
||||
<verb>
|
||||
russian:Russian Users Accounts:\
|
||||
:charset=KOI8-R:\
|
||||
:lang=ru_RU.KOI8-R:\
|
||||
:tc=default:
|
||||
</verb>
|
||||
|
||||
<sect3><heading>How to do it with vipw(8)</heading>
|
||||
<p>
|
||||
If you use <tt>vipw(8)</tt> for adding new users,
|
||||
<tt>/etc/master.passwd</tt>
|
||||
entry should looks like:
|
||||
<verb>
|
||||
user:password:1111:11:russian:0:0:User Name:/home/user:/bin/csh
|
||||
</verb>
|
||||
|
||||
<sect3><heading>How to do it with adduser(8)</heading>
|
||||
<p>
|
||||
If you use <tt>adduser(8)</tt> for adding new users:
|
||||
<itemize>
|
||||
<item>Set
|
||||
<verb>
|
||||
defaultclass = russian
|
||||
</verb>
|
||||
in <tt>/etc/adduser.conf</tt>
|
||||
(you must enter <tt>default</tt> class for all non-Russian
|
||||
users in this case);
|
||||
<newline><newline>
|
||||
|
||||
<item>Alternative variant will be answering <tt>russian</tt>
|
||||
each time when you see
|
||||
<verb>
|
||||
Enter login class: default []:
|
||||
</verb>
|
||||
prompt from <tt>adduser(8)</tt>;
|
||||
<newline><newline>
|
||||
|
||||
<item>Another variant: call
|
||||
<verb>
|
||||
# adduser -class russian
|
||||
</verb>
|
||||
for each Russian user you want to add.
|
||||
</itemize>
|
||||
|
||||
<sect3><heading>How to do it with pw(8)</heading>
|
||||
<p>
|
||||
If you use <tt>pw(8)</tt> for adding new users, call it in this form:
|
||||
<verb>
|
||||
# pw useradd user_name -L russian
|
||||
</verb>
|
||||
|
||||
<sect2><heading>Shell Startup Files Method</heading>
|
||||
<p>
|
||||
If you don't want to use
|
||||
<ref id="russian:class" name="login class method">
|
||||
for some reasons, just set
|
||||
this
|
||||
<ref id="russian:env" name="two environment variables">
|
||||
in the following shell startup files:
|
||||
<itemize>
|
||||
<item><tt>/etc/profile</tt>:
|
||||
<verb>
|
||||
LANG=ru_RU.KOI8-R; export LANG
|
||||
MM_CHARSET=KOI8-R; export MM_CHARSET
|
||||
</verb>
|
||||
|
||||
<item><tt>/etc/csh.login</tt>:
|
||||
<verb>
|
||||
setenv LANG ru_RU.KOI8-R
|
||||
setenv MM_CHARSET KOI8-R
|
||||
</verb>
|
||||
</itemize>
|
||||
<p>
|
||||
Alternatively you can add this instructions to
|
||||
<itemize>
|
||||
<item><tt>/usr/share/skel/dot.profile</tt>:
|
||||
<p>
|
||||
(similar to <tt>/etc/profile</tt> above);
|
||||
|
||||
<item><tt>/usr/share/skel/dot.login</tt>:
|
||||
<p>
|
||||
(similar to <tt>/etc/csh.login</tt> above).
|
||||
</itemize>
|
||||
|
||||
<sect1><heading>X Window Setup<label id="russian:xwindow"></heading>
|
||||
<p>
|
||||
Step by step instructions:
|
||||
<enum>
|
||||
<item>Do
|
||||
<ref id="russian:locale" name="locale setup"> first as described.
|
||||
<p>
|
||||
<it>NOTE:</it><label id="russian:note">
|
||||
Russian KOI8-R locale may not work with old XFree86 versions
|
||||
(lower than 3.2.1 + locale/keyboard patches).
|
||||
XFree86 port from <tt>/usr/ports/x11/XFree86</tt> already have
|
||||
all neccessary patches, so it will work, if you install XFree86
|
||||
from this port.
|
||||
Basically, XFree86 version shipped with latest FreeBSD distribution should
|
||||
work too unless somebody forget to apply port patches to it.
|
||||
|
||||
<item>Go to <tt>/usr/ports/russian/X.language</tt> directory and say
|
||||
<verb>
|
||||
# make all install
|
||||
</verb>
|
||||
there. This port install latest version of KOI8-R fonts.
|
||||
<p>
|
||||
Check find <tt>"Files"</tt> section in your <tt>/etc/XF86Config</tt>,
|
||||
following lines must be before any other <tt>FontPath</tt> entries:
|
||||
<verb>
|
||||
FontPath "/usr/X11R6/lib/X11/fonts/cyrillic/misc"
|
||||
FontPath "/usr/X11R6/lib/X11/fonts/cyrillic/75dpi"
|
||||
FontPath "/usr/X11R6/lib/X11/fonts/cyrillic/100dpi"
|
||||
</verb>
|
||||
<p>
|
||||
If you use high resolution video mode, swap 75 dpi and
|
||||
100 dpi lines.
|
||||
|
||||
<item>To activate Russian keyboard add
|
||||
<verb>
|
||||
XkbKeymap "xfree86(ru)"
|
||||
</verb>
|
||||
line into <tt>"Keyboard"</tt> section in your <tt>/etc/XF86Config</tt>,
|
||||
also make sure that <tt>XkbDisable</tt> is turned off (commented out)
|
||||
there.
|
||||
<p>
|
||||
RUS/LAT switch will be <bf>CapsLock</bf>. Old CapsLock function still
|
||||
available via <bf>Shift+CapsLock</bf> (in LAT mode only).
|
||||
<p>
|
||||
<it>NOTE:</it>
|
||||
Russian XKB keyboard may not work with old XFree86 versions,
|
||||
see <ref id="russian:note" name="locale note"> for more info.
|
||||
</enum>
|
||||
@@ -1,45 +0,0 @@
|
||||
Sat Feb 1 23:30:12 PST 1997 <Julian Elischer>
|
||||
|
||||
These files are shell scripts.
|
||||
|
||||
They will, when run, create an example skeleton driver
|
||||
for you. You can use this driver as a starting point for
|
||||
writing drivers for your own devices. They have all the hooks needed
|
||||
for intiialisation, probing, attaching, as well as DEVFS
|
||||
node creation. They also create sample ioctl commands and a sample
|
||||
ioctl definition .h file in /sys/sys. In othe rwords they are fully
|
||||
functional in a 'skeleton' sort of a way. They support multiple devices
|
||||
so that you may have several of your 'foobar' devices probed and atached
|
||||
at once.
|
||||
|
||||
I expect that these scripts will improve with time.
|
||||
|
||||
At present these scripts also link the newly created driver into
|
||||
the kernel sources in /sys. Possibly a better way would be
|
||||
to make them interactive. (and ask what kernel tree to use as well as
|
||||
a name for the driver.).
|
||||
|
||||
There are presently two scripts.
|
||||
One for making a real device driver for ISA devices, and
|
||||
one for making a device driver for pseudo devices (e.g. /dev/null).
|
||||
Hopefully they will be joined by similar scripts for creating
|
||||
skeletons for PCI and EISA devices as well.
|
||||
|
||||
Give them a single argument: the name of the driver.
|
||||
They will use this given name in many places within the driver,
|
||||
both in lower and upper case form. (conforming to normal usage).
|
||||
|
||||
The skeleton driver should already link with the kernel
|
||||
and in fact the shell script will compile a kernel with the new
|
||||
drive linked in.. The new kernel should still be
|
||||
runnable and the new driver should be
|
||||
fully callable (once you get your device to probe).
|
||||
You should simply edit the driver and continue to use
|
||||
'make' (as done in the script) until your driver does what you want.
|
||||
|
||||
The driver will end up in /sys/i386/isa for the device driver script,
|
||||
and in /sys/dev for the pseudo driver script.
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,400 +0,0 @@
|
||||
#!/bin/sh
|
||||
# This writes a skeleton driver and puts it into the kernel tree for you
|
||||
#arg1 is lowercase "foo"
|
||||
#
|
||||
# Trust me, RUN THIS SCRIPT :)
|
||||
#
|
||||
#-------cut here------------------
|
||||
cd /sys/i386/conf
|
||||
|
||||
if [ "${1}X" = "X" ]
|
||||
then
|
||||
echo "Hey , how about some help here.. give me a device name!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
UPPER=`echo ${1} |tr "[:lower:]" "[:upper:]"`
|
||||
cat >files.${UPPER} <<DONE
|
||||
i386/isa/${1}.c optional ${1} device-driver
|
||||
DONE
|
||||
|
||||
cat >${UPPER} <<DONE
|
||||
# Configuration file for kernel type: ${UPPER}
|
||||
ident ${UPPER}
|
||||
# \$Id:\$"
|
||||
DONE
|
||||
|
||||
grep -v GENERIC < GENERIC >>${UPPER}
|
||||
|
||||
cat >>${UPPER} <<DONE
|
||||
# trust me, you'll need this
|
||||
options DDB
|
||||
device ${1}0 at isa? port 0x234 bio irq 5 vector ${1}intr
|
||||
DONE
|
||||
|
||||
cat >../isa/${1}.c <<DONE
|
||||
/*
|
||||
* Copyright ME
|
||||
*
|
||||
* ${1} driver
|
||||
* \$Id:\$
|
||||
*/
|
||||
|
||||
|
||||
#include "${1}.h" /* generated file.. defines N${UPPER} */
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h> /* SYSINIT stuff */
|
||||
#include <sys/conf.h> /* cdevsw stuff */
|
||||
#include <sys/malloc.h> /* malloc region definitions */
|
||||
#include <machine/clock.h> /* DELAY() */
|
||||
#include <i386/isa/isa.h> /* ISA bus port definitions etc. */
|
||||
#include <i386/isa/isa_device.h>/* ISA bus configuration structures */
|
||||
#include <sys/${1}io.h> /* ${1} IOCTL definitions */
|
||||
#ifdef DEVFS
|
||||
#include <sys/devfsext.h> /* DEVFS defintitions */
|
||||
#endif /* DEVFS */
|
||||
|
||||
|
||||
|
||||
/* Function prototypes (these should all be static except for ${1}intr()) */
|
||||
static d_open_t ${1}open;
|
||||
static d_close_t ${1}close;
|
||||
static d_read_t ${1}read;
|
||||
static d_write_t ${1}write;
|
||||
static d_ioctl_t ${1}ioctl;
|
||||
static d_mmap_t ${1}mmap;
|
||||
static d_select_t ${1}select;
|
||||
static int ${1}probe (struct isa_device *);
|
||||
static int ${1}attach (struct isa_device *);
|
||||
/* void ${1}intr(int unit);*//* actually defined in ioconf.h (generated file) */
|
||||
|
||||
#define CDEV_MAJOR 20
|
||||
static struct cdevsw ${1}_cdevsw = {
|
||||
${1}open,
|
||||
${1}close,
|
||||
${1}read,
|
||||
${1}write,
|
||||
${1}ioctl,
|
||||
nullstop,
|
||||
nullreset,
|
||||
nodevtotty,
|
||||
${1}select,
|
||||
${1}mmap,
|
||||
NULL,
|
||||
"${1}",
|
||||
NULL,
|
||||
-1 };
|
||||
|
||||
struct isa_driver ${1}driver = {
|
||||
${1}probe,
|
||||
${1}attach,
|
||||
"${1}" };
|
||||
|
||||
/*
|
||||
* device specific Misc defines
|
||||
*/
|
||||
#define BUFFERSIZE 1024
|
||||
#define NUMPORTS 4
|
||||
#define UNIT(dev) minor(dev) /* assume one minor number per unit */
|
||||
|
||||
/*
|
||||
* One of these per allocated device
|
||||
*/
|
||||
struct ${1}_softc {
|
||||
struct isa_device *dev;
|
||||
char buffer[BUFFERSIZE];
|
||||
#ifdef DEVFS
|
||||
static void *devfs_token;
|
||||
#endif
|
||||
} ;
|
||||
|
||||
typedef struct ${1}_softc *sc_p;
|
||||
|
||||
static sc_p sca[N${UPPER}];
|
||||
|
||||
/* add your own test to see if it exists */
|
||||
/* should return the number of ports needed */
|
||||
static int
|
||||
${1}probe (struct isa_device *dev)
|
||||
{
|
||||
char val;
|
||||
int unit = dev->id_unit;
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
/*
|
||||
* Check the unit makes sense.
|
||||
*/
|
||||
if (unit > N${UPPER}) {
|
||||
printf("bad unit (%d)\n", unit);
|
||||
return (0);
|
||||
}
|
||||
if (scp) {
|
||||
printf("unit $d already attached\n", unit);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* try see if the device is there.
|
||||
*/
|
||||
val = inb (dev->id_iobase);
|
||||
if ( val != 42 ) {
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* ok, we got one we think
|
||||
* do some further (this time possibly destructive) tests.
|
||||
*/
|
||||
outb (dev->id_iobase, 0xff);
|
||||
DELAY (10000); /* 10 ms delay */
|
||||
val = inb (dev->id_iobase) & 0x0f;
|
||||
return ((val & 0x0f) == 0x0f)? NUMPORTS : 0 ;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called if the probe succeeded.
|
||||
* We can be destructive here as we know we have the device.
|
||||
* we can also trust the unit number.
|
||||
*/
|
||||
static int
|
||||
${1}attach (struct isa_device *dev)
|
||||
{
|
||||
int unit = dev->id_unit;
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
/*
|
||||
* Allocate storage for this instance .
|
||||
*/
|
||||
scp = malloc(sizeof(*scp), M_DEVBUF, M_NOWAIT);
|
||||
if( scp == NULL) {
|
||||
printf("${1}%d failed to allocage driver strorage\n", unit);
|
||||
return (0);
|
||||
}
|
||||
bzero(scp, sizeof(*scp));
|
||||
sca[unit] = scp;
|
||||
|
||||
/*
|
||||
* Store whatever seems wise.
|
||||
*/
|
||||
scp->dev = dev;
|
||||
#if DEVFS
|
||||
scp->devfs_token = devfs_add_devswf(&${1}_cdevsw, unit, DV_CHR,
|
||||
UID_ROOT, GID_KMEM, 0600, "${1}%d", unit);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Macro to check that the unit number is valid
|
||||
* Often this isn't needed as once the open() is performed,
|
||||
* the unit number is pretty much safe.. The exception would be if we
|
||||
* implemented devices that could "go away". in which case all these routines
|
||||
* would be wise to check the number, DIAGNOSTIC or not.
|
||||
*/
|
||||
#define CHECKUNIT(RETVAL) \
|
||||
do { /* the do-while is a safe way to do this grouping */ \
|
||||
if (unit > N${UPPER}) { \
|
||||
printf(__FUNCTION__ ":bad unit $d\n", unit); \
|
||||
return (RETVAL); \
|
||||
} \
|
||||
if (scp == NULL) { \
|
||||
printf( __FUNCTION__ ": unit $d not attached\n", unit);\
|
||||
return (RETVAL); \
|
||||
} \
|
||||
} while (0)
|
||||
#ifdef DIAGNOSTIC
|
||||
#define CHECKUNIT_DIAG(RETVAL) CHECKUNIT(RETVAL)
|
||||
#else /* DIAGNOSTIC */
|
||||
#define CHECKUNIT_DIAG(RETVAL)
|
||||
#endif /* DIAGNOSTIC */
|
||||
|
||||
void
|
||||
${1}intr(int unit)
|
||||
{
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
/*
|
||||
* well we got an interupt, now what?
|
||||
* Theoretically we don't need to check the unit.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
int ${1}ioctl (dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
CHECKUNIT_DIAG(ENXIO);
|
||||
|
||||
switch (cmd) {
|
||||
case DHIOCRESET:
|
||||
/* whatever resets it */
|
||||
outb(scp->dev->id_iobase, 0xff);
|
||||
break;
|
||||
default:
|
||||
return ENXIO;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
/*
|
||||
* You also need read, write, open, close routines.
|
||||
* This should get you started
|
||||
*/
|
||||
static int
|
||||
${1}open(dev_t dev, int oflags, int devtype, struct proc *p)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
CHECKUNIT(ENXIO);
|
||||
|
||||
/*
|
||||
* Do processing
|
||||
*/
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
${1}close(dev_t dev, int fflag, int devtype, struct proc *p)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
CHECKUNIT_DIAG(ENXIO);
|
||||
|
||||
/*
|
||||
* Do processing
|
||||
*/
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
${1}read(dev_t dev, struct uio *uio, int ioflag)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
int toread;
|
||||
|
||||
|
||||
CHECKUNIT_DIAG(ENXIO);
|
||||
|
||||
/*
|
||||
* Do processing
|
||||
* read from buffer
|
||||
*/
|
||||
toread = (min(uio->uio_resid, sizeof(scp->buffer)));
|
||||
return(uiomove(scp->buffer, toread, uio));
|
||||
}
|
||||
|
||||
static int
|
||||
${1}write(dev_t dev, struct uio *uio, int ioflag)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
int towrite;
|
||||
|
||||
CHECKUNIT_DIAG(ENXIO);
|
||||
|
||||
/*
|
||||
* Do processing
|
||||
* write to buffer
|
||||
*/
|
||||
towrite = (min(uio->uio_resid, sizeof(scp->buffer)));
|
||||
return(uiomove(scp->buffer, towrite, uio));
|
||||
}
|
||||
|
||||
static int
|
||||
${1}mmap(dev_t dev, int offset, int nprot)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
CHECKUNIT_DIAG(-1);
|
||||
|
||||
/*
|
||||
* Do processing
|
||||
*/
|
||||
#if 0 /* if we had a frame buffer or whatever.. do this */
|
||||
if (offset > FRAMEBUFFERSIZE - PAGE_SIZE) {
|
||||
return (-1);
|
||||
}
|
||||
return i386_btop((FRAMEBASE + offset));
|
||||
#else
|
||||
return (-1);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int
|
||||
${1}select(dev_t dev, int which, struct proc *p)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
CHECKUNIT_DIAG(ENXIO);
|
||||
|
||||
/*
|
||||
* Do processing
|
||||
*/
|
||||
return (0); /* this is the wrong value I'm sure */
|
||||
}
|
||||
|
||||
/*
|
||||
* Now for some driver initialisation.
|
||||
* Occurs ONCE during boot (very early).
|
||||
*/
|
||||
static void
|
||||
${1}_drvinit(void *unused)
|
||||
{
|
||||
dev_t dev;
|
||||
|
||||
dev = makedev(CDEV_MAJOR, 0);
|
||||
cdevsw_add(&dev, &${1}_cdevsw, NULL);
|
||||
}
|
||||
|
||||
SYSINIT(${1}dev, SI_SUB_DRIVERS, SI_ORDER_MIDDLE+CDEV_MAJOR,
|
||||
${1}_drvinit, NULL)
|
||||
|
||||
|
||||
DONE
|
||||
|
||||
cat >../../sys/${1}io.h <<DONE
|
||||
/*
|
||||
* Definitions needed to access the ${1} device (ioctls etc)
|
||||
* see mtio.h , ioctl.h as examples
|
||||
*/
|
||||
#ifndef SYS_DHIO_H
|
||||
#define SYS_DHIO_H
|
||||
|
||||
#ifndef KERNEL
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#include <sys/ioccom.h>
|
||||
|
||||
/*
|
||||
* define an ioctl here
|
||||
*/
|
||||
#define DHIOCRESET _IO('D', 0) /* reset the ${1} device */
|
||||
#endif
|
||||
DONE
|
||||
|
||||
config ${UPPER}
|
||||
cd ../../compile/${UPPER}
|
||||
make depend
|
||||
make ${1}.o
|
||||
make
|
||||
exit
|
||||
|
||||
#--------------end of script---------------
|
||||
#
|
||||
#you also need to add an entry into the cdevsw[]
|
||||
#array in conf.c, but it's too hard to do in a script..
|
||||
#
|
||||
#edit to your taste..
|
||||
#
|
||||
#
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,321 +0,0 @@
|
||||
#!/bin/sh
|
||||
# This writes a skeleton driver and puts it into the kernel tree for you
|
||||
#arg1 is lowercase "foo"
|
||||
#
|
||||
# Trust me, RUN THIS SCRIPT :)
|
||||
#
|
||||
#-------cut here------------------
|
||||
cd /sys/i386/conf
|
||||
|
||||
if [ "${1}X" = "X" ]
|
||||
then
|
||||
echo "Hey , how about some help here.. give me a device name!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
UPPER=`echo ${1} |tr "[:lower:]" "[:upper:]"`
|
||||
cat >files.${UPPER} <<DONE
|
||||
dev/${1}.c optional ${1} device-driver
|
||||
DONE
|
||||
|
||||
cat >${UPPER} <<DONE
|
||||
# Configuration file for kernel type: ${UPPER}
|
||||
ident ${UPPER}
|
||||
# \$Id:\$"
|
||||
DONE
|
||||
|
||||
grep -v GENERIC < GENERIC >>${UPPER}
|
||||
|
||||
cat >>${UPPER} <<DONE
|
||||
# trust me, you'll need this
|
||||
options DDB
|
||||
pseudo-device ${1} 4 # might as well allow 4 of them
|
||||
DONE
|
||||
|
||||
cat >../../dev/${1}.c <<DONE
|
||||
/*
|
||||
* Copyright ME
|
||||
*
|
||||
* ${1} driver
|
||||
* \$Id:\$
|
||||
*/
|
||||
|
||||
|
||||
#include "${1}.h" /* generated file.. defines N${UPPER} */
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h> /* SYSINIT stuff */
|
||||
#include <sys/conf.h> /* cdevsw stuff */
|
||||
#include <sys/malloc.h> /* malloc region definitions */
|
||||
#include <machine/clock.h> /* DELAY() */
|
||||
#include <sys/${1}io.h> /* ${1} IOCTL definitions */
|
||||
#ifdef DEVFS
|
||||
#include <sys/devfsext.h> /* DEVFS defintitions */
|
||||
#endif /* DEVFS */
|
||||
|
||||
|
||||
|
||||
/* Function prototypes (these should all be static except for ${1}intr()) */
|
||||
static d_open_t ${1}open;
|
||||
static d_close_t ${1}close;
|
||||
static d_read_t ${1}read;
|
||||
static d_write_t ${1}write;
|
||||
static d_ioctl_t ${1}ioctl;
|
||||
static d_mmap_t ${1}mmap;
|
||||
static d_select_t ${1}select;
|
||||
|
||||
#define CDEV_MAJOR 20
|
||||
static struct cdevsw ${1}_cdevsw = {
|
||||
${1}open,
|
||||
${1}close,
|
||||
${1}read,
|
||||
${1}write,
|
||||
${1}ioctl,
|
||||
nullstop,
|
||||
nullreset,
|
||||
nodevtotty,
|
||||
${1}select,
|
||||
${1}mmap,
|
||||
NULL,
|
||||
"${1}",
|
||||
NULL,
|
||||
-1 };
|
||||
|
||||
/*
|
||||
* device specific Misc defines
|
||||
*/
|
||||
#define BUFFERSIZE 1024
|
||||
#define UNIT(dev) minor(dev) /* assume one minor number per unit */
|
||||
|
||||
/*
|
||||
* One of these per allocated device
|
||||
*/
|
||||
struct ${1}_softc {
|
||||
struct isa_device *dev;
|
||||
char buffer[BUFFERSIZE];
|
||||
#ifdef DEVFS
|
||||
static void *devfs_token;
|
||||
#endif
|
||||
} ;
|
||||
|
||||
typedef struct ${1}_softc *sc_p;
|
||||
|
||||
static sc_p sca[N${UPPER}];
|
||||
|
||||
/*
|
||||
* Macro to check that the unit number is valid
|
||||
* Often this isn't needed as once the open() is performed,
|
||||
* the unit number is pretty much safe.. The exception would be if we
|
||||
* implemented devices that could "go away". in which case all these routines
|
||||
* would be wise to check the number, DIAGNOSTIC or not.
|
||||
*/
|
||||
#define CHECKUNIT(RETVAL) \
|
||||
do { /* the do-while is a safe way to do this grouping */ \
|
||||
if (unit > N${UPPER}) { \
|
||||
printf(__FUNCTION__ ":bad unit $d\n", unit); \
|
||||
return (RETVAL); \
|
||||
} \
|
||||
if (scp == NULL) { \
|
||||
printf( __FUNCTION__ ": unit $d not attached\n", unit);\
|
||||
return (RETVAL); \
|
||||
} \
|
||||
} while (0)
|
||||
#ifdef DIAGNOSTIC
|
||||
#define CHECKUNIT_DIAG(RETVAL) CHECKUNIT(RETVAL)
|
||||
#else /* DIAGNOSTIC */
|
||||
#define CHECKUNIT_DIAG(RETVAL)
|
||||
#endif /* DIAGNOSTIC */
|
||||
|
||||
int ${1}ioctl (dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
CHECKUNIT_DIAG(ENXIO);
|
||||
|
||||
switch (cmd) {
|
||||
case DHIOCRESET:
|
||||
/* whatever resets it */
|
||||
outb(scp->dev->id_iobase, 0xff);
|
||||
break;
|
||||
default:
|
||||
return ENXIO;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
/*
|
||||
* You also need read, write, open, close routines.
|
||||
* This should get you started
|
||||
*/
|
||||
static int
|
||||
${1}open(dev_t dev, int oflags, int devtype, struct proc *p)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
CHECKUNIT(ENXIO);
|
||||
|
||||
/*
|
||||
* Do processing
|
||||
*/
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
${1}close(dev_t dev, int fflag, int devtype, struct proc *p)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
CHECKUNIT_DIAG(ENXIO);
|
||||
|
||||
/*
|
||||
* Do processing
|
||||
*/
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
${1}read(dev_t dev, struct uio *uio, int ioflag)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
int toread;
|
||||
|
||||
|
||||
CHECKUNIT_DIAG(ENXIO);
|
||||
|
||||
/*
|
||||
* Do processing
|
||||
* read from buffer
|
||||
*/
|
||||
toread = (min(uio->uio_resid, sizeof(scp->buffer)));
|
||||
return(uiomove(scp->buffer, toread, uio));
|
||||
}
|
||||
|
||||
static int
|
||||
${1}write(dev_t dev, struct uio *uio, int ioflag)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
int towrite;
|
||||
|
||||
CHECKUNIT_DIAG(ENXIO);
|
||||
|
||||
/*
|
||||
* Do processing
|
||||
* write to buffer
|
||||
*/
|
||||
towrite = (min(uio->uio_resid, sizeof(scp->buffer)));
|
||||
return(uiomove(scp->buffer, towrite, uio));
|
||||
}
|
||||
|
||||
static int
|
||||
${1}mmap(dev_t dev, int offset, int nprot)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
CHECKUNIT_DIAG(-1);
|
||||
|
||||
/*
|
||||
* Do processing
|
||||
*/
|
||||
#if 0 /* if we had a frame buffer or whatever.. do this */
|
||||
if (offset > FRAMEBUFFERSIZE - PAGE_SIZE) {
|
||||
return (-1);
|
||||
}
|
||||
return i386_btop((FRAMEBASE + offset));
|
||||
#else
|
||||
return (-1);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int
|
||||
${1}select(dev_t dev, int which, struct proc *p)
|
||||
{
|
||||
int unit = UNIT (dev);
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
CHECKUNIT_DIAG(ENXIO);
|
||||
|
||||
/*
|
||||
* Do processing
|
||||
*/
|
||||
return (0); /* this is the wrong value I'm sure */
|
||||
}
|
||||
|
||||
/*
|
||||
* Now for some driver initialisation.
|
||||
* Occurs ONCE during boot (very early).
|
||||
*/
|
||||
static void
|
||||
${1}_drvinit(void *unused)
|
||||
{
|
||||
dev_t dev;
|
||||
int unit;
|
||||
sc_p scp = sca[unit];
|
||||
|
||||
dev = makedev(CDEV_MAJOR, 0);
|
||||
cdevsw_add(&dev, &${1}_cdevsw, NULL);
|
||||
for (unit = 0; unit < N${UPPER}; unit++) {
|
||||
/*
|
||||
* Allocate storage for this instance .
|
||||
*/
|
||||
scp = malloc(sizeof(*scp), M_DEVBUF, M_NOWAIT);
|
||||
if( scp == NULL) {
|
||||
printf("${1}%d failed to allocate strorage\n", unit);
|
||||
return ;
|
||||
}
|
||||
bzero(scp, sizeof(*scp));
|
||||
sca[unit] = scp;
|
||||
#if DEVFS
|
||||
scp->devfs_token = devfs_add_devswf(&${1}_cdevsw, unit, DV_CHR,
|
||||
UID_ROOT, GID_KMEM, 0640, "${1}%d", unit);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
SYSINIT(${1}dev, SI_SUB_DRIVERS, SI_ORDER_MIDDLE+CDEV_MAJOR,
|
||||
${1}_drvinit, NULL)
|
||||
|
||||
|
||||
DONE
|
||||
|
||||
cat >../../sys/${1}io.h <<DONE
|
||||
/*
|
||||
* Definitions needed to access the ${1} device (ioctls etc)
|
||||
* see mtio.h , ioctl.h as examples
|
||||
*/
|
||||
#ifndef SYS_DHIO_H
|
||||
#define SYS_DHIO_H
|
||||
|
||||
#ifndef KERNEL
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#include <sys/ioccom.h>
|
||||
|
||||
/*
|
||||
* define an ioctl here
|
||||
*/
|
||||
#define DHIOCRESET _IO('D', 0) /* reset the ${1} device */
|
||||
#endif
|
||||
DONE
|
||||
|
||||
config ${UPPER}
|
||||
cd ../../compile/${UPPER}
|
||||
make depend
|
||||
make ${1}.o
|
||||
make
|
||||
exit
|
||||
|
||||
#--------------end of script---------------
|
||||
#
|
||||
#you also need to add an entry into the cdevsw[]
|
||||
#array in conf.c, but it's too hard to do in a script..
|
||||
#
|
||||
#edit to your taste..
|
||||
#
|
||||
#
|
||||
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# diablo-if-net - Text filter for Diablo printer `scrivener' listening
|
||||
# on port 5100. Installed in /usr/local/libexec/diablo-if-net
|
||||
#
|
||||
|
||||
exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100
|
||||
@@ -1,59 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# hpdf - Print DVI data on HP/PCL printer
|
||||
# Installed in /usr/local/libexec/hpdf
|
||||
|
||||
PATH=/usr/local/bin:$PATH; export PATH
|
||||
|
||||
#
|
||||
# Define a function to clean up our temporary files. These exist
|
||||
# in the current directory, which will be the spooling directory
|
||||
# for the printer.
|
||||
#
|
||||
cleanup() {
|
||||
rm -f hpdf$$.dvi
|
||||
}
|
||||
|
||||
#
|
||||
# Define a function to handle fatal errors: print the given message
|
||||
# and exit 2. Exiting with 2 tells LPD to do not try to reprint the
|
||||
# job.
|
||||
#
|
||||
fatal() {
|
||||
echo "$@" 1>&2
|
||||
cleanup
|
||||
exit 2
|
||||
}
|
||||
|
||||
#
|
||||
# If user removes the job, LPD will send SIGINT, so trap SIGINT
|
||||
# (and a few other signals) to clean up after ourselves.
|
||||
#
|
||||
trap cleanup 1 2 15
|
||||
|
||||
#
|
||||
# Make sure we are not colliding with any existing files.
|
||||
#
|
||||
cleanup
|
||||
|
||||
#
|
||||
# Link the DVI input file to standard input (the file to print).
|
||||
#
|
||||
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"
|
||||
|
||||
#
|
||||
# Make LF = CR+LF
|
||||
#
|
||||
printf "\033&k2G" || fatal "Cannot initialize printer"
|
||||
|
||||
#
|
||||
# Convert and print. Return value from dvilj2p does not seem to be
|
||||
# reliable, so we ignore it.
|
||||
#
|
||||
dvilj2p -M1 -q -e- dfhp$$.dvi
|
||||
|
||||
#
|
||||
# Clean up and exit
|
||||
#
|
||||
cleanup
|
||||
exit 0
|
||||
@@ -1,11 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# hpif - Simple text input filter for lpd for HP-PCL based printers
|
||||
# Installed in /usr/local/libexec/hpif
|
||||
#
|
||||
# Simply copies stdin to stdout. Ignores all filter arguments.
|
||||
# Tells printer to treat LF as CR+LF. Writes a form feed character
|
||||
# after printing job.
|
||||
|
||||
printf "\033&k2G" && cat && printf "\f" && exit 0
|
||||
exit 2
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# hpof - Output filter for Hewlett Packard PCL-compatible printers
|
||||
# Installed in /usr/local/libexec/hpof
|
||||
|
||||
|
||||
printf "\033&k2G" || exit 2
|
||||
exec /usr/libexec/lpr/lpf
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# hprf - FORTRAN text filter for LaserJet 3si:
|
||||
# Installed in /usr/local/libexec/hprf
|
||||
#
|
||||
|
||||
printf "\033&k2G" && fpr && printf "\f" && exit 0
|
||||
exit 2
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# hpvf - Convert GIF files into HP/PCL, then print
|
||||
# Installed in /usr/local/libexec/hpvf
|
||||
|
||||
PATH=/usr/X11R6/bin:$PATH; export PATH
|
||||
|
||||
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
|
||||
&& exit 0 \
|
||||
|| exit 2
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# if-simple - Simple text input filter for lpd
|
||||
# Installed in /usr/local/libexec/if-simple
|
||||
#
|
||||
# Simply copies stdin to stdout. Ignores all filter arguments.
|
||||
|
||||
/bin/cat && exit 0
|
||||
exit 2
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# if-simple - Simple text input filter for lpd
|
||||
# Installed in /usr/local/libexec/if-simple
|
||||
#
|
||||
# Simply copies stdin to stdout. Ignores all filter arguments.
|
||||
# Writes a form feed character (\f) after printing job.
|
||||
|
||||
/bin/cat && printf "\f" && exit 0
|
||||
exit 2
|
||||
@@ -1,32 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# ifhp - Print Ghostscript-simulated PostScript on a DesJet 500
|
||||
# Installed in /usr/local/libexec/hpif
|
||||
|
||||
#
|
||||
# Treat LF as CR+LF:
|
||||
#
|
||||
printf "\033&k2G" || exit 2
|
||||
|
||||
#
|
||||
# Read first two characters of the file
|
||||
#
|
||||
read first_line
|
||||
first_two_chars=`expr "$first_line" : '\(..\)'`
|
||||
|
||||
if [ "$first_two_chars" = "%!" ]; then
|
||||
#
|
||||
# It is PostScript; use Ghostscript to scan-convert and print it
|
||||
#
|
||||
/usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile=- - \
|
||||
&& exit 0
|
||||
|
||||
else
|
||||
#
|
||||
# Plain text or HP/PCL, so just print it directly; print a form
|
||||
# at the end to eject the last page.
|
||||
#
|
||||
echo $first_line && cat && printf "\f" && exit 2
|
||||
fi
|
||||
|
||||
exit 2
|
||||
@@ -1,79 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# make-ps-header - make a PostScript header page on stdout
|
||||
# Installed in /usr/local/libexec/make-ps-header
|
||||
#
|
||||
|
||||
#
|
||||
# These are PostScript units (72 to the inch). Modify for A4 or
|
||||
# whatever size paper you are using:
|
||||
#
|
||||
page_width=612
|
||||
page_height=792
|
||||
border=72
|
||||
|
||||
#
|
||||
# Check arguments
|
||||
#
|
||||
if [ $# -ne 3 ]; then
|
||||
echo "Usage: `basename $0` <user> <host> <job>" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#
|
||||
# Save these, mostly for readability in the PostScript, below.
|
||||
#
|
||||
user=$1
|
||||
host=$2
|
||||
job=$3
|
||||
date=`date`
|
||||
|
||||
#
|
||||
# Send the PostScript code to stdout.
|
||||
#
|
||||
exec cat <<EOF
|
||||
%!PS
|
||||
|
||||
%
|
||||
% Make sure we do not interfere with user's job that will follow
|
||||
%
|
||||
save
|
||||
|
||||
%
|
||||
% Make a thick, unpleasant border around the edge of the paper.
|
||||
%
|
||||
$border $border moveto
|
||||
$page_width $border 2 mul sub 0 rlineto
|
||||
0 $page_height $border 2 mul sub rlineto
|
||||
currentscreen 3 -1 roll pop 100 3 1 roll setscreen
|
||||
$border 2 mul $page_width sub 0 rlineto closepath
|
||||
0.8 setgray 10 setlinewidth stroke 0 setgray
|
||||
|
||||
%
|
||||
% Display user's login name, nice and large and prominent
|
||||
%
|
||||
/Helvetica-Bold findfont 64 scalefont setfont
|
||||
$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
|
||||
($user) show
|
||||
|
||||
%
|
||||
% Now show the boring particulars
|
||||
%
|
||||
/Helvetica findfont 14 scalefont setfont
|
||||
/y 200 def
|
||||
[ (Job:) (Host:) (Date:) ] {
|
||||
200 y moveto show /y y 18 sub def
|
||||
} forall
|
||||
|
||||
/Helvetica-Bold findfont 14 scalefont setfont
|
||||
/y 200 def
|
||||
[ ($job) ($host) ($date) ] {
|
||||
270 y moveto show /y y 18 sub def
|
||||
} forall
|
||||
|
||||
%
|
||||
% That is it
|
||||
%
|
||||
restore
|
||||
showpage
|
||||
EOF
|
||||
@@ -1,24 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# netprint - Text filter for printer attached to network
|
||||
# Installed in /usr/local/libexec/netprint
|
||||
#
|
||||
|
||||
$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";
|
||||
|
||||
$printer_host = $ARGV[0];
|
||||
$printer_port = $ARGV[1];
|
||||
|
||||
require 'sys/socket.ph';
|
||||
|
||||
($ignore, $ignore, $protocol) = getprotobyname('tcp');
|
||||
($ignore, $ignore, $ignore, $ignore, $address)
|
||||
= gethostbyname($printer_host);
|
||||
|
||||
$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);
|
||||
|
||||
socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
|
||||
|| die "Can't create TCP/IP stream socket: $!";
|
||||
connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
|
||||
while (<STDIN>) { print PRINTER; }
|
||||
exit 0;
|
||||
@@ -1,8 +0,0 @@
|
||||
#!bin/sh
|
||||
#
|
||||
# psdf - DVI to PostScript printer filter
|
||||
# Installed in /usr/local/libexec/psdf
|
||||
#
|
||||
# Invoked by lpd when user runs lpr -d
|
||||
#
|
||||
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
|
||||
@@ -1,31 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# psdf - DVI to PostScript printer filter
|
||||
# Installed in /usr/local/libexec/psdf
|
||||
#
|
||||
# Invoked by lpd when user runs lpr -d
|
||||
#
|
||||
|
||||
orig_args="$@"
|
||||
|
||||
fail() {
|
||||
echo "$@" 1>&2
|
||||
exit 2
|
||||
}
|
||||
|
||||
while getopts "x:y:n:h:" option; do
|
||||
case $option in
|
||||
x|y) ;; # Ignore
|
||||
n) login=$OPTARG ;;
|
||||
h) host=$OPTARG ;;
|
||||
*) echo "LPD started `basename $0` wrong." 1>&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
[ "$login" ] || fail "No login name"
|
||||
[ "$host" ] || fail "No host name"
|
||||
|
||||
( /u/kelly/freebsd/printing/filters/make-ps-header $login $host "DVI File"
|
||||
/usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args
|
||||
@@ -1,23 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# psif - Print PostScript or plain text on a PostScript printer
|
||||
# Script version; NOT the version that comes with lprps
|
||||
# Installed in /usr/local/libexec/psif
|
||||
#
|
||||
|
||||
read first_line
|
||||
first_two_chars=`expr "$first_line" : '\(..\)'`
|
||||
|
||||
if [ "$first_two_chars" = "%!" ]; then
|
||||
#
|
||||
# PostScript job, print it.
|
||||
#
|
||||
echo $first_line && cat && printf "\004" && exit 0
|
||||
exit 2
|
||||
else
|
||||
#
|
||||
# Plain text, convert it, then print it.
|
||||
#
|
||||
( echo $first_line; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
|
||||
exit 2
|
||||
fi
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# pstf - Convert groff's troff data into PS, then print.
|
||||
# Installed in /usr/local/libexec/pstf
|
||||
#
|
||||
exec grops | /usr/local/libexec/lprps "$@"
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# pstf - Convert groff's troff data into PS, then print.
|
||||
# Installed in /usr/local/libexec/pstf
|
||||
#
|
||||
exec grops
|
||||
@@ -1,288 +0,0 @@
|
||||
.\" Copyright (c) 1996,1997 Shunsuke Akiyama <[email protected]>.
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by Shunsuke Akiyama.
|
||||
.\" 4. Neither the name of the author nor the names of any co-contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY Shunsuke Akiyama AND CONTRIBUTORS ``AS IS''
|
||||
.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL Shunsuke Akiyama OR CONTRIBUTORS BE
|
||||
.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
.\" POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $Id$
|
||||
.\"
|
||||
.Dd March 16, 1997
|
||||
.Dt OD 4
|
||||
.Os FreeBSD
|
||||
.Sh NAME
|
||||
.Nm od
|
||||
.Nd SCSI optical disk driver
|
||||
.Sh SYNOPSIS
|
||||
.Cd device od
|
||||
.Cd device od1 at scbus0 target 3 lun 0
|
||||
.Pp
|
||||
To use a drive which returns bogus ASC/ASCQ values:
|
||||
.Cd options OD_BOGUS_NOT_READY
|
||||
.Pp
|
||||
To enable an automatic spindown:
|
||||
.Cd options OD_AUTO_TURNOFF
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
driver provides support for a
|
||||
.Em SCSI
|
||||
optical disk (AKA. Magneto-Optical or Phase change optical Disk) drive.
|
||||
It enables the media change operation and the disk to be divided
|
||||
up into a set of pseudo devices called
|
||||
.Em partitions .
|
||||
A partition has both a
|
||||
.Em raw
|
||||
interface
|
||||
and a
|
||||
.Em block mode
|
||||
interface.
|
||||
In general the interfaces are similar to those described by
|
||||
.Xr wd 4
|
||||
and
|
||||
.Xr sd 4 .
|
||||
.Pp
|
||||
As the SCSI adapter is probed during boot, the
|
||||
.Em SCSI
|
||||
bus is scanned for devices. Any devices found which answered as
|
||||
.Sq Em Optical
|
||||
and
|
||||
.Sq Em removable
|
||||
type device will be attached to the
|
||||
.Nm
|
||||
driver.
|
||||
In
|
||||
.Fx 2.1.5
|
||||
or later, the first device found will be attached as
|
||||
.Em od0
|
||||
and the next,
|
||||
.Em od1 ,
|
||||
and so on.
|
||||
It is possible to specify which od unit a device should
|
||||
come on line as; refer to
|
||||
.Xr scsi 4
|
||||
for details on kernel configuration.
|
||||
Beginning in
|
||||
.Fx 2.2
|
||||
the
|
||||
.Nm
|
||||
driver can handle any device which answers as being type
|
||||
.Sq Em Direct
|
||||
and
|
||||
.Sq Em removable
|
||||
as well as
|
||||
.Sq Em Optical
|
||||
and
|
||||
.Sq Em removable
|
||||
type devices.
|
||||
.Sh PARTITIONING
|
||||
The
|
||||
.Nm
|
||||
driver allows the disk to have two levels of partitioning.
|
||||
One layer, called the
|
||||
.Dq slice layer ,
|
||||
is used to separate the
|
||||
.Tn FreeBSD
|
||||
areas of the disk from areas used by other operating systems.
|
||||
The second layer is the native
|
||||
.Bx 4.4
|
||||
partitioning scheme,
|
||||
.Xr disklabel 5 ,
|
||||
which is used to subdivide the
|
||||
.Tn FreeBSD
|
||||
slices into areas for individual filesystems.
|
||||
For more information, see
|
||||
.Xr fdisk 8
|
||||
and
|
||||
.Xr disklabel 8 ,
|
||||
respectively.
|
||||
.Pp
|
||||
If an uninitialized disk is opened, the slice table will be
|
||||
initialized with a fictitious
|
||||
.Tn FreeBSD
|
||||
slice spanning the entire disk. Similarly, if an uninitialized
|
||||
(or
|
||||
.No non- Ns Tn FreeBSD )
|
||||
slice is opened, its disklabel will be initialized with parameters
|
||||
returned by the drive and a single
|
||||
.Sq Li c
|
||||
partition encompassing the entire slice.
|
||||
.Sh KERNEL CONFIGURATION
|
||||
Only one
|
||||
.Nm
|
||||
device is necessary in the config file; data structures are dynamically
|
||||
allocated as disks are found on the
|
||||
.Tn SCSI
|
||||
bus.
|
||||
.Sh IOCTLS
|
||||
The following
|
||||
.Xr ioctl 2
|
||||
calls apply to optical disks as well as to other disks.
|
||||
They are defined in the header file
|
||||
.Aq Pa sys/disklabel.h .
|
||||
.Pp
|
||||
.Bl -tag -width CDIOCPREVENT
|
||||
.It Dv DIOCSBAD
|
||||
Usually used to set up a bad-block mapping system on the disk. SCSI
|
||||
drives incorporate their own bad-block mapping so this is not
|
||||
implemented, however it MAY be implemented in the future as a 'kludged'
|
||||
interface to the SCSI bad-block mapping.
|
||||
.It Dv DIOCGDINFO
|
||||
Read the in-core copy of the disklabel for the
|
||||
drive from the kernel. This may be a fictitious disklabel if the drive
|
||||
has never been initialised, in which case it will contain information read
|
||||
from the SCSI inquiry commands, and should be the same as
|
||||
the information printed at boot.
|
||||
.It Dv DIOCSDINFO
|
||||
Give the driver a new disklabel to use. The driver will NOT try write
|
||||
the new disklabel to the disk.
|
||||
.It Dv DIOCWLABEL
|
||||
Enable or Disable the driver's software write protect of the disklabel
|
||||
on the disk.
|
||||
.It Dv DIOCWDINFO
|
||||
Give the driver a new disklabel to use. The driver WILL try write the
|
||||
new disklabel to the disk.
|
||||
.El
|
||||
.Pp
|
||||
And the following
|
||||
.Xr ioctl 2
|
||||
calls which apply to optical disks are defined in the header file
|
||||
.Aq Pa sys/cdio.h .
|
||||
.Bl -tag -width CDIOCPREVENT
|
||||
.It Dv CDIOCEJECT
|
||||
Eject the optical disk media.
|
||||
.It Dv CDIOCALLOW
|
||||
Tell the drive to allow manual ejection of the optical disk media.
|
||||
.It Dv CDIOCPREVENT
|
||||
Tell the drive to prevent manual ejection of the optical disk media.
|
||||
.El
|
||||
.Pp
|
||||
In addition, the
|
||||
.Xr scsi 4
|
||||
general ioctls may be used with the
|
||||
.Nm
|
||||
driver, but only against the fourth (whole disk) partition.
|
||||
.Sh NOTES
|
||||
Currently the
|
||||
.Nm
|
||||
driver accepts 512, 1024 and 2048 byte/sector media.
|
||||
Raw and block mode device access to non-512 byte/sector media
|
||||
would be allowed only on each sector size boundary start position and
|
||||
I/O size.
|
||||
.Sh FILES
|
||||
.Bl -tag -width /dev/rodXXXXX -compact
|
||||
.It Pa /dev/rod Ns Ar u
|
||||
raw mode
|
||||
.Tn SCSI
|
||||
optical disk unit
|
||||
.Ar u ,
|
||||
accessed as an unpartitioned device
|
||||
.Sm off
|
||||
.It Pa /dev/od Ar u Pa s Ar n
|
||||
.Sm on
|
||||
block mode
|
||||
.Tn SCSI
|
||||
optical disk unit
|
||||
.Ar u ,
|
||||
slice
|
||||
.Ar n ,
|
||||
accessed as an unpartitioned device
|
||||
.Sm off
|
||||
.It Pa /dev/rod Ar u Pa s Ar n
|
||||
.Sm on
|
||||
raw mode
|
||||
.Tn SCSI
|
||||
optical disk unit
|
||||
.Ar u ,
|
||||
slice
|
||||
.ar n ,
|
||||
accessed as an unpartitioned device
|
||||
.It Pa /dev/od Ns Ar u Ns Ar p
|
||||
block mode
|
||||
.Tn SCSI
|
||||
optical disk unit
|
||||
.Ar u ,
|
||||
first
|
||||
.Tn FreeBSD
|
||||
slice, partition
|
||||
.Ar p
|
||||
.It Pa /dev/rod Ns Ar u Ns Ar p
|
||||
raw mode
|
||||
.Tn SCSI
|
||||
optical disk unit
|
||||
.Ar u ,
|
||||
first
|
||||
.Tn FreeBSD
|
||||
slice, partition
|
||||
.Ar p
|
||||
.Sm off
|
||||
.It Xo
|
||||
.Pa /dev/od Ar u Pa s Ar n Ar p
|
||||
.Xc
|
||||
.Sm on
|
||||
block mode
|
||||
.Tn SCSI
|
||||
optical disk unit
|
||||
.Ar u ,
|
||||
.No Ar n Ns th
|
||||
slice, partition
|
||||
.Ar p
|
||||
.Sm off
|
||||
.It Xo
|
||||
.Pa /dev/rod Ar u Pa s Ar n Ar p
|
||||
.Xc
|
||||
raw mode
|
||||
.Tn SCSI
|
||||
optical disk unit
|
||||
.Ar u ,
|
||||
.No Ar n Ns th
|
||||
slice, partition
|
||||
.Ar p
|
||||
.Sm off
|
||||
.It Xo
|
||||
.Pa /dev/rod Ar u Pa .ctl
|
||||
.Xc
|
||||
the control device unit
|
||||
.Ar u ,
|
||||
as being used by
|
||||
.Xr scsi 8
|
||||
.El
|
||||
.Sh DIAGNOSTICS
|
||||
None.
|
||||
.Sh SEE ALSO
|
||||
.Xr fdisk 1 ,
|
||||
.Xr scsi 4 ,
|
||||
.Xr sd 4 ,
|
||||
.Xr cd 4 ,
|
||||
.Xr disklabel 5 ,
|
||||
.Xr disklabel 8
|
||||
.Sh AUTHOR
|
||||
Shunsuke Akiyama <[email protected]>
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
driver first appeared in
|
||||
.Fx 2.1.5 .
|
||||
@@ -1,89 +0,0 @@
|
||||
# $Id: ru_SU.KOI8-R.src,v 1.7 1997/02/22 13:56:47 peter Exp $
|
||||
#
|
||||
# Choi Jun Ho <jazz.snu.ac.kr>
|
||||
# 27 Mar 1997
|
||||
#
|
||||
# WARNING: spaces may be essential at the end of lines
|
||||
# WARNING: empty lines are essential too
|
||||
#
|
||||
# Short month names
|
||||
# it must be 3 char
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10
|
||||
11
|
||||
12
|
||||
#
|
||||
# Long month names
|
||||
#
|
||||
1월
|
||||
2월
|
||||
3월
|
||||
4월
|
||||
5월
|
||||
6월
|
||||
7월
|
||||
8월
|
||||
9월
|
||||
10월
|
||||
11월
|
||||
12월
|
||||
#
|
||||
# Short weekday names
|
||||
#
|
||||
# it must be 3 char also
|
||||
# two char is our weekday name, and be careful one space is in the last
|
||||
일
|
||||
월
|
||||
화
|
||||
수
|
||||
목
|
||||
금
|
||||
토
|
||||
#
|
||||
# Long weekday names
|
||||
#
|
||||
일요일
|
||||
월요일
|
||||
화요일
|
||||
수요일
|
||||
목요일
|
||||
금요일
|
||||
토요일
|
||||
#
|
||||
# X_fmt
|
||||
#
|
||||
%H시 %M분 %S초
|
||||
#
|
||||
# x_fmt
|
||||
#
|
||||
%y/%m/%d
|
||||
#
|
||||
# c_fmt
|
||||
#
|
||||
# just following tradition...
|
||||
# %Y년 %b월 %e일 %a요일 %X
|
||||
%a %b %e %H:%M:%S %Y
|
||||
#
|
||||
# am
|
||||
#
|
||||
# it must be 2 char
|
||||
#오전
|
||||
AM
|
||||
#
|
||||
# pm
|
||||
#
|
||||
# it must be 2 char
|
||||
#오후
|
||||
PM
|
||||
#
|
||||
# date_fmt
|
||||
#
|
||||
%Y년 %b월 %e일 %a요일 %X %Z
|
||||
+4
-4
@@ -32,11 +32,11 @@
|
||||
# SUCH DAMAGE.
|
||||
#
|
||||
# @(#)newvers.sh 8.1 (Berkeley) 4/20/94
|
||||
# $Id: newvers.sh,v 1.26.2.11 1997/04/15 05:29:32 asami Exp $
|
||||
# $Id: newvers.sh,v 1.26.2.13 1997/05/16 09:21:47 jkh Exp $
|
||||
|
||||
TYPE="FreeBSD"
|
||||
REVISION="2.2"
|
||||
BRANCH="STABLE"
|
||||
REVISION="2.2.2"
|
||||
BRANCH="RELEASE"
|
||||
RELEASE="${REVISION}-${BRANCH}"
|
||||
SNAPDATE=""
|
||||
if [ "X${SNAPDATE}" != "X" ]; then
|
||||
@@ -44,7 +44,7 @@ if [ "X${SNAPDATE}" != "X" ]; then
|
||||
fi
|
||||
VERSION="${TYPE} ${RELEASE}"
|
||||
|
||||
RELDATE="221002"
|
||||
RELDATE="222000"
|
||||
|
||||
b=share/examples/etc/bsd-style-copyright
|
||||
year=`date '+%Y'`
|
||||
|
||||
@@ -1,482 +0,0 @@
|
||||
/*
|
||||
* Aic7xxx SCSI host adapter firmware asssembler
|
||||
*
|
||||
* Copyright (c) 1997 Justin T. Gibbs.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice immediately at the beginning of the file, without modification,
|
||||
* this list of conditions, and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: aic7xxx_asm.c,v 1.12.6.2 1997/03/18 19:19:10 gibbs Exp $
|
||||
*/
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "aic7xxx_asm.h"
|
||||
#include "symbol.h"
|
||||
#include "sequencer.h"
|
||||
|
||||
static void usage __P((void));
|
||||
static void back_patch __P((void));
|
||||
static void output_code __P((FILE *ofile));
|
||||
static void output_listing __P((FILE *listfile, char *ifilename,
|
||||
char *options));
|
||||
static struct patch *next_patch __P((struct patch *cur_patch, int options,
|
||||
int instrptr));
|
||||
|
||||
struct path_list search_path;
|
||||
int includes_search_curdir;
|
||||
char *appname;
|
||||
FILE *ofile;
|
||||
char *ofilename;
|
||||
|
||||
static STAILQ_HEAD(,instruction) seq_program;
|
||||
static STAILQ_HEAD(, patch) patch_list;
|
||||
symlist_t patch_options;
|
||||
|
||||
#if DEBUG
|
||||
extern int yy_flex_debug;
|
||||
extern int yydebug;
|
||||
#endif
|
||||
extern FILE *yyin;
|
||||
extern int yyparse __P((void));
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
int ch;
|
||||
int retval;
|
||||
char *inputfilename;
|
||||
char *regfilename;
|
||||
FILE *regfile;
|
||||
char *listfilename;
|
||||
FILE *listfile;
|
||||
char *options;
|
||||
|
||||
SLIST_INIT(&search_path);
|
||||
STAILQ_INIT(&seq_program);
|
||||
STAILQ_INIT(&patch_list);
|
||||
SLIST_INIT(&patch_options);
|
||||
includes_search_curdir = 1;
|
||||
appname = *argv;
|
||||
regfile = NULL;
|
||||
listfile = NULL;
|
||||
options = NULL;
|
||||
#if DEBUG
|
||||
yy_flex_debug = 0;
|
||||
#endif
|
||||
while ((ch = getopt(argc, argv, "d:l:n:o:r:I:O:")) != -1) {
|
||||
switch(ch) {
|
||||
case 'd':
|
||||
#if DEBUG
|
||||
if (strcmp(optarg, "s") == 0)
|
||||
yy_flex_debug = 1;
|
||||
else if (strcmp(optarg, "p") == 0)
|
||||
yydebug = 1;
|
||||
#else
|
||||
stop("-d: Assembler not built with debugging "
|
||||
"information", EX_SOFTWARE);
|
||||
#endif
|
||||
break;
|
||||
case 'l':
|
||||
/* Create a program listing */
|
||||
if ((listfile = fopen(optarg, "w")) == NULL) {
|
||||
perror(optarg);
|
||||
stop(NULL, EX_CANTCREAT);
|
||||
}
|
||||
listfilename = optarg;
|
||||
break;
|
||||
case 'n':
|
||||
/* Don't complain about the -nostdinc directrive */
|
||||
if (strcmp(optarg, "ostdinc")) {
|
||||
fprintf(stderr, "%s: Unknown option -%c%s\n",
|
||||
appname, ch, optarg);
|
||||
usage();
|
||||
/* NOTREACHED */
|
||||
}
|
||||
break;
|
||||
case 'o':
|
||||
if ((ofile = fopen(optarg, "w")) == NULL) {
|
||||
perror(optarg);
|
||||
stop(NULL, EX_CANTCREAT);
|
||||
}
|
||||
ofilename = optarg;
|
||||
break;
|
||||
case 'O':
|
||||
/* Patches to include in the listing */
|
||||
options = optarg;
|
||||
break;
|
||||
case 'r':
|
||||
if ((regfile = fopen(optarg, "w")) == NULL) {
|
||||
perror(optarg);
|
||||
stop(NULL, EX_CANTCREAT);
|
||||
}
|
||||
regfilename = optarg;
|
||||
break;
|
||||
case 'I':
|
||||
{
|
||||
path_entry_t include_dir;
|
||||
|
||||
if (strcmp(optarg, "-") == 0) {
|
||||
if (includes_search_curdir == 0) {
|
||||
fprintf(stderr, "%s: Warning - '-I-' "
|
||||
"specified multiple "
|
||||
"times\n", appname);
|
||||
}
|
||||
includes_search_curdir = 0;
|
||||
for (include_dir = search_path.slh_first;
|
||||
include_dir != NULL;
|
||||
include_dir = include_dir->links.sle_next)
|
||||
/*
|
||||
* All entries before a '-I-' only
|
||||
* apply to includes specified with
|
||||
* quotes instead of "<>".
|
||||
*/
|
||||
include_dir->quoted_includes_only = 1;
|
||||
} else {
|
||||
include_dir =
|
||||
(path_entry_t)malloc(sizeof(*include_dir));
|
||||
if (include_dir == NULL) {
|
||||
perror(optarg);
|
||||
stop(NULL, EX_OSERR);
|
||||
}
|
||||
include_dir->directory = strdup(optarg);
|
||||
if (include_dir->directory == NULL) {
|
||||
perror(optarg);
|
||||
stop(NULL, EX_OSERR);
|
||||
}
|
||||
include_dir->quoted_includes_only = 0;
|
||||
SLIST_INSERT_HEAD(&search_path, include_dir,
|
||||
links);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case '?':
|
||||
default:
|
||||
usage();
|
||||
/* NOTREACHED */
|
||||
}
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if (argc != 1) {
|
||||
fprintf(stderr, "%s: No input file specifiled\n", appname);
|
||||
usage();
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
symtable_open();
|
||||
inputfilename = *argv;
|
||||
include_file(*argv, SOURCE_FILE);
|
||||
retval = yyparse();
|
||||
if (retval == 0) {
|
||||
back_patch();
|
||||
if (ofile != NULL)
|
||||
output_code(ofile);
|
||||
if (regfile != NULL)
|
||||
symtable_dump(regfile);
|
||||
if (listfile != NULL)
|
||||
output_listing(listfile, inputfilename, options);
|
||||
}
|
||||
|
||||
stop(NULL, 0);
|
||||
/* NOTREACHED */
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
usage()
|
||||
{
|
||||
|
||||
(void)fprintf(stderr,
|
||||
"usage: %-16s [-nostdinc] [-I-] [-I directory] [-o output_file]
|
||||
[-r register_output_file] [-l program_list_file]
|
||||
[-O option_name[|options_name2]] input_file\n",
|
||||
appname);
|
||||
exit(EX_USAGE);
|
||||
}
|
||||
|
||||
static void
|
||||
back_patch()
|
||||
{
|
||||
struct instruction *cur_instr;
|
||||
|
||||
for(cur_instr = seq_program.stqh_first;
|
||||
cur_instr != NULL;
|
||||
cur_instr = cur_instr->links.stqe_next) {
|
||||
if (cur_instr->patch_label != NULL) {
|
||||
struct ins_format3 *f3_instr;
|
||||
u_int address;
|
||||
|
||||
if (cur_instr->patch_label->type != LABEL) {
|
||||
char buf[255];
|
||||
|
||||
snprintf(buf, sizeof(buf),
|
||||
"Undefined label %s",
|
||||
cur_instr->patch_label->name);
|
||||
stop(buf, EX_DATAERR);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
f3_instr = &cur_instr->format.format3;
|
||||
address = ((f3_instr->opcode_addr & ADDR_HIGH_BIT) << 8)
|
||||
| f3_instr->address;
|
||||
address += cur_instr->patch_label->info.linfo->address;
|
||||
f3_instr->opcode_addr &= ~ADDR_HIGH_BIT;
|
||||
f3_instr->opcode_addr |= (address >> 8) & ADDR_HIGH_BIT;
|
||||
f3_instr->address = address & 0xFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
output_code(ofile)
|
||||
FILE *ofile;
|
||||
{
|
||||
struct instruction *cur_instr;
|
||||
patch_t *cur_patch;
|
||||
symbol_node_t *cur_node;
|
||||
int instrcount;
|
||||
|
||||
instrcount = 0;
|
||||
fprintf(ofile,
|
||||
"/*
|
||||
* DO NOT EDIT - This file is automatically generated.
|
||||
*/\n");
|
||||
|
||||
fprintf(ofile, "static u_int8_t seqprog[] = {\n");
|
||||
for(cur_instr = seq_program.stqh_first;
|
||||
cur_instr != NULL;
|
||||
cur_instr = cur_instr->links.stqe_next) {
|
||||
fprintf(ofile, "\t0x%02x, 0x%02x, 0x%02x, 0x%02x,\n",
|
||||
cur_instr->format.bytes[0],
|
||||
cur_instr->format.bytes[1],
|
||||
cur_instr->format.bytes[2],
|
||||
cur_instr->format.bytes[3]);
|
||||
instrcount++;
|
||||
}
|
||||
fprintf(ofile, "};\n");
|
||||
|
||||
/*
|
||||
* Output the patch list, option definitions first.
|
||||
*/
|
||||
for(cur_node = patch_options.slh_first;
|
||||
cur_node != NULL;
|
||||
cur_node = cur_node->links.sle_next) {
|
||||
fprintf(ofile, "#define\t%-16s\t0x%x\n", cur_node->symbol->name,
|
||||
cur_node->symbol->info.condinfo->value);
|
||||
}
|
||||
|
||||
fprintf(ofile,
|
||||
"struct patch {
|
||||
int options;
|
||||
int negative;
|
||||
int begin;
|
||||
int end;
|
||||
} patches[] = {\n");
|
||||
|
||||
for(cur_patch = patch_list.stqh_first;
|
||||
cur_patch != NULL;
|
||||
cur_patch = cur_patch->links.stqe_next)
|
||||
|
||||
fprintf(ofile, "\t{ 0x%08x, %d, 0x%03x, 0x%03x },\n",
|
||||
cur_patch->options, cur_patch->negative, cur_patch->begin,
|
||||
cur_patch->end);
|
||||
|
||||
fprintf(ofile, "\t{ 0x%08x, %d, 0x%03x, 0x%03x }\n};\n",
|
||||
0, 0, 0, 0);
|
||||
|
||||
fprintf(stderr, "%s: %d instructions used\n", appname, instrcount);
|
||||
}
|
||||
|
||||
void
|
||||
output_listing(listfile, ifilename, patches)
|
||||
FILE *listfile;
|
||||
char *ifilename;
|
||||
char *patches;
|
||||
{
|
||||
FILE *ifile;
|
||||
int line;
|
||||
struct instruction *cur_instr;
|
||||
int instrcount;
|
||||
int instrptr;
|
||||
char buf[1024];
|
||||
patch_t *cur_patch;
|
||||
char *option_spec;
|
||||
int options;
|
||||
|
||||
instrcount = 0;
|
||||
instrptr = 0;
|
||||
line = 1;
|
||||
options = 1; /* All code outside of patch blocks */
|
||||
if ((ifile = fopen(ifilename, "r")) == NULL) {
|
||||
perror(ifilename);
|
||||
stop(NULL, EX_DATAERR);
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine which options to apply to this listing.
|
||||
*/
|
||||
while ((option_spec = strsep(&patches, "|")) != NULL) {
|
||||
symbol_t *symbol;
|
||||
|
||||
symbol = symtable_get(option_spec);
|
||||
if (symbol->type != CONDITIONAL) {
|
||||
stop("Invalid option specified in patch list for "
|
||||
"program listing", EX_USAGE);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
options |= symbol->info.condinfo->value;
|
||||
}
|
||||
|
||||
cur_patch = patch_list.stqh_first;
|
||||
for(cur_instr = seq_program.stqh_first;
|
||||
cur_instr != NULL;
|
||||
cur_instr = cur_instr->links.stqe_next,instrcount++) {
|
||||
|
||||
cur_patch = next_patch(cur_patch, options, instrcount);
|
||||
if (cur_patch
|
||||
&& cur_patch->begin <= instrcount
|
||||
&& cur_patch->end > instrcount)
|
||||
/* Don't count this instruction as it is in a patch
|
||||
* that was removed.
|
||||
*/
|
||||
continue;
|
||||
|
||||
while (line < cur_instr->srcline) {
|
||||
fgets(buf, sizeof(buf), ifile);
|
||||
fprintf(listfile, "\t\t%s", buf);
|
||||
line++;
|
||||
}
|
||||
fprintf(listfile, "%03x %02x%02x%02x%02x", instrptr,
|
||||
cur_instr->format.bytes[0],
|
||||
cur_instr->format.bytes[1],
|
||||
cur_instr->format.bytes[2],
|
||||
cur_instr->format.bytes[3]);
|
||||
fgets(buf, sizeof(buf), ifile);
|
||||
fprintf(listfile, "\t%s", buf);
|
||||
line++;
|
||||
instrptr++;
|
||||
}
|
||||
/* Dump the remainder of the file */
|
||||
while(fgets(buf, sizeof(buf), ifile) != NULL)
|
||||
fprintf(listfile, "\t\t%s", buf);
|
||||
|
||||
fclose(ifile);
|
||||
}
|
||||
|
||||
static struct patch *
|
||||
next_patch(cur_patch, options, instrptr)
|
||||
struct patch *cur_patch;
|
||||
int options;
|
||||
int instrptr;
|
||||
{
|
||||
while(cur_patch != NULL) {
|
||||
if (((cur_patch->options & options) != 0
|
||||
&& cur_patch->negative == FALSE)
|
||||
|| ((cur_patch->options & options) == 0
|
||||
&& cur_patch->negative == TRUE)
|
||||
|| (instrptr >= cur_patch->end)) {
|
||||
/*
|
||||
* Either we want to keep this section of code,
|
||||
* or we have consumed this patch. Skip to the
|
||||
* next patch.
|
||||
*/
|
||||
cur_patch = cur_patch->links.stqe_next;
|
||||
} else
|
||||
/* Found an okay patch */
|
||||
break;
|
||||
}
|
||||
return (cur_patch);
|
||||
}
|
||||
|
||||
/*
|
||||
* Print out error information if appropriate, and clean up before
|
||||
* terminating the program.
|
||||
*/
|
||||
void
|
||||
stop(string, err_code)
|
||||
const char *string;
|
||||
int err_code;
|
||||
{
|
||||
if (string != NULL) {
|
||||
fprintf(stderr, "%s: ", appname);
|
||||
if (yyfilename != NULL) {
|
||||
fprintf(stderr, "Stopped at file %s, line %d - ",
|
||||
yyfilename, yylineno);
|
||||
}
|
||||
fprintf(stderr, "%s\n", string);
|
||||
}
|
||||
|
||||
if (ofile != NULL) {
|
||||
fclose(ofile);
|
||||
if (err_code != 0) {
|
||||
fprintf(stderr, "%s: Removing %s due to error\n",
|
||||
appname, ofilename);
|
||||
unlink(ofilename);
|
||||
}
|
||||
}
|
||||
|
||||
symlist_free(&patch_options);
|
||||
symtable_close();
|
||||
|
||||
exit(err_code);
|
||||
}
|
||||
|
||||
struct instruction *
|
||||
seq_alloc()
|
||||
{
|
||||
struct instruction *new_instr;
|
||||
|
||||
new_instr = (struct instruction *)malloc(sizeof(struct instruction));
|
||||
if (new_instr == NULL)
|
||||
stop("Unable to malloc instruction object", EX_SOFTWARE);
|
||||
memset(new_instr, 0, sizeof(*new_instr));
|
||||
STAILQ_INSERT_TAIL(&seq_program, new_instr, links);
|
||||
new_instr->srcline = yylineno;
|
||||
return new_instr;
|
||||
}
|
||||
|
||||
patch_t *
|
||||
patch_alloc()
|
||||
{
|
||||
patch_t *new_patch;
|
||||
|
||||
new_patch = (patch_t *)malloc(sizeof(patch_t));
|
||||
if (new_patch == NULL)
|
||||
stop("Unable to malloc patch object", EX_SOFTWARE);
|
||||
memset(new_patch, 0, sizeof(*new_patch));
|
||||
STAILQ_INSERT_TAIL(&patch_list, new_patch, links);
|
||||
return new_patch;
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
/*
|
||||
* Assembler for the sequencer program downloaded to Aic7xxx SCSI host adapters
|
||||
*
|
||||
* Copyright (c) 1997 Justin T. Gibbs.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice immediately at the beginning of the file, without modification,
|
||||
* this list of conditions, and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <sys/queue.h>
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
typedef struct path_entry {
|
||||
char *directory;
|
||||
int quoted_includes_only;
|
||||
SLIST_ENTRY(path_entry) links;
|
||||
} *path_entry_t;
|
||||
|
||||
typedef enum {
|
||||
QUOTED_INCLUDE,
|
||||
BRACKETED_INCLUDE,
|
||||
SOURCE_FILE
|
||||
} include_type;
|
||||
|
||||
SLIST_HEAD(path_list, path_entry);
|
||||
|
||||
extern struct path_list search_path;
|
||||
extern struct symlist patch_options;
|
||||
extern int includes_search_curdir; /* False if we've seen -I- */
|
||||
extern char *appname;
|
||||
extern int yylineno;
|
||||
extern char *yyfilename;
|
||||
|
||||
void stop __P((const char *errstring, int err_code));
|
||||
void include_file __P((char *file_name, include_type type));
|
||||
struct instruction *seq_alloc __P((void));
|
||||
struct patch *patch_alloc __P((void));
|
||||
File diff suppressed because it is too large.
Load diff
Loaded 100 of 127 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user