OBS User unknown 2006-12-18 23:15:29 +00:00 committed by Git OBS Bridge
commit 4621b18618
18 changed files with 2423 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.osc

33
cpio-2.6-checksum.patch Normal file
View File

@ -0,0 +1,33 @@
--- cpio-2.6/src/extern.h.checksum 2005-10-26 11:17:11.000000000 +0200
+++ cpio-2.6/src/extern.h 2005-10-26 11:15:42.000000000 +0200
@@ -66,7 +66,7 @@
extern int archive_des;
extern char *archive_name;
extern char *rsh_command_option;
-extern unsigned long crc;
+extern unsigned int crc;
extern int delayed_seek_count;
#ifdef DEBUG_CPIO
extern int debug_flag;
--- cpio-2.6/src/copyout.c.checksum 2005-10-26 11:17:11.000000000 +0200
+++ cpio-2.6/src/copyout.c 2005-10-26 11:20:01.000000000 +0200
@@ -311,7 +311,7 @@
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);
+ file_hdr->c_chksum & 0xffffffff);
tape_buffered_write (ascii_header, out_des, 110L);
/* Write file name to output. */
--- cpio-2.6/src/global.c.checksum 2005-10-26 11:17:11.000000000 +0200
+++ cpio-2.6/src/global.c 2005-10-26 11:15:29.000000000 +0200
@@ -139,7 +139,7 @@
char *rsh_command_option = NULL;
/* CRC checksum. */
-unsigned long crc;
+unsigned int crc;
/* Input and output buffers. */
char *input_buffer, *output_buffer;

247
cpio-2.6-chmodRaceC.patch Normal file
View File

@ -0,0 +1,247 @@
--- cpio-2.6/src/copyin.c.chmodRaceC 2005-07-01 14:23:04.000000000 +0200
+++ cpio-2.6/src/copyin.c 2005-07-01 14:46:34.000000000 +0200
@@ -184,11 +184,12 @@
static int
try_existing_file(struct new_cpio_header* file_hdr, int in_file_des,
- int *existing_dir)
+ int *existing_dir, mode_t *existing_mode)
{
struct stat file_stat;
*existing_dir = false;
+ *existing_mode = 0;
if (lstat (file_hdr->c_name, &file_stat) == 0)
{
if (S_ISDIR (file_stat.st_mode)
@@ -198,6 +199,7 @@
we are trying to create, don't complain about
it. */
*existing_dir = true;
+ *existing_mode = file_stat.st_mode;
return 0;
}
else if (!unconditional_flag
@@ -389,19 +391,20 @@
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)
{
times.actime = times.modtime = d->header.c_mtime;
@@ -557,6 +560,19 @@
write (out_file_des, "", 1);
delayed_seek_count = 0;
}
+
+ /* File is now copied; set attributes. */
+ if (!no_chown_flag)
+ 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 (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);
@@ -567,18 +583,6 @@
file_hdr->c_name, crc, file_hdr->c_chksum);
}
- /* File is now copied; set attributes. */
- if (!no_chown_flag)
- if ((chown (file_hdr->c_name,
- 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)
- error (0, errno, "%s", file_hdr->c_name);
-
if (retain_time_flag)
{
struct utimbuf times; /* For setting file times. */
@@ -589,7 +593,7 @@
if (utime (file_hdr->c_name, &times) < 0)
error (0, errno, "%s", file_hdr->c_name);
}
-
+
tape_skip_padding (in_file_des, file_hdr->c_filesize);
if (file_hdr->c_nlink > 1
&& (archive_format == arf_newascii || archive_format == arf_crcascii) )
@@ -603,7 +607,7 @@
}
static void
-copyin_directory(struct new_cpio_header* file_hdr, int existing_dir)
+copyin_directory(struct new_cpio_header* file_hdr, int existing_dir, mode_t existing_mode)
{
int res; /* Result of various function calls. */
#ifdef HPUX_CDF
@@ -646,14 +650,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;
+ else
+ {
+ 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)
{
@@ -742,12 +755,12 @@
return;
}
- 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);
- 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)
@@ -826,9 +839,10 @@
copyin_file (struct new_cpio_header* file_hdr, int in_file_des)
{
int existing_dir=0;
+ mode_t existing_mode;
if (!to_stdout_option
- && try_existing_file (file_hdr, in_file_des, &existing_dir) < 0)
+ && try_existing_file (file_hdr, in_file_des, &existing_dir, &existing_mode) < 0)
return;
/* Do the real copy or link. */
@@ -839,7 +853,7 @@
break;
case CP_IFDIR:
- copyin_directory(file_hdr, existing_dir);
+ copyin_directory(file_hdr, existing_dir, existing_mode);
break;
case CP_IFCHR:
--- cpio-2.6/src/copypass.c.chmodRaceC 2004-09-06 14:09:04.000000000 +0200
+++ cpio-2.6/src/copypass.c 2005-07-01 14:50:46.000000000 +0200
@@ -181,19 +181,25 @@
}
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);
-
+ /*
+ * Avoid race condition.
+ * Set chown and chmod before closing the file desc.
+ * pvrabec@redhat.com
+ */
/* 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)
{
times.actime = in_file_stat.st_atime;
@@ -240,15 +246,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)
{
@@ -311,12 +326,12 @@
if (link_res < 0)
{
- 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);
- 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)

193
cpio-2.6-dirTraversal.patch Normal file
View File

@ -0,0 +1,193 @@
--- cpio-2.6/doc/cpio.1.dirTraversal 2005-05-17 13:18:23.554759017 +0200
+++ cpio-2.6/doc/cpio.1 2005-05-17 13:19:08.178249507 +0200
@@ -20,7 +20,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]
+[\-\-force\-local] [\-\-absolute\-filenames] [\-\-sparse]
[\-\-only\-verify\-crc] [\-\-quiet] [\-\-rsh-command=command] [\-\-help]
[\-\-version] [pattern...] [< archive]
--- cpio-2.6/doc/cpio.info.dirTraversal 2005-05-17 13:20:29.473392159 +0200
+++ cpio-2.6/doc/cpio.info 2005-05-17 13:30:53.812050889 +0200
@@ -203,7 +203,7 @@
[--swap-halfwords] [--io-size=bytes] [--pattern-file=file]
[--format=format] [--owner=[user][:.][group]]
[--no-preserve-owner] [--message=message] [--help] [--version]
- [-no-absolute-filenames] [--sparse] [-only-verify-crc] [-quiet]
+ [--absolute-filenames] [--sparse] [-only-verify-crc] [-quiet]
[--rsh-command=command] [pattern...] [< archive]

@@ -359,9 +359,9 @@
Show numeric UID and GID instead of translating them into names
when using the `--verbose option'.
-`--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.
+`--absolute-filenames'
+ Do not strip leading file name components that contain ".."
+ and leading slashes from file names in copy-in mode
`--no-preserve-owner'
Do not change the ownership of the files; leave them owned by the
--- cpio-2.6/src/main.c.dirTraversal 2005-05-17 12:10:15.952492515 +0200
+++ cpio-2.6/src/main.c 2005-05-17 12:10:15.965490607 +0200
@@ -41,6 +41,7 @@
enum cpio_options {
NO_ABSOLUTE_FILENAMES_OPTION=256,
+ ABSOLUTE_FILENAMES_OPTION,
NO_PRESERVE_OWNER_OPTION,
ONLY_VERIFY_CRC_OPTION,
RENAME_BATCH_FILE_OPTION,
@@ -134,6 +135,8 @@
N_("In copy-in mode, read additional patterns specifying filenames to extract or list from FILE"), 210},
{"no-absolute-filenames", NO_ABSOLUTE_FILENAMES_OPTION, 0, 0,
N_("Create all files relative to the current directory"), 210},
+ {"absolute-filenames", ABSOLUTE_FILENAMES_OPTION, 0, 0,
+ N_("do not strip leading file name components that contain \"..\" and leading slashes from file names"), 210},
{"only-verify-crc", ONLY_VERIFY_CRC_OPTION, 0, 0,
N_("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"), 210},
{"rename", 'r', 0, 0,
@@ -393,7 +396,11 @@
break;
case NO_ABSOLUTE_FILENAMES_OPTION: /* --no-absolute-filenames */
- no_abs_paths_flag = true;
+ abs_paths_flag = false;
+ break;
+
+ case ABSOLUTE_FILENAMES_OPTION: /* --absolute-filenames */
+ abs_paths_flag = true;
break;
case NO_PRESERVE_OWNER_OPTION: /* --no-preserve-owner */
@@ -638,7 +638,7 @@
_("--append is used but no archive file name is given (use -F or -O options")));
CHECK_USAGE(rename_batch_file, "--rename-batch-file", "--create");
- CHECK_USAGE(no_abs_paths_flag, "--no-absolute-pathnames", "--create");
+ CHECK_USAGE(abs_paths_flag, "--absolute-pathnames", "--create");
CHECK_USAGE(sparse_flag, "--sparse", "--create");
CHECK_USAGE(input_archive_name, "-I", "--create");
if (archive_name && output_archive_name)
@@ -659,7 +666,7 @@
CHECK_USAGE(rename_flag, "--rename", "--pass-through");
CHECK_USAGE(append_flag, "--append", "--pass-through");
CHECK_USAGE(rename_batch_file, "--rename-batch-file", "--pass-through");
- CHECK_USAGE(no_abs_paths_flag, "--no-absolute-pathnames",
+ CHECK_USAGE(abs_paths_flag, "--absolute-pathnames",
"--pass-through");
CHECK_USAGE(to_stdout_option, "--to-stdout", "--pass-through");
--- cpio-2.6/src/copyin.c.dirTraversal 2005-05-17 12:10:15.957491781 +0200
+++ cpio-2.6/src/copyin.c 2005-05-17 12:10:15.962491047 +0200
@@ -25,6 +25,7 @@
#include "dstring.h"
#include "extern.h"
#include "defer.h"
+#include "dirname.h"
#include <rmt.h>
#ifndef FNM_PATHNAME
#include <fnmatch.h>
@@ -1349,6 +1350,53 @@
}
}
+/* 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. */
@@ -1459,18 +1507,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)
{
/* Debian hack: file_hrd.c_name is sometimes set to
point to static memory by code in tar.c. This
--- cpio-2.6/src/extern.h.dirTraversal 2005-05-17 12:10:15.944493689 +0200
+++ cpio-2.6/src/extern.h 2005-05-17 12:10:15.963490900 +0200
@@ -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 unsigned int warn_option;
/* Values for warn_option */
--- cpio-2.6/src/global.c.dirTraversal 2004-09-08 12:23:44.000000000 +0200
+++ cpio-2.6/src/global.c 2005-05-17 12:10:15.964490753 +0200
@@ -100,7 +100,7 @@
int only_verify_crc_flag = false;
/* If true, don't use any absolute paths, prefix them by `./'. */
-int no_abs_paths_flag = false;
+int abs_paths_flag = false;
#ifdef DEBUG_CPIO
/* If true, print debugging information. */

170
cpio-2.6-lfs.patch Normal file
View File

@ -0,0 +1,170 @@
--- cpio-2.6/src/copyin.c.lfs 2005-07-01 13:48:05.000000000 +0200
+++ cpio-2.6/src/copyin.c 2005-07-01 13:48:18.000000000 +0200
@@ -106,7 +106,7 @@
header type. */
static void
-tape_skip_padding (int in_file_des, int offset)
+tape_skip_padding (int in_file_des, unsigned long offset)
{
int pad;
--- cpio-2.6/src/extern.h.lfs 2004-09-08 12:49:57.000000000 +0200
+++ cpio-2.6/src/extern.h 2005-07-01 13:47:20.000000000 +0200
@@ -161,13 +161,13 @@
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_write P_((char *in_buf, int out_des, unsigned 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 tape_toss_input P_((int in_des, unsigned long num_bytes));
+void copy_files_tape_to_disk P_((int in_des, int out_des, unsigned long num_bytes));
+void copy_files_disk_to_tape P_((int in_des, int out_des, unsigned long num_bytes, char *filename));
+void copy_files_disk_to_disk P_((int in_des, int out_des, unsigned long num_bytes, char *filename));
void warn_if_file_changed P_((char *file_name, unsigned long old_file_size,
unsigned long old_file_mtime));
void create_all_directories P_((char *name));
--- cpio-2.6/src/util.c.lfs 2004-09-08 12:44:49.000000000 +0200
+++ cpio-2.6/src/util.c 2005-07-01 13:56:49.000000000 +0200
@@ -207,7 +207,7 @@
Exit with an error if end of file is reached. */
static int
-disk_fill_input_buffer (int in_des, int num_bytes)
+disk_fill_input_buffer (int in_des, unsigned long num_bytes)
{
in_buff = input_buffer;
num_bytes = (num_bytes < DISK_IO_BLOCK_SIZE) ? num_bytes : DISK_IO_BLOCK_SIZE;
@@ -227,9 +227,9 @@
When `out_buff' fills up, flush it to file descriptor OUT_DES. */
void
-tape_buffered_write (char *in_buf, int out_des, long num_bytes)
+tape_buffered_write (char *in_buf, int out_des, unsigned long num_bytes)
{
- register long bytes_left = num_bytes; /* Bytes needing to be copied. */
+ register unsigned long bytes_left = num_bytes; /* Bytes needing to be copied. */
register long space_left; /* Room left in output buffer. */
while (bytes_left > 0)
@@ -254,9 +254,9 @@
When `out_buff' fills up, flush it to file descriptor OUT_DES. */
void
-disk_buffered_write (char *in_buf, int out_des, long num_bytes)
+disk_buffered_write (char *in_buf, int out_des, unsigned long num_bytes)
{
- register long bytes_left = num_bytes; /* Bytes needing to be copied. */
+ register unsigned long bytes_left = num_bytes; /* Bytes needing to be copied. */
register long space_left; /* Room left in output buffer. */
while (bytes_left > 0)
@@ -376,9 +376,9 @@
/* Skip the next NUM_BYTES bytes of file descriptor IN_DES. */
void
-tape_toss_input (int in_des, long num_bytes)
+tape_toss_input (int in_des, unsigned long num_bytes)
{
- register long bytes_left = num_bytes; /* Bytes needing to be copied. */
+ register unsigned long bytes_left = num_bytes; /* Bytes needing to be copied. */
register long space_left; /* Bytes to copy from input buffer. */
while (bytes_left > 0)
@@ -404,12 +404,12 @@
}
static void
-write_nuls_to_file (long num_bytes, int out_des,
+write_nuls_to_file (unsigned long num_bytes, int out_des,
void (*writer) (char *in_buf, int out_des, long num_bytes))
{
- long blocks;
+ unsigned long blocks;
long extra_bytes;
- long i;
+ unsigned long i;
blocks = num_bytes / 512;
extra_bytes = num_bytes % 512;
@@ -428,10 +428,10 @@
NUM_BYTES is the number of bytes to copy. */
void
-copy_files_tape_to_disk (int in_des, int out_des, long num_bytes)
+copy_files_tape_to_disk (int in_des, int out_des, unsigned long num_bytes)
{
- long size;
- long k;
+ unsigned long size;
+ unsigned long k;
while (num_bytes > 0)
{
@@ -458,13 +458,13 @@
NUM_BYTES is the number of bytes to copy. */
void
-copy_files_disk_to_tape (int in_des, int out_des, long num_bytes,
+copy_files_disk_to_tape (int in_des, int out_des, unsigned long num_bytes,
char *filename)
{
- long size;
- long k;
+ unsigned long size;
+ unsigned long k;
int rc;
- long original_num_bytes;
+ unsigned long original_num_bytes;
original_num_bytes = num_bytes;
@@ -476,10 +476,10 @@
num_bytes : DISK_IO_BLOCK_SIZE))
{
if (rc > 0)
- error (0, 0, _("File %s shrunk by %ld bytes, padding with zeros"),
+ error (0, 0, _("File %s shrunk by %lld bytes, padding with zeros"),
filename, num_bytes);
else
- error (0, 0, _("Read error at byte %ld in file %s, padding with zeros"),
+ error (0, 0, _("Read error at byte %lld in file %s, padding with zeros"),
original_num_bytes - num_bytes, filename);
write_nuls_to_file (num_bytes, out_des, tape_buffered_write);
break;
@@ -505,12 +505,12 @@
NUM_BYTES is the number of bytes to copy. */
void
-copy_files_disk_to_disk (int in_des, int out_des, long num_bytes,
+copy_files_disk_to_disk (int in_des, int out_des, unsigned long num_bytes,
char *filename)
{
- long size;
- long k;
- long original_num_bytes;
+ unsigned long size;
+ unsigned long k;
+ unsigned long original_num_bytes;
int rc;
original_num_bytes = num_bytes;
@@ -520,10 +520,10 @@
if (rc = disk_fill_input_buffer (in_des, num_bytes))
{
if (rc > 0)
- error (0, 0, _("File %s shrunk by %ld bytes, padding with zeros"),
+ error (0, 0, _("File %s shrunk by %lld bytes, padding with zeros"),
filename, num_bytes);
else
- error (0, 0, _("Read error at byte %ld in file %s, padding with zeros"),
+ error (0, 0, _("Read error at byte %lld in file %s, padding with zeros"),
original_num_bytes - num_bytes, filename);
write_nuls_to_file (num_bytes, out_des, disk_buffered_write);
break;

713
cpio-2.6-mt.patch Normal file
View File

@ -0,0 +1,713 @@
--- Makefile.am
+++ Makefile.am
@@ -19,4 +19,4 @@
AUTOMAKE_OPTIONS = gnits 1.8 dist-bzip2 std-options
-SUBDIRS = doc headers lib rmt src po tests
+SUBDIRS = doc headers lib src po tests
--- doc/mt.1
+++ doc/mt.1
@@ -76,9 +76,6 @@
.IR count .
Equivalent to rewind followed by fsf
.IR count .
-.IP seek
-Seek to block number
-.IR count .
.IP eom
Space to the end of the recorded media on the tape
(for appending files onto tapes).
@@ -93,6 +90,69 @@
then rewind it again.
.IP erase
Erase the tape.
+.IP fss
+(SCSI tapes) Forward space
+.I count
+setmarks.
+.IP bss
+(SCSI tapes) Backward space
+.I count
+setmarks.
+.IP "wset"
+(SCSI tapes) Write
+.I count
+setmarks at current position (only SCSI tape).
+.IP "eod, seod"
+Space to end of valid data. Used on streamer tape
+drives to append data to the logical and of tape.
+.IP setblk
+(SCSI tapes) Set the block size of the drive to
+.I count
+bytes per record.
+.IP setdensity
+(SCSI tapes) Set the tape density code to
+.I count.
+The proper codes to use with each drive should be looked up from the
+drive documentation.
+.IP drvbuffer
+(SCSI tapes) Set the tape drive buffer code to
+.I number.
+The proper value for unbuffered operation is zero and "normal" buffered
+operation one. The meanings of other values can be found in the drive
+documentation or, in case of a SCSI-2 drive, from the SCSI-2 standard.
+.IP stoptions
+(SCSI tapes) Set the driver options bits to
+.I count
+for the device.
+The bits can be set by oring the following values: 1 to enable write
+buffering, 2 to enable asynchronous writes, 4 to enable read ahead,
+8 to enable debugging output (if it has been compiled to the driver).
+.IP stwrthreshold
+(SCSI tapes) The write threshold for the tape device is set to
+.I count
+kilobytes. The value must be smaller than or equal to the driver
+buffer size.
+.IP seek
+(SCSI tapes) Seek to the
+.I count
+block on the tape. This operation is available on some
+Tandberg and Wangtek streamers and some SCSI-2 tape drives.
+.IP tell
+(SCSI tapes) Tell the current block on tape. This operation is available on some
+Tandberg and Wangtek streamers and some SCSI-2 tape drives.
+.IP densities
+(SCSI tapes) Write explanation of some common density codes to
+standard output.
+.IP datcompression
+(some SCSI-2 DAT tapes) Inquire or set the compression status
+(on/off). If the
+.I count
+is one the compression status is printed. If the
+.I count
+is zero, compression is disabled. Otherwise, compression is
+enabled. The command uses the SCSI ioctl to read and write the Data
+Compression Characteristics mode page (15). ONLY ROOT CAN USE THIS
+COMMAND.
.PP
.B mt
exits with a status of 0 if the operation succeeded, 1 if the
--- lib/system.h
+++ lib/system.h
@@ -473,10 +473,11 @@
#if HAVE_LOCALE_H
# include <locale.h>
-#endif
+#else
#if !HAVE_SETLOCALE
# define setlocale(category, locale) /* empty */
#endif
+#endif
#include <time.h>
#if defined(HAVE_SYS_TIME_H) && defined(TIME_WITH_SYS_TIME)
--- src/Makefile.am
+++ src/Makefile.am
@@ -17,7 +17,7 @@
INCLUDES=-I. -I.. -I$(top_srcdir)/lib
-bin_PROGRAMS=cpio @CPIO_MT_PROG@
+bin_PROGRAMS=cpio mt
EXTRA_PROGRAMS=mt
cpio_SOURCES = \
--- src/copyin.c
+++ src/copyin.c
@@ -176,7 +176,7 @@
#endif
if (crc != file_hdr->c_chksum)
{
- error (0, 0, _("%s: checksum error (0x%x, should be 0x%x)"),
+ error (0, 0, _("%s: checksum error (0x%lx, should be 0x%lx)"),
file_hdr->c_name, crc, file_hdr->c_chksum);
}
}
@@ -541,7 +541,7 @@
if (archive_format == arf_crcascii)
{
if (crc != file_hdr->c_chksum)
- error (0, 0, _("%s: checksum error (0x%x, should be 0x%x)"),
+ error (0, 0, _("%s: checksum error (0x%lx, should be 0x%lx)"),
file_hdr->c_name, crc, file_hdr->c_chksum);
}
tape_skip_padding (in_file_des, file_hdr->c_filesize);
@@ -563,7 +563,7 @@
if (archive_format == arf_crcascii)
{
if (crc != file_hdr->c_chksum)
- error (0, 0, _("%s: checksum error (0x%x, should be 0x%x)"),
+ error (0, 0, _("%s: checksum error (0x%lx, should be 0x%lx)"),
file_hdr->c_name, crc, file_hdr->c_chksum);
}
@@ -825,7 +825,7 @@
static void
copyin_file (struct new_cpio_header* file_hdr, int in_file_des)
{
- int existing_dir;
+ int existing_dir=0;
if (!to_stdout_option
&& try_existing_file (file_hdr, in_file_des, &existing_dir) < 0)
@@ -897,7 +897,7 @@
}
tbuf[16] = '\0';
- printf ("%s %3u ", mbuf, file_hdr->c_nlink);
+ printf ("%s %3lu ", mbuf, file_hdr->c_nlink);
if (numeric_uid)
printf ("%-8u %-8u ", (unsigned int) file_hdr->c_uid,
@@ -908,7 +908,7 @@
if ((file_hdr->c_mode & CP_IFMT) == CP_IFCHR
|| (file_hdr->c_mode & CP_IFMT) == CP_IFBLK)
- printf ("%3u, %3u ", file_hdr->c_rdev_maj,
+ printf ("%3lu, %3lu ", file_hdr->c_rdev_maj,
file_hdr->c_rdev_min);
else
printf ("%8lu ", file_hdr->c_filesize);
@@ -1342,14 +1342,15 @@
process_copy_in ()
{
char done = false; /* True if trailer reached. */
- FILE *tty_in; /* Interactive file for rename option. */
- FILE *tty_out; /* Interactive file for rename option. */
- FILE *rename_in; /* Batch file for rename option. */
+ FILE *tty_in=NULL; /* Interactive file for rename option. */
+ FILE *tty_out=NULL; /* Interactive file for rename option. */
+ FILE *rename_in=NULL; /* Batch file for rename option. */
struct stat file_stat; /* Output file stat record. */
struct new_cpio_header file_hdr; /* Output header information. */
int in_file_des; /* Input file descriptor. */
char skip_file; /* Flag for use with patterns. */
int i; /* Loop index variable. */
+ int lastpattern = 0;
/* Initialize the copy in. */
if (pattern_file_name)
@@ -1477,8 +1478,10 @@
for (i = 0; i < num_patterns
&& skip_file == copy_matching_files; i++)
{
- if (fnmatch (save_patterns[i], file_hdr.c_name, 0) == 0)
+ if (fnmatch (save_patterns[lastpattern], file_hdr.c_name, 0) == 0)
skip_file = !copy_matching_files;
+ else if (++lastpattern >= num_patterns)
+ lastpattern = 0;
}
}
@@ -1530,7 +1533,7 @@
tape_skip_padding (in_file_des, file_hdr.c_filesize);
if (crc != file_hdr.c_chksum)
{
- error (0, 0, _("%s: checksum error (0x%x, should be 0x%x)"),
+ error (0, 0, _("%s: checksum error (0x%lx, should be 0x%lx)"),
file_hdr.c_name, crc, file_hdr.c_chksum);
}
/* Debian hack: -v and -V now work with --only-verify-crc.
--- src/mt.c
+++ src/mt.c
@@ -16,6 +16,10 @@
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
+/* Modified for the Linux SCSI tape driver by Brian Mays from code
+ written by Kai Makisara.
+ Last Modified: Tue Apr 23 15:37:54 EDT 1996
+*/
/* If -f is not given, the environment variable TAPE is used;
if that is not set, a default device defined in sys/mtio.h is used.
@@ -50,6 +54,46 @@
retension Rewind the tape, then wind it to the end of the reel,
then rewind it again.
erase Erase the tape.
+ fss (SCSI tapes) Forward space COUNT setmarks.
+ bss (SCSI tapes) Backward space COUNT setmarks.
+ wset (SCSI tapes) Write COUNT setmarks at current position
+ (only SCSI tape).
+ eod, seod Space to end of valid data. Used on streamer tape
+ drives to append data to the logical and of tape.
+ setblk (SCSI tapes) Set the block size of the drive to COUNT
+ bytes per record.
+ setdensity (SCSI tapes) Set the tape density code to COUNT. The
+ proper codes to use with each drive should be looked
+ up from the drive documentation.
+ drvbuffer (SCSI tapes) Set the tape drive buffer code to
+ NUMBER. The proper value for unbuffered operation is
+ zero and "normal" buffered operation one. The meanings
+ of other values can be found in the drive
+ documentation or, in case of a SCSI-2 drive, from the
+ SCSI-2 standard.
+ stoptions (SCSI tapes) Set the driver options bits to COUNT for
+ the device. The bits can be set by oring the
+ following values: 1 to enable write buffering, 2 to
+ enable asynchronous writes, 4 to enable read ahead, 8
+ to enable debugging output (if it has been compiled to
+ the driver).
+ stwrthreshold
+ (SCSI tapes) The write threshold for the tape device
+ is set to COUNT kilobytes. The value must be smaller
+ than or equal to the driver buffer size.
+ seek (SCSI tapes) Seek to the COUNT block on the tape.
+ This operation is available on some Tandberg and
+ Wangtek streamers and some SCSI-2 tape drives.
+ tell (SCSI tapes) Tell the current block on tape. This
+ operation is available on some Tandberg and Wangtek
+ streamers and some SCSI-2 tape drives.
+ densities (SCSI tapes) Write explanation of some common density
+ codes to standard output.
+ datcompression
+ (some SCSI-2 DAT tapes) Inquire or set the compression
+ status (on/off). If the COUNT is one the compression
+ status is printed. If the COUNT is zero, compression
+ is disabled. Otherwise, compression is enabled.
David MacKenzie <djm@gnu.ai.mit.edu> */
@@ -104,6 +148,45 @@
void exit ();
#endif
+#include "../lib/argmatch.h"
+
+#if defined(linux) || defined(__linux)
+#define MTDATCOMP 1000 /* Random unused number. */
+#define MTDENS 1001 /* Random unused number. */
+
+struct densities {
+ int code;
+ char *name;
+} density_tbl[] = {
+ {0x00, "default"},
+ {0x01, "NRZI (800 bpi)"},
+ {0x02, "PE (1600 bpi)"},
+ {0x03, "GCR (6250 bpi)"},
+ {0x05, "QIC-45/60 (GCR, 8000 bpi)"},
+ {0x06, "PE (3200 bpi)"},
+ {0x07, "IMFM (6400 bpi)"},
+ {0x08, "GCR (8000 bpi)"},
+ {0x09, "GCR /37871 bpi)"},
+ {0x0a, "MFM (6667 bpi)"},
+ {0x0b, "PE (1600 bpi)"},
+ {0x0c, "GCR (12960 bpi)"},
+ {0x0d, "GCR (25380 bpi)"},
+ {0x0f, "QIC-120 (GCR 10000 bpi)"},
+ {0x10, "QIC-150/250 (GCR 10000 bpi)"},
+ {0x11, "QIC-320/525 (GCR 16000 bpi)"},
+ {0x12, "QIC-1350 (RLL 51667 bpi)"},
+ {0x13, "DDS (61000 bpi)"},
+ {0x14, "EXB-8200 (RLL 43245 bpi)"},
+ {0x15, "EXB-8500 (RLL 45434 bpi)"},
+ {0x16, "MFM 10000 bpi"},
+ {0x17, "MFM 42500 bpi"},
+ {0x24, "DDS-2"},
+ {140, "EXB-8505 compressed"},
+ {144, "EXB-8205 compressed"},
+ {-1, NULL}};
+#endif
+
+
char *opnames[] =
{
"eof", "weof", "fsf", "bsf", "fsr", "bsr",
@@ -113,6 +196,8 @@
#endif
#ifdef MTEOM
"eom",
+ "eod",
+ "seod",
#endif
#ifdef MTRETEN
"retension",
@@ -127,6 +212,39 @@
#ifdef MTSEEK
"seek",
#endif
+#ifdef MTTELL
+ "tell",
+#endif
+#ifdef MTFSS
+ "fss",
+#endif
+#ifdef MTBSS
+ "bss",
+#endif
+#ifdef MTWSM
+ "wset",
+#endif
+#ifdef MTSETBLK
+ "setblk",
+#endif
+#ifdef MTSETDENSITY
+ "setdensity",
+#endif
+#ifdef MTSETDRVBUFFER
+ "drvbuffer",
+#ifdef MT_ST_BOOLEANS
+ "stoptions",
+#endif
+#ifdef MT_ST_WRITE_THRESHOLD
+ "stwrthreshold",
+#endif
+#endif
+#ifdef MTDATCOMP
+ "datcompression",
+#endif
+#ifdef MTDENS
+ "densities",
+#endif
NULL
};
@@ -140,6 +258,8 @@
#endif
#ifdef MTEOM
MTEOM,
+ MTEOM,
+ MTEOM,
#endif
#ifdef MTRETEN
MTRETEN,
@@ -154,9 +274,69 @@
#ifdef MTSEEK
MTSEEK,
#endif
+#ifdef MTTELL
+ MTTELL,
+#endif
+#ifdef MTFSS
+ MTFSS,
+#endif
+#ifdef MTBSS
+ MTBSS,
+#endif
+#ifdef MTWSM
+ MTWSM,
+#endif
+#ifdef MTSETBLK
+ MTSETBLK,
+#endif
+#ifdef MTSETDENSITY
+ MTSETDENSITY,
+#endif
+#ifdef MTSETDRVBUFFER
+ MTSETDRVBUFFER,
+#ifdef MT_ST_BOOLEANS
+ MTSETDRVBUFFER,
+#endif
+#ifdef MT_ST_WRITE_THRESHOLD
+ MTSETDRVBUFFER,
+#endif
+#endif
+#ifdef MTDATCOMP
+ MTDATCOMP,
+#endif
+#ifdef MTDENS
+ MTDENS,
+#endif
+ 0
+};
+
+char *cbnames[] =
+{
+#ifdef MT_ST_BOOLEANS
+ "stoptions",
+#endif
+#ifdef MT_ST_WRITE_THRESHOLD
+ "stwrthreshold",
+#endif
+ NULL
+};
+
+int count_bits[] =
+{
+#ifdef MT_ST_BOOLEANS
+ MT_ST_BOOLEANS,
+#endif
+#ifdef MT_ST_WRITE_THRESHOLD
+ MT_ST_WRITE_THRESHOLD,
+#endif
0
};
+#ifdef MT_TAPE_INFO
+ struct mt_tape_info tapes[] = MT_TAPE_INFO;
+#endif
+
+
struct option longopts[] =
{
{"file", 1, NULL, 'f'},
@@ -199,10 +379,22 @@
print_status (char *dev, int desc)
{
struct mtget status;
+#ifdef MT_TAPE_INFO
+ struct mt_tape_info *mt;
+#endif
if (rmtioctl (desc, MTIOCGET, (char*)&status) == -1)
error (2, errno, "%s", dev);
+#ifdef MT_TAPE_INFO
+ for (mt = tapes; mt->t_type; mt++)
+ if (mt->t_type == status.mt_type) break;
+ if (mt->t_type != 0)
+ {
+ printf ("drive type = %s\n", mt->t_name);
+ }
+ else
+#endif
printf ("drive type = %d\n", (int) status.mt_type);
#if defined(hpux) || defined(__hpux)
printf ("drive status (high) = %d\n", (int) status.mt_dsreg1);
@@ -216,8 +408,178 @@
printf ("file number = %d\n", (int) status.mt_fileno);
printf ("block number = %d\n", (int) status.mt_blkno);
#endif
+#if defined(linux) || defined(__linux)
+ if (status.mt_type == MT_ISSCSI1 ||
+ status.mt_type == MT_ISSCSI2)
+ {
+ int dens, i;
+ char *density;
+ dens = (status.mt_dsreg & MT_ST_DENSITY_MASK) >> MT_ST_DENSITY_SHIFT;
+ density = "unknown";
+ for (i=0; density_tbl[i].code >= 0; i++)
+ if (density_tbl[i].code == dens)
+ {
+ density = density_tbl[i].name;
+ break;
+ }
+ printf("Tape block size %ld bytes. Density code 0x%x (%s).\n",
+ ((status.mt_dsreg & MT_ST_BLKSIZE_MASK) >> MT_ST_BLKSIZE_SHIFT),
+ dens, density);
+
+ printf("Soft error count since last status=%ld\n",
+ (status.mt_erreg & MT_ST_SOFTERR_MASK) >> MT_ST_SOFTERR_SHIFT);
+ printf("General status bits on (%lx):\n", status.mt_gstat);
+ if (GMT_EOF(status.mt_gstat))
+ printf(" EOF");
+ if (GMT_BOT(status.mt_gstat))
+ printf(" BOT");
+ if (GMT_EOT(status.mt_gstat))
+ printf(" EOT");
+ if (GMT_SM(status.mt_gstat))
+ printf(" SM");
+ if (GMT_EOD(status.mt_gstat))
+ printf(" EOD");
+ if (GMT_WR_PROT(status.mt_gstat))
+ printf(" WR_PROT");
+ if (GMT_ONLINE(status.mt_gstat))
+ printf(" ONLINE");
+ if (GMT_D_6250(status.mt_gstat))
+ printf(" D_6250");
+ if (GMT_D_1600(status.mt_gstat))
+ printf(" D_1600");
+ if (GMT_D_800(status.mt_gstat))
+ printf(" D_800");
+ if (GMT_DR_OPEN(status.mt_gstat))
+ printf(" DR_OPEN");
+ if (GMT_IM_REP_EN(status.mt_gstat))
+ printf(" IM_REP_EN");
+ if (status.mt_gstat != 0)
+ putchar ('\n');
+ }
+ else
+ {
+ printf("gstat = %0lx\n", status.mt_gstat);
+ }
+#endif
+}
+
+
+#if defined(linux) || defined(__linux)
+/*** Get and set the DAT compression (Mode Page 15) ***/
+
+#define MODE_SENSE 0x1a
+#define MODE_SELECT 0x15
+
+int
+read_mode_page(int fn, int page, int length, unsigned char *buffer,
+ int do_mask)
+{
+ int result, *ip;
+ unsigned char tmpbuffer[30], *cmd;
+
+ memset(tmpbuffer, 0, 14);
+ ip = (int *)&(tmpbuffer[0]);
+ *ip = 0;
+ *(ip+1) = length + 4;
+
+ cmd = &(tmpbuffer[8]);
+ cmd[0] = MODE_SENSE;
+ cmd[1] = 8;
+ cmd[2] = page;
+ if (do_mask)
+ cmd[2] |= 0x40; /* Get changeable parameter mask */
+ cmd[4] = length + 4;
+
+ result = ioctl(fn, 1, tmpbuffer);
+ if (result) {
+ fprintf(stderr, "Can't read mode page. Are you sure you are root?\n");
+ return 0;
+ }
+ memcpy(buffer, tmpbuffer + 8, length + 4);
+ return 1;
+}
+
+
+int
+write_mode_page(int fn, int page, int length, unsigned char *buffer)
+{
+ int result, *ip;
+ unsigned char tmpbuffer[40], *cmd;
+
+ memset(tmpbuffer, 0, 14);
+ ip = (int *)&(tmpbuffer[0]);
+ *ip = length + 4;
+ *(ip+1) = 0;
+
+ cmd = &(tmpbuffer[8]);
+ cmd[0] = MODE_SELECT;
+ cmd[1] = 0x10;
+ cmd[4] = length + 4;
+
+ memcpy(tmpbuffer + 14, buffer, length + 4);
+ tmpbuffer[14] = 0; /* reserved data length */
+ tmpbuffer[18] &= 0x3f; /* reserved bits in page code byte */
+
+ result = ioctl(fn, 1, tmpbuffer);
+ if (result) {
+ fprintf(stderr, "Can't write mode page.\n");
+ return 0;
+ }
+ return 1;
}
+
+int
+do_dat_compression(char *dev, int fn, int count)
+{
+ int i;
+ unsigned char buffer[30], mask[30];
+
+ if (!read_mode_page(fn, 0x0f, 16, buffer, 0)) {
+ error (2, errno, "%s", dev);
+ }
+
+ if (count != 1) {
+ if (count == 0)
+ buffer[4+2] &= 0x7f;
+ else
+ buffer[4+2] |= 0x80;
+ if (read_mode_page(fn, 0x0f, 16, mask, 1))
+ for (i=2; i < 16; i++)
+ buffer[4+i] |= mask[4+i];
+ if (!write_mode_page(fn, 0x0f, 16, buffer)) {
+ error (2, errno, "%s", dev);
+ }
+ if (!read_mode_page(fn, 0x0f, 16, buffer, 0)) { /* Re-read to check */
+ error (2, errno, "%s", dev);
+ }
+ }
+
+ if (buffer[4+2] & 0x80)
+ printf("Compression on.\n");
+ else
+ printf("Compression off.\n");
+
+ return 1;
+}
+#endif
+
+#ifdef MTTELL
+void
+print_position (dev, desc)
+ char *dev;
+ int desc;
+{
+ struct mtpos position;
+
+ if (rmtioctl (desc, MTIOCPOS, &position) == -1)
+ error (2, errno, "%s", dev);
+ printf("At block %ld.\n", position.mt_blkno);
+
+}
+#endif
+
+
void
usage (FILE *fp,int status)
{
@@ -277,7 +639,7 @@
if (optind == argc)
usage (stderr, 1);
- i = argmatch (argv[optind], opnames);
+ i = argmatch (argv[optind], opnames,NULL,0);
if (i < 0)
{
invalid_arg ("tape operation", argv[optind], i);
@@ -309,10 +671,29 @@
#endif
}
+#ifdef MTDENS
+ if (operation == MTDENS)
+ {
+ printf("Some SCSI tape density codes:\ncode explanation\n");
+ for (i=0; density_tbl[i].code >= 0; i++)
+ printf("0x%02x %s\n", density_tbl[i].code, density_tbl[i].name);
+ exit (0);
+ }
+#endif
+
if ( (operation == MTWEOF)
#ifdef MTERASE
|| (operation == MTERASE)
#endif
+#ifdef MTWSM
+ || (operation == MTWSM)
+#endif
+#ifdef MTSETDRVBUFFER
+ || (operation == MTSETDRVBUFFER)
+#endif
+#ifdef MTDATCOMP
+ || (operation == MTDATCOMP)
+#endif
)
tapedesc = rmtopen (tapedev, O_WRONLY, 0, rsh_command_option);
else
@@ -321,6 +702,17 @@
error (1, errno, "%s", tapedev);
check_type (tapedev, tapedesc);
+#ifdef MTDATCOMP
+ if (operation == MTDATCOMP)
+ do_dat_compression(tapedev, tapedesc, count);
+ else
+#endif
+#ifdef MTTELL
+ if (operation == MTTELL)
+ print_position (tapedev, tapedesc);
+ else
+#endif
+ {
if (operation == MTASF)
{
perform_operation (tapedev, tapedesc, MTREW, 1);
@@ -329,6 +721,7 @@
perform_operation (tapedev, tapedesc, operation, count);
if (operation == MTNOP)
print_status (tapedev, tapedesc);
+ }
if (rmtclose (tapedesc) == -1)
error (2, errno, "%s", tapedev);

View File

@ -0,0 +1,555 @@
--- cpio-2.6/src/copyout.c
+++ cpio-2.6/src/copyout.c
@@ -159,7 +159,7 @@
}
/* 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
+ multiply linked. We have already seen and deferred 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. */
@@ -231,8 +231,10 @@
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);
+ if (write_out_header (&file_hdr, out_file_des))
+ return;
+ copy_files_disk_to_tape (in_file_des, out_file_des, file_hdr.c_filesize,
+ header->c_name);
warn_if_file_changed(header->c_name, file_hdr.c_filesize, file_hdr.c_mtime);
if (archive_format == arf_tar || archive_format == arf_ustar)
@@ -288,153 +290,311 @@
}
}
-
-/* Write out header FILE_HDR, including the file name, to file
- descriptor OUT_DES. */
+/* FIXME: These two defines should be defined in paxutils */
+#define LG_8 3
+#define LG_16 4
+
+/* FIXME: to_ascii could be used instead of to_oct() and to_octal() from tar,
+ so it should be moved to paxutils too.
+ Allowed values for logbase are: 1 (binary), 2, 3 (octal), 4 (hex) */
+int
+to_ascii (char *where, uintmax_t v, size_t digits, unsigned logbase)
+{
+ static char codetab[] = "0123456789ABCDEF";
+ int i = digits;
+
+ do
+ {
+ where[--i] = codetab[(v & ((1 << logbase) - 1))];
+ v >>= logbase;
+ }
+ while (i);
+
+ return v != 0;
+}
+
+static void
+field_width_error (const char *filename, const char *fieldname)
+{
+ error (0, 0, _("%s: field width not sufficient for storing %s"),
+ filename, fieldname);
+}
+
+static void
+field_width_warning (const char *filename, const char *fieldname)
+{
+ if (warn_option & CPIO_WARN_TRUNCATE)
+ error (0, 0, _("%s: truncating %s"), filename, fieldname);
+}
void
-write_out_header (struct new_cpio_header *file_hdr, int out_des)
+to_ascii_or_warn (char *where, uintmax_t n, size_t digits,
+ unsigned logbase,
+ const char *filename, const char *fieldname)
+{
+ if (to_ascii (where, n, digits, logbase))
+ field_width_warning (filename, fieldname);
+}
+
+int
+to_ascii_or_error (char *where, uintmax_t n, size_t digits,
+ unsigned logbase,
+ const char *filename, const char *fieldname)
{
- if (archive_format == arf_newascii || archive_format == arf_crcascii)
+ if (to_ascii (where, n, digits, logbase))
{
- char ascii_header[112];
- char *magic_string;
+ field_width_error (filename, fieldname);
+ return 1;
+ }
+ return 0;
+}
- 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 & 0xffffffff);
- 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];
- dev_t dev;
- dev_t rdev;
+int
+write_out_new_ascii_header (const char *magic_string,
+ struct new_cpio_header *file_hdr, int out_des)
+{
+ char ascii_header[110];
+ char *p;
- 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:
+ p = stpcpy (ascii_header, magic_string);
+ to_ascii_or_warn (p, file_hdr->c_ino, 8, LG_16,
+ file_hdr->c_name, _("inode number"));
+ p += 8;
+ to_ascii_or_warn (p, file_hdr->c_mode, 8, LG_16, file_hdr->c_name,
+ _("file mode"));
+ p += 8;
+ to_ascii_or_warn (p, file_hdr->c_uid, 8, LG_16, file_hdr->c_name,
+ _("uid"));
+ p += 8;
+ to_ascii_or_warn (p, file_hdr->c_gid, 8, LG_16, file_hdr->c_name,
+ _("gid"));
+ p += 8;
+ to_ascii_or_warn (p, file_hdr->c_nlink, 8, LG_16, file_hdr->c_name,
+ _("number of links"));
+ p += 8;
+ to_ascii_or_warn (p, file_hdr->c_mtime, 8, LG_16, file_hdr->c_name,
+ _("modification time"));
+ p += 8;
+ if (to_ascii_or_error (p, file_hdr->c_filesize, 8, LG_16, file_hdr->c_name,
+ _("file size")))
+ return 1;
+ p += 8;
+ if (to_ascii_or_error (p, file_hdr->c_dev_maj, 8, LG_16, file_hdr->c_name,
+ _("device major number")))
+ return 1;
+ p += 8;
+ if (to_ascii_or_error (p, file_hdr->c_dev_min, 8, LG_16, file_hdr->c_name,
+ _("device minor number")))
+ return 1;
+ p += 8;
+ if (to_ascii_or_error (p, file_hdr->c_rdev_maj, 8, LG_16, file_hdr->c_name,
+ _("rdev major")))
+ return 1;
+ p += 8;
+ if (to_ascii_or_error (p, file_hdr->c_rdev_min, 8, LG_16, file_hdr->c_name,
+ _("rdev minor")))
+ return 1;
+ p += 8;
+ if (to_ascii_or_error (p, file_hdr->c_namesize, 8, LG_16, file_hdr->c_name,
+ _("name size")))
+ return 1;
+ p += 8;
+ to_ascii (p, file_hdr->c_chksum & 0xffffffff, 8, LG_16);
+
+ tape_buffered_write (ascii_header, out_des, sizeof ascii_header);
+
+ /* 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 + sizeof ascii_header);
+ return 0;
+}
+
+int
+write_out_old_ascii_header (dev_t dev, dev_t rdev,
+ struct new_cpio_header *file_hdr, int out_des)
+{
+ char ascii_header[76];
+ char *p = ascii_header;
+
+ to_ascii (p, file_hdr->c_magic, 6, LG_8);
+ p += 6;
+ to_ascii_or_warn (p, dev, 6, LG_8, file_hdr->c_name, _("device number"));
+ p += 6;
+ to_ascii_or_warn (p, file_hdr->c_ino, 6, LG_8, file_hdr->c_name,
+ _("inode number"));
+ p += 6;
+ to_ascii_or_warn (p, file_hdr->c_mode, 6, LG_8, file_hdr->c_name,
+ _("file mode"));
+ p += 6;
+ to_ascii_or_warn (p, file_hdr->c_uid, 6, LG_8, file_hdr->c_name, _("uid"));
+ p += 6;
+ to_ascii_or_warn (p, file_hdr->c_gid, 6, LG_8, file_hdr->c_name, _("gid"));
+ p += 6;
+ to_ascii_or_warn (p, file_hdr->c_nlink, 6, LG_8, file_hdr->c_name,
+ _("number of links"));
+ p += 6;
+ to_ascii_or_warn (p, rdev, 6, LG_8, file_hdr->c_name, _("rdev"));
+ p += 6;
+ to_ascii_or_warn (p, file_hdr->c_mtime, 11, LG_8, file_hdr->c_name,
+ _("modification time"));
+ p += 11;
+ if (to_ascii_or_error (p, file_hdr->c_namesize, 6, LG_8, file_hdr->c_name,
+ _("name size")))
+ return 1;
+ p += 6;
+ if (to_ascii_or_error (p, file_hdr->c_filesize, 11, LG_8, file_hdr->c_name,
+ _("file size")))
+ return 1;
+
+ tape_buffered_write (ascii_header, out_des, sizeof ascii_header);
+
+ /* Write file name to output. */
+ tape_buffered_write (file_hdr->c_name, out_des, file_hdr->c_namesize);
+ return 0;
+}
+
+void
+hp_compute_dev (struct new_cpio_header *file_hdr, dev_t *pdev, dev_t *prdev)
+{
+ /* 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:
+ case CP_IFSOCK:
#endif
#ifdef CP_IFIFO
- case 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;
- }
- }
+ file_hdr->c_filesize = makedev (file_hdr->c_rdev_maj,
+ file_hdr->c_rdev_min);
+ *pdev = *prdev = makedev (0, 1);
+ break;
+
+ default:
+ *pdev = makedev (file_hdr->c_dev_maj, file_hdr->c_dev_min);
+ *prdev = makedev (file_hdr->c_rdev_maj, file_hdr->c_rdev_min);
+ break;
+ }
+}
- if ((warn_option & CPIO_WARN_TRUNCATE) && (file_hdr->c_ino >> 16) != 0)
- error (0, 0, _("%s: truncating inode number"), file_hdr->c_name);
+int
+write_out_binary_header (dev_t rdev,
+ struct new_cpio_header *file_hdr, int out_des)
+{
+ struct old_cpio_header short_hdr;
- /* Debian hack: The type of dev_t has changed in glibc. Fixed output
- to ensure that a long int is passed to sprintf. This has been
- reported to "bug-gnu-utils@prep.ai.mit.edu". (1998/5/26) -BEM */
- sprintf (ascii_header,
- "%06ho%06lo%06lo%06lo%06lo%06lo%06lo%06lo%011lo%06lo%011lo",
- file_hdr->c_magic & 0xFFFF, (long) 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, (long) rdev & 0xFFFF,
- file_hdr->c_mtime, file_hdr->c_namesize & 0xFFFF,
- file_hdr->c_filesize);
- tape_buffered_write (ascii_header, out_des, 76L);
+ short_hdr.c_magic = 070707;
+ short_hdr.c_dev = makedev (file_hdr->c_dev_maj, file_hdr->c_dev_min);
- /* 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;
+ if ((warn_option & CPIO_WARN_TRUNCATE) && (file_hdr->c_ino >> 16) != 0)
+ error (0, 0, _("%s: truncating inode number"), file_hdr->c_name);
- short_hdr.c_magic = 070707;
- short_hdr.c_dev = makedev (file_hdr->c_dev_maj, file_hdr->c_dev_min);
+ short_hdr.c_ino = file_hdr->c_ino & 0xFFFF;
+ if (short_hdr.c_ino != file_hdr->c_ino)
+ field_width_warning (file_hdr->c_name, _("inode number"));
+
+ short_hdr.c_mode = file_hdr->c_mode & 0xFFFF;
+ if (short_hdr.c_mode != file_hdr->c_mode)
+ field_width_warning (file_hdr->c_name, _("file mode"));
+
+ short_hdr.c_uid = file_hdr->c_uid & 0xFFFF;
+ if (short_hdr.c_uid != file_hdr->c_uid)
+ field_width_warning (file_hdr->c_name, _("uid"));
+
+ short_hdr.c_gid = file_hdr->c_gid & 0xFFFF;
+ if (short_hdr.c_gid != file_hdr->c_gid)
+ field_width_warning (file_hdr->c_name, _("gid"));
+
+ short_hdr.c_nlink = file_hdr->c_nlink & 0xFFFF;
+ if (short_hdr.c_nlink != file_hdr->c_nlink)
+ field_width_warning (file_hdr->c_name, _("number of links"));
+
+ short_hdr.c_rdev = rdev;
+ 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;
+ if (short_hdr.c_namesize != file_hdr->c_namesize)
+ {
+ field_width_error (file_hdr->c_name, _("name size"));
+ return 1;
+ }
+
+ short_hdr.c_filesize = file_hdr->c_filesize;
+ if (short_hdr.c_filesize != file_hdr->c_filesize)
+ {
+ field_width_error (file_hdr->c_name, _("file size"));
+ return 1;
+ }
+
+ short_hdr.c_filesizes[0] = file_hdr->c_filesize >> 16;
+ short_hdr.c_filesizes[1] = file_hdr->c_filesize & 0xFFFF;
- if ((warn_option & CPIO_WARN_TRUNCATE) && (file_hdr->c_ino >> 16) != 0)
- error (0, 0, _("%s: truncating inode number"), file_hdr->c_name);
+ /* Output the file header. */
+ tape_buffered_write ((char *) &short_hdr, out_des, 26);
- 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;
+ /* Write file name to output. */
+ tape_buffered_write (file_hdr->c_name, out_des, file_hdr->c_namesize);
- short_hdr.c_namesize = file_hdr->c_namesize & 0xFFFF;
+ tape_pad_output (out_des, file_hdr->c_namesize + 26);
+ return 0;
+}
- short_hdr.c_filesizes[0] = file_hdr->c_filesize >> 16;
- short_hdr.c_filesizes[1] = file_hdr->c_filesize & 0xFFFF;
+
+/* Write out header FILE_HDR, including the file name, to file
+ descriptor OUT_DES. */
- /* Output the file header. */
- tape_buffered_write ((char *) &short_hdr, out_des, 26L);
+int
+write_out_header (struct new_cpio_header *file_hdr, int out_des)
+{
+ dev_t dev;
+ dev_t rdev;
+
+ switch (archive_format)
+ {
+ case arf_newascii:
+ return write_out_new_ascii_header ("070701", file_hdr, out_des);
+
+ case arf_crcascii:
+ return write_out_new_ascii_header ("070702", file_hdr, out_des);
+
+ case arf_oldascii:
+ return write_out_old_ascii_header (makedev (file_hdr->c_dev_maj,
+ file_hdr->c_dev_min),
+ makedev (file_hdr->c_rdev_maj,
+ file_hdr->c_rdev_min),
+ file_hdr, out_des);
+
+ case arf_hpoldascii:
+ hp_compute_dev (file_hdr, &dev, &rdev);
+ return write_out_old_ascii_header (dev, rdev, file_hdr, out_des);
+
+ case arf_tar:
+ case arf_ustar:
+ if (is_tar_filename_too_long (file_hdr->c_name))
+ {
+ error (0, 0, _("%s: file name too long"), file_hdr->c_name);
+ return 1;
+ }
+ write_out_tar_header (file_hdr, out_des); /* FIXME: No error checking */
+ return 0;
- /* Write file name to output. */
- tape_buffered_write (file_hdr->c_name, out_des, (long) file_hdr->c_namesize);
+ case arf_binary:
+ return write_out_binary_header (makedev (file_hdr->c_rdev_maj,
+ file_hdr->c_rdev_min),
+ file_hdr, out_des);
+
+ case arf_hpbinary:
+ hp_compute_dev (file_hdr, &dev, &rdev);
+ /* FIXME: dev ignored. Should it be? */
+ return write_out_binary_header (rdev, file_hdr, out_des);
- tape_pad_output (out_des, file_hdr->c_namesize + 26);
+ default:
+ abort ();
}
}
@@ -593,14 +753,7 @@
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;
- }
-
+
/* Copy the named file to the output. */
switch (file_hdr.c_mode & CP_IFMT)
{
@@ -613,7 +766,8 @@
file_hdr.c_dev_min)))
{
file_hdr.c_tar_linkname = otherfile;
- write_out_header (&file_hdr, out_file_des);
+ if (write_out_header (&file_hdr, out_file_des))
+ continue;
break;
}
}
@@ -643,7 +797,8 @@
file_hdr.c_filesize,
input_name.ds_string);
- write_out_header (&file_hdr, out_file_des);
+ if (write_out_header (&file_hdr, out_file_des))
+ continue;
copy_files_disk_to_tape (in_file_des, out_file_des, file_hdr.c_filesize, input_name.ds_string);
warn_if_file_changed(input_name.ds_string, file_hdr.c_filesize,
file_hdr.c_mtime);
@@ -673,7 +828,8 @@
case CP_IFDIR:
file_hdr.c_filesize = 0;
- write_out_header (&file_hdr, out_file_des);
+ if (write_out_header (&file_hdr, out_file_des))
+ continue;
break;
case CP_IFCHR:
@@ -702,14 +858,16 @@
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);
+ if (write_out_header (&file_hdr, out_file_des))
+ continue;
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);
+ if (write_out_header (&file_hdr, out_file_des))
+ continue;
break;
#ifdef CP_IFLNK
@@ -738,12 +896,14 @@
{
link_name[link_size] = '\0';
file_hdr.c_tar_linkname = link_name;
- write_out_header (&file_hdr, out_file_des);
+ if (write_out_header (&file_hdr, out_file_des))
+ continue;
}
}
else
{
- write_out_header (&file_hdr, out_file_des);
+ if (write_out_header (&file_hdr, out_file_des))
+ continue;
tape_buffered_write (link_name, out_file_des, link_size);
tape_pad_output (out_file_des, link_size);
}
--- cpio-2.6/src/extern.h
+++ cpio-2.6/src/extern.h
@@ -112,7 +112,7 @@
void print_name_with_quoting P_((char *p));
/* copyout.c */
-void write_out_header P_((struct new_cpio_header *file_hdr, int out_des));
+int write_out_header P_((struct new_cpio_header *file_hdr, int out_des));
void process_copy_out P_((void));
/* copypass.c */

3
cpio-2.6.tar.bz2 Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6e60c5c370d451605fcb23e26cc37c18182f62009282ca73bf5dea4519e17360
size 448452

11
cpio-lstat.patch Normal file
View File

@ -0,0 +1,11 @@
--- configure.ac
+++ configure.ac
@@ -92,7 +92,7 @@
AC_CONFIG_LINKS(src/fnmatch.h:headers/fnmatch.h)
fi
-AC_CHECK_FUNCS(lchown endpwent endgrent)
+AC_CHECK_FUNCS(lchown endpwent endgrent lstat)
AC_FUNC_VPRINTF
AC_FUNC_ALLOCA
AC_CHECK_LIB(nsl, gethostname, [LIBS="$LIBS -lnsl"])

177
cpio.changes Normal file
View File

@ -0,0 +1,177 @@
-------------------------------------------------------------------
Thu Sep 21 18:14:59 CEST 2006 - lmichnovic@suse.cz
- fixed typo in cpio-2.6.dif; renamed to *-mt.patch
- united suffix of patches
-------------------------------------------------------------------
Tue Sep 19 14:42:39 CEST 2006 - schwab@suse.de
- Fix missing newline after mt status.
-------------------------------------------------------------------
Mon Jul 24 15:56:13 CEST 2006 - rguenther@suse.de
- remove useless build-dependency on rsh.
-------------------------------------------------------------------
Wed Jan 25 21:30:02 CET 2006 - mls@suse.de
- converted neededforbuild to BuildRequires
-------------------------------------------------------------------
Tue Dec 6 15:24:09 CET 2005 - fehr@suse.de
- add cpio-2.6-chmodRaceC.patch and cpio-2.6-dirTraversal.patch to
fix bug #80226
- add cpio-2.6-writeOutHeaderBufferOverflow.patch to fix #133454
- add cpio-2.6-checksum.patch fix wrong checksum on 64bit archs
- add cpio-2.6-lfs.patch to support large files on 32bit archs
-------------------------------------------------------------------
Wed Aug 10 17:58:40 CEST 2005 - fehr@suse.de
- fix call to setlocale to make multibyte characters work (#98902)
-------------------------------------------------------------------
Thu Jun 30 18:59:02 CEST 2005 - fehr@suse.de
- open with O_NONBLOCK option (#94449)
-------------------------------------------------------------------
Wed May 4 15:04:04 CEST 2005 - ro@suse.de
- properly detect lstat in configure
-------------------------------------------------------------------
Wed Apr 27 12:17:58 CEST 2005 - snwint@suse.de
- fix '--sparse' option check
-------------------------------------------------------------------
Mon Apr 25 15:28:26 CEST 2005 - fehr@suse.de
- update to cpio 2.6
-------------------------------------------------------------------
Mon Jan 24 12:19:31 CET 2005 - fehr@suse.de
- fix problem with cpio not respecting umask (#50054)
-------------------------------------------------------------------
Mon Jan 19 12:44:15 CET 2004 - ro@suse.de
- fix build as user
-------------------------------------------------------------------
Sun Jan 11 11:04:05 CET 2004 - adrian@suse.de
- add %defattr
-------------------------------------------------------------------
Thu Apr 24 12:20:23 CEST 2003 - ro@suse.de
- fix install_info --delete call and move from preun to postun
-------------------------------------------------------------------
Tue Apr 15 16:47:28 CEST 2003 - coolo@suse.de
- use BuildRoot
-------------------------------------------------------------------
Fri Feb 7 15:19:46 CET 2003 - fehr@suse.de
- Use %install_info macro
-------------------------------------------------------------------
Tue Sep 17 17:34:28 CEST 2002 - ro@suse.de
- removed bogus self-provides
-------------------------------------------------------------------
Tue Aug 13 21:29:02 CEST 2002 - mfabian@suse.de
- add cpio-2.5-i18n-0.1.patch received from
"Mitsuru Chinen" <CHINEN@jp.ibm.com>
The patch just adds a setlocale (LC_ALL, "").
-------------------------------------------------------------------
Sun Jul 28 09:10:20 CEST 2002 - kukuk@suse.de
- remove unused tetex from neededforbuild
-------------------------------------------------------------------
Fri Jul 5 10:26:35 CEST 2002 - fehr@suse.de
- update to new version 2.5
-------------------------------------------------------------------
Mon Dec 3 14:48:33 CET 2001 - fehr@suse.de
- make the -c switch comatible to SVR4 (and compatible to RedHat)
- fix the man page accordingly
- add rsh to #needfobuild to allow remote file access again (#12543)
-------------------------------------------------------------------
Sun Dec 3 16:07:35 CET 2000 - schwab@suse.de
- Fix a few bugs and typos.
-------------------------------------------------------------------
Tue Nov 28 11:32:08 MET 2000 - fehr@suse.de
- add compile options for LFS
-------------------------------------------------------------------
Mon Apr 17 12:01:34 MEST 2000 - fehr@suse.de
- move cpio binary to /bin for compatibility with RedHat
-------------------------------------------------------------------
Fri Feb 25 12:02:26 CET 2000 - kukuk@suse.de
- remove Makefile.Linux
- use _infodir/_mandir
-------------------------------------------------------------------
Mon Sep 13 17:23:57 CEST 1999 - bs@suse.de
- ran old prepare_spec on spec file to switch to new prepare_spec.
-------------------------------------------------------------------
Thu Sep 2 18:29:04 MEST 1999 - fehr@suse.de
- Fix patch for broken header (cast to short instead of int)
-------------------------------------------------------------------
Wed Aug 4 13:19:24 MEST 1999 - kukuk@suse.de
- Add patch for broken header in oldascii format
-------------------------------------------------------------------
Tue Sep 22 12:13:34 MEST 1998 - ro@suse.de
- define _GNU_SOURCE for glibc where including getopt
-------------------------------------------------------------------
Tue Sep 1 11:52:58 MEST 1998 - ro@suse.de
- fixed strdup-macro problem
----------------------------------------------------------------------------
Thu Jun 5 11:08:05 MEST 1997 - florian@suse.de
- go through the list of regex in a more suitable way (from ma@suse.de)
----------------------------------------------------------------------------
Sun Apr 13 23:04:29 MEST 1997 - florian@suse.de
- update to new version 2.4.2
- add Linux patches from RedHat
- add patches from gnu.utils.bugs

185
cpio.spec Normal file
View File

@ -0,0 +1,185 @@
#
# spec file for package cpio (Version 2.6)
#
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
# package are under the same license as the package itself.
#
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
# norootforbuild
Name: cpio
URL: http://www.gnu.org/software/cpio/cpio.html
License: Other License(s), see package, GPL
Group: Productivity/Archiving/Compression
Autoreqprov: on
Version: 2.6
Release: 26
Summary: A Backup and Archiving Utility
Source: cpio-2.6.tar.bz2
Patch: cpio-2.6-mt.patch
Patch1: use_new_ascii_format.patch
Patch2: use_sbin_rmt.patch
Patch3: fix_umask.patch
Patch4: sparse.patch
Patch5: cpio-lstat.patch
Patch6: open_nonblock.patch
Patch7: cpio-2.6-dirTraversal.patch
Patch8: cpio-2.6-chmodRaceC.patch
Patch9: cpio-2.6-lfs.patch
Patch10: cpio-2.6-checksum.patch
Patch11: cpio-2.6-writeOutHeaderBufferOverflow.patch
PreReq: %install_info_prereq
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
This is GNU cpio, a program to manage archives of files. This package
also includes 'mt', a tape drive control program. Cpio copies files
into or out of a cpio or tar archive. An archive is a file that
contains other files plus information about them, such as their
pathname, owner, time stamps, and access permissions. The archive can
be another file on the disk, a magnetic tape, or a pipe.
This package normally includes the program 'rmt', which provides remote
tape drive control. Because there is a compatible 'rmt' in the 'dump'
package, 'rmt' is not included in this package. If you are planning to
use the remote tape features provided by cpio, install the 'dump'
package as well.
Authors:
--------
David J. MacKenzie <djm@gnu.ai.mit.edu>
Jim Meyering <meyering@na-net.ornl.gov>
%prep
%setup
%patch
%patch1
%patch2
%patch3
%patch4
%patch5
%patch6
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
chmod 755 .
chmod u+w *
chmod a+r *
%build
autoreconf --force --install
CFLAGS="$RPM_OPT_FLAGS -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE" \
./configure DEFAULT_RMT_DIR=/sbin \
--prefix=/usr \
--mandir=%{_mandir} \
--infodir=%{_infodir} \
--libdir=%{_libdir}
make
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/{usr/bin,bin}
make prefix=$RPM_BUILD_ROOT/usr infodir=$RPM_BUILD_ROOT/%_infodir mandir=$RPM_BUILD_ROOT/%_mandir install
mv $RPM_BUILD_ROOT/usr/bin/cpio $RPM_BUILD_ROOT/bin
ln -sf ../../bin/cpio $RPM_BUILD_ROOT/usr/bin/cpio
%post
%install_info --info-dir=%{_infodir} %{_infodir}/%{name}.info.gz
%postun
%install_info_delete --info-dir=%{_infodir} %{_infodir}/%{name}.info.gz
%files
%defattr(-,root,root)
/bin/cpio
/usr/bin/cpio
/usr/bin/mt
%doc %{_infodir}/cpio.info.gz
%doc %{_mandir}/man1/cpio.1.gz
%doc %{_mandir}/man1/mt.1.gz
/usr/share/locale/*/LC_MESSAGES/cpio.mo
%changelog -n cpio
* Thu Sep 21 2006 - lmichnovic@suse.cz
- fixed typo in cpio-2.6.dif; renamed to *-mt.patch
- united suffix of patches
* Tue Sep 19 2006 - schwab@suse.de
- Fix missing newline after mt status.
* Mon Jul 24 2006 - rguenther@suse.de
- remove useless build-dependency on rsh.
* Wed Jan 25 2006 - mls@suse.de
- converted neededforbuild to BuildRequires
* Tue Dec 06 2005 - fehr@suse.de
- add cpio-2.6-chmodRaceC.patch and cpio-2.6-dirTraversal.patch to
fix bug #80226
- add cpio-2.6-writeOutHeaderBufferOverflow.patch to fix #133454
- add cpio-2.6-checksum.patch fix wrong checksum on 64bit archs
- add cpio-2.6-lfs.patch to support large files on 32bit archs
* Wed Aug 10 2005 - fehr@suse.de
- fix call to setlocale to make multibyte characters work (#98902)
* Thu Jun 30 2005 - fehr@suse.de
- open with O_NONBLOCK option (#94449)
* Wed May 04 2005 - ro@suse.de
- properly detect lstat in configure
* Wed Apr 27 2005 - snwint@suse.de
- fix '--sparse' option check
* Mon Apr 25 2005 - fehr@suse.de
- update to cpio 2.6
* Mon Jan 24 2005 - fehr@suse.de
- fix problem with cpio not respecting umask (#50054)
* Mon Jan 19 2004 - ro@suse.de
- fix build as user
* Sun Jan 11 2004 - adrian@suse.de
- add %%defattr
* Thu Apr 24 2003 - ro@suse.de
- fix install_info --delete call and move from preun to postun
* Tue Apr 15 2003 - coolo@suse.de
- use BuildRoot
* Fri Feb 07 2003 - fehr@suse.de
- Use %%install_info macro
* Tue Sep 17 2002 - ro@suse.de
- removed bogus self-provides
* Tue Aug 13 2002 - mfabian@suse.de
- add cpio-2.5-i18n-0.1.patch received from
"Mitsuru Chinen" <CHINEN@jp.ibm.com>
The patch just adds a setlocale (LC_ALL, "").
* Sun Jul 28 2002 - kukuk@suse.de
- remove unused tetex from neededforbuild
* Fri Jul 05 2002 - fehr@suse.de
- update to new version 2.5
* Mon Dec 03 2001 - fehr@suse.de
- make the -c switch comatible to SVR4 (and compatible to RedHat)
- fix the man page accordingly
- add rsh to #needfobuild to allow remote file access again (#12543)
* Sun Dec 03 2000 - schwab@suse.de
- Fix a few bugs and typos.
* Tue Nov 28 2000 - fehr@suse.de
- add compile options for LFS
* Mon Apr 17 2000 - fehr@suse.de
- move cpio binary to /bin for compatibility with RedHat
* Fri Feb 25 2000 - kukuk@suse.de
- remove Makefile.Linux
- use _infodir/_mandir
* Mon Sep 13 1999 - bs@suse.de
- ran old prepare_spec on spec file to switch to new prepare_spec.
* Thu Sep 02 1999 - fehr@suse.de
- Fix patch for broken header (cast to short instead of int)
* Wed Aug 04 1999 - kukuk@suse.de
- Add patch for broken header in oldascii format
* Tue Sep 22 1998 - ro@suse.de
- define _GNU_SOURCE for glibc where including getopt
* Tue Sep 01 1998 - ro@suse.de
- fixed strdup-macro problem
* Thu Jun 05 1997 - florian@suse.de
- go through the list of regex in a more suitable way (from ma@suse.de)
* Sun Apr 13 1997 - florian@suse.de
- update to new version 2.4.2
- add Linux patches from RedHat
- add patches from gnu.utils.bugs

18
fix_umask.patch Normal file
View File

@ -0,0 +1,18 @@
--- src/main.c.orig Mon Jul 10 16:06:34 2000
+++ src/main.c Mon Jul 10 16:06:47 2000
@@ -498,7 +498,6 @@
char *argv[];
{
program_name = argv[0];
- umask (0);
#ifdef __TURBOC__
_fmode = O_BINARY; /* Put stdin and stdout in binary mode. */
@@ -509,6 +508,7 @@
#endif
process_args (argc, argv);
+ umask (0);
initialize_buffers ();

34
open_nonblock.patch Normal file
View File

@ -0,0 +1,34 @@
--- src/mt.c
+++ src/mt.c 2005/06/30 16:51:10
@@ -314,9 +314,9 @@
|| (operation == MTERASE)
#endif
)
- tapedesc = rmtopen (tapedev, O_WRONLY, 0, rsh_command_option);
+ tapedesc = rmtopen (tapedev, O_WRONLY|O_NONBLOCK, 0, rsh_command_option);
else
- tapedesc = rmtopen (tapedev, O_RDONLY, 0, rsh_command_option);
+ tapedesc = rmtopen (tapedev, O_RDONLY|O_NONBLOCK, 0, rsh_command_option);
if (tapedesc == -1)
error (1, errno, "%s", tapedev);
check_type (tapedev, tapedesc);
--- src/util.c
+++ src/util.c 2005/06/30 16:51:51
@@ -800,14 +800,14 @@
copy_in = process_copy_in;
if (copy_function == copy_in)
- fd = rmtopen (file, O_RDONLY | O_BINARY, 0666, rsh_command_option);
+ fd = rmtopen (file, O_RDONLY | O_BINARY | O_NONBLOCK, 0666, rsh_command_option);
else
{
if (!append_flag)
- fd = rmtopen (file, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666,
+ fd = rmtopen (file, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_NONBLOCK, 0666,
rsh_command_option);
else
- fd = rmtopen (file, O_RDWR | O_BINARY, 0666, rsh_command_option);
+ fd = rmtopen (file, O_RDWR | O_BINARY | O_NONBLOCK, 0666, rsh_command_option);
}
return fd;

0
ready Normal file
View File

18
sparse.patch Normal file
View File

@ -0,0 +1,18 @@
--- src/main.c
+++ src/main.c
@@ -585,7 +585,6 @@
CHECK_USAGE(reset_time_flag, "--reset", "--extract");
CHECK_USAGE(xstat != lstat, "--dereference", "--extract");
CHECK_USAGE(append_flag, "--append", "--extract");
- CHECK_USAGE(sparse_flag, "--sparse", "--extract");
CHECK_USAGE(output_archive_name, "-O", "--extract");
if (to_stdout_option)
{
@@ -633,6 +632,7 @@
CHECK_USAGE(rename_batch_file, "--rename-batch-file", "--create");
CHECK_USAGE(no_abs_paths_flag, "--no-absolute-pathnames", "--create");
+ CHECK_USAGE(sparse_flag, "--sparse", "--create");
CHECK_USAGE(input_archive_name, "-I", "--create");
if (archive_name && output_archive_name)
USAGE_ERROR ((0, 0, _("Both -O and -F are used in copy-out mode")));

View File

@ -0,0 +1,22 @@
--- doc/cpio.info
+++ doc/cpio.info 2005/04/25 12:11:02
@@ -261,7 +261,8 @@
Set the I/O block size to BLOCK-SIZE * 512 bytes.
`-c'
- Use the old portable (ASCII) archive format.
+ Identical to "-H newc", use the new (SVR4) portable format.
+ If you wish the old portable (ASCII) archive format, use "-H odc" instead.
`-C IO-SIZE, --io-size=IO-SIZE'
Set the I/O block size to IO-SIZE bytes.
--- src/main.c
+++ src/main.c 2005/04/25 12:12:09
@@ -302,6 +302,7 @@
case 'c': /* Use the old portable ASCII format. */
if (archive_format != arf_unknown)
USAGE_ERROR ((0, 0, _("Archive format multiply defined")));
+#define SVR4_COMPAT
#ifdef SVR4_COMPAT
archive_format = arf_newascii; /* -H newc. */
#else

20
use_sbin_rmt.patch Normal file
View File

@ -0,0 +1,20 @@
--- lib/rtapelib.c
+++ lib/rtapelib.c 2005/04/25 12:16:06
@@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-/* The man page rmt(8) for /etc/rmt documents the remote mag tape protocol
+/* The man page rmt(8) for /sbin/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
@@ -265,7 +265,7 @@
#if WITH_REXEC
-/* Execute /etc/rmt as user USER on remote system HOST using rexec.
+/* Execute /sbin/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 zero, use the current username.