patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
499 lines
17 KiB
Diff
499 lines
17 KiB
Diff
Index: contrib/cpio/copyin.c
|
|
===================================================================
|
|
RCS file: /home/ncvs/src/contrib/cpio/Attic/copyin.c,v
|
|
retrieving revision 1.7
|
|
diff -u -d -r1.7 copyin.c
|
|
--- contrib/cpio/copyin.c 21 Mar 2001 21:17:54 -0000 1.7
|
|
+++ contrib/cpio/copyin.c 3 Jan 2006 22:01:58 -0000
|
|
@@ -46,6 +46,19 @@
|
|
#define lchown chown
|
|
#endif
|
|
|
|
+# ifndef DIRECTORY_SEPARATOR
|
|
+# define DIRECTORY_SEPARATOR '/'
|
|
+# endif
|
|
+
|
|
+# ifndef ISSLASH
|
|
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
|
|
+# endif
|
|
+
|
|
+# ifndef FILE_SYSTEM_PREFIX_LEN
|
|
+# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
|
|
+# endif
|
|
+
|
|
+
|
|
static void read_pattern_file ();
|
|
static void tape_skip_padding ();
|
|
static void defer_copyin ();
|
|
@@ -376,6 +389,54 @@
|
|
/* Current time for verbose table. */
|
|
static time_t current_time;
|
|
|
|
+/* Return a safer suffix of FILE_NAME, or "." if it has no safer
|
|
+ suffix. Check for fully specified file names and other atrocities. */
|
|
+
|
|
+static const char *
|
|
+safer_name_suffix (char const *file_name)
|
|
+{
|
|
+ char const *p;
|
|
+
|
|
+ /* Skip file system prefixes, leading file name components that contain
|
|
+ "..", and leading slashes. */
|
|
+
|
|
+ size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (file_name);
|
|
+
|
|
+ for (p = file_name + prefix_len; *p;)
|
|
+ {
|
|
+ if (p[0] == '.' && p[1] == '.' && (ISSLASH (p[2]) || !p[2]))
|
|
+ prefix_len = p + 2 - file_name;
|
|
+
|
|
+ do
|
|
+ {
|
|
+ char c = *p++;
|
|
+ if (ISSLASH (c))
|
|
+ break;
|
|
+ }
|
|
+ while (*p);
|
|
+ }
|
|
+
|
|
+ for (p = file_name + prefix_len; ISSLASH (*p); p++)
|
|
+ continue;
|
|
+ prefix_len = p - file_name;
|
|
+
|
|
+ if (prefix_len)
|
|
+ {
|
|
+ char *prefix = alloca (prefix_len + 1);
|
|
+ memcpy (prefix, file_name, prefix_len);
|
|
+ prefix[prefix_len] = '\0';
|
|
+
|
|
+
|
|
+ error (0, 0, "Removing leading `%s' from member names", prefix);
|
|
+ }
|
|
+
|
|
+ if (!*p)
|
|
+ p = ".";
|
|
+
|
|
+ return p;
|
|
+}
|
|
+
|
|
+
|
|
/* Read the collection from standard input and create files
|
|
in the file system. */
|
|
|
|
@@ -396,6 +457,7 @@
|
|
int in_file_des; /* Input file descriptor. */
|
|
char skip_file; /* Flag for use with patterns. */
|
|
int existing_dir; /* True if file is a dir & already exists. */
|
|
+ mode_t existing_mode;
|
|
int i; /* Loop index variable. */
|
|
char *link_name = NULL; /* Name of hard and symbolic links. */
|
|
#ifdef HPUX_CDF
|
|
@@ -494,18 +556,11 @@
|
|
|
|
/* Do we have to ignore absolute paths, and if so, does the filename
|
|
have an absolute path? */
|
|
- if (no_abs_paths_flag && file_hdr.c_name && file_hdr.c_name [0] == '/')
|
|
+ if (!abs_paths_flag && file_hdr.c_name && file_hdr.c_name[0])
|
|
{
|
|
- char *p;
|
|
+ const char *p = safer_name_suffix (file_hdr.c_name);
|
|
|
|
- p = file_hdr.c_name;
|
|
- while (*p == '/')
|
|
- ++p;
|
|
- if (*p == '\0')
|
|
- {
|
|
- strcpy (file_hdr.c_name, ".");
|
|
- }
|
|
- else
|
|
+ if (p != file_hdr.c_name)
|
|
{
|
|
char *non_abs_name;
|
|
|
|
@@ -642,6 +697,7 @@
|
|
we are trying to create, don't complain about
|
|
it. */
|
|
existing_dir = TRUE;
|
|
+ existing_mode = file_stat.st_mode;
|
|
}
|
|
else if (!unconditional_flag
|
|
&& file_hdr.c_mtime <= file_stat.st_mtime)
|
|
@@ -778,8 +834,6 @@
|
|
}
|
|
copy_files_tape_to_disk (in_file_des, out_file_des, file_hdr.c_filesize);
|
|
disk_empty_output_buffer (out_file_des);
|
|
- if (close (out_file_des) < 0)
|
|
- error (0, errno, "%s", file_hdr.c_name);
|
|
|
|
if (archive_format == arf_crcascii)
|
|
{
|
|
@@ -789,13 +843,15 @@
|
|
}
|
|
/* File is now copied; set attributes. */
|
|
if (!no_chown_flag)
|
|
- if ((chown (file_hdr.c_name,
|
|
+ if ((fchown (out_file_des,
|
|
set_owner_flag ? set_owner : file_hdr.c_uid,
|
|
set_group_flag ? set_group : file_hdr.c_gid) < 0)
|
|
&& errno != EPERM)
|
|
error (0, errno, "%s", file_hdr.c_name);
|
|
/* chown may have turned off some permissions we wanted. */
|
|
- if (chmod (file_hdr.c_name, (int) file_hdr.c_mode) < 0)
|
|
+ if (fchmod (out_file_des, (int) file_hdr.c_mode) < 0)
|
|
+ error (0, errno, "%s", file_hdr.c_name);
|
|
+ if (close (out_file_des) < 0)
|
|
error (0, errno, "%s", file_hdr.c_name);
|
|
if (retain_time_flag)
|
|
{
|
|
@@ -847,14 +903,23 @@
|
|
cdf_flag = 1;
|
|
}
|
|
#endif
|
|
- res = mkdir (file_hdr.c_name, file_hdr.c_mode);
|
|
+ res = mkdir (file_hdr.c_name, file_hdr.c_mode & ~077);
|
|
}
|
|
else
|
|
- res = 0;
|
|
+ {
|
|
+ if (!no_chown_flag && (existing_mode & 077) != 0
|
|
+ && chmod (file_hdr.c_name, existing_mode & 07700) < 0)
|
|
+ {
|
|
+ error (0, errno, "%s: chmod", file_hdr.c_name);
|
|
+ return;
|
|
+ }
|
|
+ res = 0;
|
|
+ }
|
|
+
|
|
if (res < 0 && create_dir_flag)
|
|
{
|
|
create_all_directories (file_hdr.c_name);
|
|
- res = mkdir (file_hdr.c_name, file_hdr.c_mode);
|
|
+ res = mkdir (file_hdr.c_name, file_hdr.c_mode & ~077);
|
|
}
|
|
if (res < 0)
|
|
{
|
|
@@ -936,20 +1001,20 @@
|
|
|
|
#ifdef CP_IFIFO
|
|
if ((file_hdr.c_mode & CP_IFMT) == CP_IFIFO)
|
|
- res = mkfifo (file_hdr.c_name, file_hdr.c_mode);
|
|
+ res = mkfifo (file_hdr.c_name, file_hdr.c_mode & ~077);
|
|
else
|
|
#endif
|
|
- res = mknod (file_hdr.c_name, file_hdr.c_mode,
|
|
+ res = mknod (file_hdr.c_name, file_hdr.c_mode & ~077,
|
|
makedev (file_hdr.c_rdev_maj, file_hdr.c_rdev_min));
|
|
if (res < 0 && create_dir_flag)
|
|
{
|
|
create_all_directories (file_hdr.c_name);
|
|
#ifdef CP_IFIFO
|
|
if ((file_hdr.c_mode & CP_IFMT) == CP_IFIFO)
|
|
- res = mkfifo (file_hdr.c_name, file_hdr.c_mode);
|
|
+ res = mkfifo (file_hdr.c_name, file_hdr.c_mode & ~077);
|
|
else
|
|
#endif
|
|
- res = mknod (file_hdr.c_name, file_hdr.c_mode,
|
|
+ res = mknod (file_hdr.c_name, file_hdr.c_mode & ~077,
|
|
makedev (file_hdr.c_rdev_maj,
|
|
file_hdr.c_rdev_min));
|
|
}
|
|
@@ -1376,18 +1441,18 @@
|
|
continue;
|
|
}
|
|
|
|
- if (close (out_file_des) < 0)
|
|
- error (0, errno, "%s", d->header.c_name);
|
|
-
|
|
+
|
|
/* File is now copied; set attributes. */
|
|
if (!no_chown_flag)
|
|
- if ((chown (d->header.c_name,
|
|
+ if ((fchown (out_file_des,
|
|
set_owner_flag ? set_owner : d->header.c_uid,
|
|
set_group_flag ? set_group : d->header.c_gid) < 0)
|
|
&& errno != EPERM)
|
|
error (0, errno, "%s", d->header.c_name);
|
|
/* chown may have turned off some permissions we wanted. */
|
|
- if (chmod (d->header.c_name, (int) d->header.c_mode) < 0)
|
|
+ if (fchmod (out_file_des, (int) d->header.c_mode) < 0)
|
|
+ error (0, errno, "%s", d->header.c_name);
|
|
+ if (close (out_file_des) < 0)
|
|
error (0, errno, "%s", d->header.c_name);
|
|
if (retain_time_flag)
|
|
{
|
|
Index: contrib/cpio/copyout.c
|
|
===================================================================
|
|
RCS file: /home/ncvs/src/contrib/cpio/Attic/copyout.c,v
|
|
retrieving revision 1.2
|
|
diff -u -d -r1.2 copyout.c
|
|
--- contrib/cpio/copyout.c 30 Mar 1997 10:34:16 -0000 1.2
|
|
+++ contrib/cpio/copyout.c 3 Jan 2006 00:11:55 -0000
|
|
@@ -49,12 +49,13 @@
|
|
{
|
|
char ascii_header[112];
|
|
char *magic_string;
|
|
+ int ret;
|
|
|
|
if (archive_format == arf_crcascii)
|
|
magic_string = "070702";
|
|
else
|
|
magic_string = "070701";
|
|
- sprintf (ascii_header,
|
|
+ ret = snprintf (ascii_header, sizeof(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,
|
|
@@ -62,6 +63,10 @@
|
|
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);
|
|
+ if (ret >= sizeof(ascii_header)) {
|
|
+ fprintf(stderr, "Internal overflow, aborting\n");
|
|
+ exit (1);
|
|
+ }
|
|
tape_buffered_write (ascii_header, out_des, 110L);
|
|
|
|
/* Write file name to output. */
|
|
@@ -71,6 +76,7 @@
|
|
else if (archive_format == arf_oldascii || archive_format == arf_hpoldascii)
|
|
{
|
|
char ascii_header[78];
|
|
+ int ret;
|
|
#ifndef __MSDOS__
|
|
dev_t dev;
|
|
dev_t rdev;
|
|
@@ -112,7 +118,7 @@
|
|
if ((file_hdr->c_ino >> 16) != 0)
|
|
error (0, 0, "%s: truncating inode number", file_hdr->c_name);
|
|
|
|
- sprintf (ascii_header,
|
|
+ ret = snprintf (ascii_header, sizeof(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,
|
|
@@ -120,6 +126,10 @@
|
|
file_hdr->c_nlink & 0xFFFF, rdev & 0xFFFF,
|
|
file_hdr->c_mtime, file_hdr->c_namesize & 0xFFFF,
|
|
file_hdr->c_filesize);
|
|
+ if (ret >= sizeof(ascii_header)) {
|
|
+ fprintf(stderr, "Internal overflow, aborting\n");
|
|
+ exit (1);
|
|
+ }
|
|
tape_buffered_write (ascii_header, out_des, 76L);
|
|
|
|
/* Write file name to output. */
|
|
@@ -258,6 +268,14 @@
|
|
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;
|
|
+
|
|
+ /* Skip files larger than 4GB which will cause problems on
|
|
+ 64bit platforms (and just not work on 32bit). */
|
|
+ if (file_stat.st_size > 0xffffffff) {
|
|
+ error (0, 0, "%s: skipping >4GB file", input_name.ds_string);
|
|
+ continue;
|
|
+ }
|
|
+
|
|
/* 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
|
|
Index: contrib/cpio/copypass.c
|
|
===================================================================
|
|
RCS file: /home/ncvs/src/contrib/cpio/Attic/copypass.c,v
|
|
retrieving revision 1.3
|
|
diff -u -d -r1.3 copypass.c
|
|
--- contrib/cpio/copypass.c 11 Jul 2003 02:19:19 -0000 1.3
|
|
+++ contrib/cpio/copypass.c 3 Jan 2006 22:01:58 -0000
|
|
@@ -174,18 +174,18 @@
|
|
disk_empty_output_buffer (out_file_des);
|
|
if (close (in_file_des) < 0)
|
|
error (0, errno, "%s", input_name.ds_string);
|
|
- if (close (out_file_des) < 0)
|
|
- error (0, errno, "%s", output_name.ds_string);
|
|
|
|
/* Set the attributes of the new file. */
|
|
if (!no_chown_flag)
|
|
- if ((chown (output_name.ds_string,
|
|
+ if ((fchown (out_file_des,
|
|
set_owner_flag ? set_owner : in_file_stat.st_uid,
|
|
set_group_flag ? set_group : in_file_stat.st_gid) < 0)
|
|
&& errno != EPERM)
|
|
error (0, errno, "%s", output_name.ds_string);
|
|
/* chown may have turned off some permissions we wanted. */
|
|
- if (chmod (output_name.ds_string, in_file_stat.st_mode) < 0)
|
|
+ if (fchmod (out_file_des, in_file_stat.st_mode) < 0)
|
|
+ error (0, errno, "%s", output_name.ds_string);
|
|
+ if (close (out_file_des) < 0)
|
|
error (0, errno, "%s", output_name.ds_string);
|
|
if (reset_time_flag)
|
|
{
|
|
@@ -224,15 +224,24 @@
|
|
cdf_flag = 1;
|
|
}
|
|
#endif
|
|
- res = mkdir (output_name.ds_string, in_file_stat.st_mode);
|
|
+ res = mkdir (output_name.ds_string, in_file_stat.st_mode & ~077);
|
|
|
|
}
|
|
else
|
|
- res = 0;
|
|
+ {
|
|
+ if (!no_chown_flag && (out_file_stat.st_mode & 077) != 0
|
|
+ && chmod (output_name.ds_string, out_file_stat.st_mode & 07700) < 0)
|
|
+ {
|
|
+ error (0, errno, "%s: chmod", output_name.ds_string);
|
|
+ continue;
|
|
+ }
|
|
+ res = 0;
|
|
+ }
|
|
+
|
|
if (res < 0 && create_dir_flag)
|
|
{
|
|
create_all_directories (output_name.ds_string);
|
|
- res = mkdir (output_name.ds_string, in_file_stat.st_mode);
|
|
+ res = mkdir (output_name.ds_string, in_file_stat.st_mode & ~077);
|
|
}
|
|
if (res < 0)
|
|
{
|
|
@@ -298,20 +307,20 @@
|
|
{
|
|
#ifdef S_ISFIFO
|
|
if (S_ISFIFO (in_file_stat.st_mode))
|
|
- res = mkfifo (output_name.ds_string, in_file_stat.st_mode);
|
|
+ res = mkfifo (output_name.ds_string, in_file_stat.st_mode & ~077);
|
|
else
|
|
#endif
|
|
- res = mknod (output_name.ds_string, in_file_stat.st_mode,
|
|
+ res = mknod (output_name.ds_string, in_file_stat.st_mode & ~077,
|
|
in_file_stat.st_rdev);
|
|
if (res < 0 && create_dir_flag)
|
|
{
|
|
create_all_directories (output_name.ds_string);
|
|
#ifdef S_ISFIFO
|
|
if (S_ISFIFO (in_file_stat.st_mode))
|
|
- res = mkfifo (output_name.ds_string, in_file_stat.st_mode);
|
|
+ res = mkfifo (output_name.ds_string, in_file_stat.st_mode & ~077);
|
|
else
|
|
#endif
|
|
- res = mknod (output_name.ds_string, in_file_stat.st_mode,
|
|
+ res = mknod (output_name.ds_string, in_file_stat.st_mode & ~077,
|
|
in_file_stat.st_rdev);
|
|
}
|
|
if (res < 0)
|
|
Index: contrib/cpio/cpio.1
|
|
===================================================================
|
|
RCS file: /home/ncvs/src/contrib/cpio/Attic/cpio.1,v
|
|
retrieving revision 1.3
|
|
diff -u -d -r1.3 cpio.1
|
|
--- contrib/cpio/cpio.1 30 Aug 1997 11:01:54 -0000 1.3
|
|
+++ contrib/cpio/cpio.1 2 Jan 2006 23:36:02 -0000
|
|
@@ -19,7 +19,7 @@
|
|
[\-\-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]
|
|
+[\-\-force\-local] [\-\-absolute\-filenames] [\-\-sparse] [\-\-only\-verify\-crc]
|
|
[\-\-quiet] [\-\-help] [\-\-version] [pattern...] [< archive]
|
|
|
|
.B cpio
|
|
@@ -251,9 +251,9 @@
|
|
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.
|
|
+.I " \-\-absolute-filenames"
|
|
+Do not strip leading file name components that contain ".."
|
|
+and leading slashes from file names in copy-in mode
|
|
.TP
|
|
.I " \-\-no-preserve-owner"
|
|
In copy-in mode and copy-pass mode, do not change the ownership of the
|
|
Index: contrib/cpio/extern.h
|
|
===================================================================
|
|
RCS file: /home/ncvs/src/contrib/cpio/Attic/extern.h,v
|
|
retrieving revision 1.2
|
|
diff -u -d -r1.2 extern.h
|
|
--- contrib/cpio/extern.h 30 Mar 1997 10:45:44 -0000 1.2
|
|
+++ contrib/cpio/extern.h 2 Jan 2006 23:36:02 -0000
|
|
@@ -46,7 +46,7 @@
|
|
extern int sparse_flag;
|
|
extern int quiet_flag;
|
|
extern int only_verify_crc_flag;
|
|
-extern int no_abs_paths_flag;
|
|
+extern int abs_paths_flag;
|
|
|
|
extern int last_header_start;
|
|
extern int copy_matching_files;
|
|
Index: contrib/cpio/global.c
|
|
===================================================================
|
|
RCS file: /home/ncvs/src/contrib/cpio/Attic/global.c,v
|
|
retrieving revision 1.1.1.1
|
|
diff -u -d -r1.1.1.1 global.c
|
|
--- contrib/cpio/global.c 29 Mar 1997 22:40:44 -0000 1.1.1.1
|
|
+++ contrib/cpio/global.c 2 Jan 2006 23:36:02 -0000
|
|
@@ -98,8 +98,8 @@
|
|
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;
|
|
+/* If TRUE, allow any absolute paths */
|
|
+int abs_paths_flag = FALSE;
|
|
|
|
#ifdef DEBUG_CPIO
|
|
/* If TRUE, print debugging information. */
|
|
Index: contrib/cpio/main.c
|
|
===================================================================
|
|
RCS file: /home/ncvs/src/contrib/cpio/Attic/main.c,v
|
|
retrieving revision 1.3
|
|
diff -u -d -r1.3 main.c
|
|
--- contrib/cpio/main.c 15 Sep 1999 01:47:13 -0000 1.3
|
|
+++ contrib/cpio/main.c 2 Jan 2006 23:36:02 -0000
|
|
@@ -56,7 +56,7 @@
|
|
{"list", 0, &table_flag, TRUE},
|
|
{"make-directories", 0, &create_dir_flag, TRUE},
|
|
{"message", 1, 0, 'M'},
|
|
- {"no-absolute-filenames", 0, 0, 136},
|
|
+ {"absolute-filenames", 0, 0, 136},
|
|
{"no-preserve-owner", 0, 0, 134},
|
|
{"nonmatching", 0, ©_matching_files, FALSE},
|
|
{"numeric-uid-gid", 0, &numeric_uid, TRUE},
|
|
@@ -105,7 +105,7 @@
|
|
[--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\
|
|
+ [--force-local] [--absolute-filenames] [--sparse] [--only-verify-crc]\n\
|
|
[--quiet] [--help] [--version] [pattern...] [< archive]\n",
|
|
program_name);
|
|
fprintf (fp, "\
|
|
@@ -266,8 +266,8 @@
|
|
numeric_uid = TRUE;
|
|
break;
|
|
|
|
- case 136: /* --no-absolute-filenames */
|
|
- no_abs_paths_flag = TRUE;
|
|
+ case 136: /* --absolute-filenames */
|
|
+ abs_paths_flag = TRUE;
|
|
break;
|
|
|
|
case 134: /* --no-preserve-owner */
|
|
@@ -414,7 +414,7 @@
|
|
|| 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
|
|
+ || rename_batch_file || abs_paths_flag
|
|
|| input_archive_name || (archive_name && output_archive_name))
|
|
usage (stderr, 2);
|
|
if (archive_format == arf_unknown)
|
|
@@ -429,7 +429,7 @@
|
|
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)
|
|
+ || rename_batch_file || abs_paths_flag)
|
|
usage (stderr, 2);
|
|
directory_name = argv[optind];
|
|
}
|