Date: Sat, 14 Oct 2000 01:36:24 +0300 (IDT) From: roman@xpert.com To: FreeBSD-gnats-submit@freebsd.org Subject: ports/21964: [PATCH] for archivers/unarj - create subdirs + multi-volume hndl. Message-ID: <200010132236.e9DMaOx56081@alchemy.oven.org>
next in thread | raw e-mail | index | archive | help
>Number: 21964 >Category: ports >Synopsis: unarj doesn't create directories nor handle multi-volumes >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-ports >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Oct 13 16:40:01 PDT 2000 >Closed-Date: >Last-Modified: >Originator: Roman Shterenzon >Release: FreeBSD 4.1.1-STABLE i386 >Organization: >Environment: Version 2.43 of unarj. AFAIK version 2.41 which was then downloaded from sunsite had the create directory patch applied. >Description: The archivers/unarj port doesn't create subdirectories listed in archives, nor does it handle multi-volume archives making it useful to very limited degree. I was facing it when I tried to back up a bunch of old diskettes. It was nearly unusable in it's current state. I contacted ache@freebsd.org but had no reply from him since then. >How-To-Repeat: Try to extract arj file with directories or try to extract a multivolume archive. >Fix: The RedHat's Linux distribution ships with unarj patched for creating directories. (I include the patch). The multivolume issue was fixed by some other person, and it's hosted here: http://www.home.unix-ag.org/arne/unarj/ (I attach it as well). All theses changes were tested by me on multiple archives and were found to be ok. Included also patch-aa and patch-ad - for direct inclusion in the ports. (I merged them). This is the patch for subdirectory creation: diff -urN unarj-2.43/unarj.c unarj-2.43.new/unarj.c --- unarj-2.43/unarj.c Mon Sep 29 14:00:24 1997 +++ unarj-2.43.new/unarj.c Tue Aug 8 15:57:58 2000 @@ -42,7 +42,8 @@ * 02/17/93 R. Jung Added archive modified date support. * 01/22/94 R. Jung Changed copyright message. * 07/29/96 R. Jung Added "/" to list of path separators. - * + * 08/08/00 P. Knirsch Added subdirectory creation for the x command. Also + * fixed some compiler warnings. */ #include "unarj.h" @@ -51,6 +52,10 @@ #include <stdlib.h> #include <string.h> #include <ctype.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> +#include <unistd.h> #else /* !MODERN */ extern void free(); extern void exit(); @@ -712,6 +717,8 @@ extract() { char name[FNAME_MAX]; + char dir[FNAME_MAX]; + char *pos; if (check_flags()) { @@ -730,6 +737,21 @@ if (host_os != OS) default_case_path(name); + + + /* + 8/8/2000 Phil Knirsch: Bugfix to create subdirectories. Unarj didn't + do this for a long time, so it's finally fixed. + */ + pos = strchr(name, PATH_CHAR); + + while (pos != NULL) + { + strncpy(dir, name, pos-name); + dir[pos-name] = '\0'; + mkdir(dir, 0777); + pos = strchr(pos+1, PATH_CHAR); + } if (file_exists(name)) { diff -urN unarj-2.43/unarj.h unarj-2.43.new/unarj.h --- unarj-2.43/unarj.h Mon Sep 29 14:00:24 1997 +++ unarj-2.43.new/unarj.h Tue Aug 8 15:19:33 2000 @@ -198,90 +198,90 @@ /* end of environmental defines */ /* ********************************************************* */ -/* ********************************************************* */ -/* -/* Structure of archive main header (low order byte first): -/* -/* 2 header id (comment and local file) = 0x60, 0xEA -/* 2 basic header size (from 'first_hdr_size' thru 'comment' below) -/* = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1 -/* = 0 if end of archive -/* -/* 1 first_hdr_size (size up to 'extra data') -/* 1 archiver version number -/* 1 minimum archiver version to extract -/* 1 host OS (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MACDOS) -/* (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT) -/* (9 = VAX VMS) -/* 1 arj flags (0x01 = GARBLED_FLAG, 0x02 = OLD_SECURED_FLAG) -/* (0x04 = VOLUME_FLAG, 0x08 = EXTFILE_FLAG) -/* (0x10 = PATHSYM_FLAG, 0x20 = BACKUP_FLAG) -/* (0x40 = SECURED_FLAG) -/* 1 arj security version (2 = current) -/* 1 file type (2 = comment header) -/* 1 ? ] -/* 4 date time stamp created -/* 4 date time stamp modified -/* 4 archive size up to the end of archive marker -/* 4 file position of security envelope data -/* 2 entryname position in filename -/* 2 length in bytes of trailing security data -/* 2 host data -/* ? extra data -/* -/* ? archive filename (null-terminated) -/* ? archive comment (null-terminated) -/* -/* 4 basic header CRC -/* -/* 2 1st extended header size (0 if none) -/* ? 1st extended header -/* 4 1st extended header's CRC -/* ... -/* -/* -/* Structure of archive file header (low order byte first): -/* -/* 2 header id (comment and local file) = 0x60, 0xEA -/* 2 basic header size (from 'first_hdr_size' thru 'comment' below) -/* = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1 -/* = 0 if end of archive -/* -/* 1 first_hdr_size (size up to 'extra data') -/* 1 archiver version number -/* 1 minimum archiver version to extract -/* 1 host OS (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MACDOS) -/* (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT) -/* (9 = VAX VMS) -/* 1 arj flags (0x01 = GARBLED_FLAG, 0x02 = NOT USED) -/* (0x04 = VOLUME_FLAG, 0x08 = EXTFILE_FLAG) -/* (0x10 = PATHSYM_FLAG, 0x20 = BACKUP_FLAG) -/* (0x40 = NOT USED) -/* 1 method (0 = stored, 1 = compressed most ... 4 compressed fastest) -/* 1 file type (0 = binary, 1 = text, 2 = comment header, 3 = directory) -/* (4 = label) -/* 1 garble password modifier -/* 4 date time stamp modified -/* 4 compressed size -/* 4 original size -/* 4 original file's CRC -/* 2 entryname position in filename -/* 2 file access mode -/* 2 host data -/* ? extra data -/* 4 bytes for extended file position -/* -/* ? filename (null-terminated) -/* ? comment (null-terminated) -/* -/* 4 basic header CRC -/* -/* 2 1st extended header size (0 if none) -/* ? 1st extended header -/* 4 1st extended header's CRC -/* ... -/* ? compressed file /* + * + * Structure of archive main header (low order byte first): + * + * 2 header id (comment and local file) = 0x60, 0xEA + * 2 basic header size (from 'first_hdr_size' thru 'comment' below) + * = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1 + * = 0 if end of archive + * + * 1 first_hdr_size (size up to 'extra data') + * 1 archiver version number + * 1 minimum archiver version to extract + * 1 host OS (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MACDOS) + * (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT) + * (9 = VAX VMS) + * 1 arj flags (0x01 = GARBLED_FLAG, 0x02 = OLD_SECURED_FLAG) + * (0x04 = VOLUME_FLAG, 0x08 = EXTFILE_FLAG) + * (0x10 = PATHSYM_FLAG, 0x20 = BACKUP_FLAG) + * (0x40 = SECURED_FLAG) + * 1 arj security version (2 = current) + * 1 file type (2 = comment header) + * 1 ? ] + * 4 date time stamp created + * 4 date time stamp modified + * 4 archive size up to the end of archive marker + * 4 file position of security envelope data + * 2 entryname position in filename + * 2 length in bytes of trailing security data + * 2 host data + * ? extra data + * + * ? archive filename (null-terminated) + * ? archive comment (null-terminated) + * + * 4 basic header CRC + * + * 2 1st extended header size (0 if none) + * ? 1st extended header + * 4 1st extended header's CRC + * ... + * + * + * Structure of archive file header (low order byte first): + * + * 2 header id (comment and local file) = 0x60, 0xEA + * 2 basic header size (from 'first_hdr_size' thru 'comment' below) + * = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1 + * = 0 if end of archive + * + * 1 first_hdr_size (size up to 'extra data') + * 1 archiver version number + * 1 minimum archiver version to extract + * 1 host OS (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MACDOS) + * (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT) + * (9 = VAX VMS) + * 1 arj flags (0x01 = GARBLED_FLAG, 0x02 = NOT USED) + * (0x04 = VOLUME_FLAG, 0x08 = EXTFILE_FLAG) + * (0x10 = PATHSYM_FLAG, 0x20 = BACKUP_FLAG) + * (0x40 = NOT USED) + * 1 method (0 = stored, 1 = compressed most ... 4 compressed fastest) + * 1 file type (0 = binary, 1 = text, 2 = comment header, 3 = directory) + * (4 = label) + * 1 garble password modifier + * 4 date time stamp modified + * 4 compressed size + * 4 original size + * 4 original file's CRC + * 2 entryname position in filename + * 2 file access mode + * 2 host data + * ? extra data + * 4 bytes for extended file position + * + * ? filename (null-terminated) + * ? comment (null-terminated) + * + * 4 basic header CRC + * + * 2 1st extended header size (0 if none) + * ? 1st extended header + * 4 1st extended header's CRC + * ... + * ? compressed file + */ /* ********************************************************* */ /* ********************************************************* */ /* */ --------------------------------end of subdir patch--------------------------- ----------------------------begin of multivolume patch------------------------ diff -ur unarj241a.orig/unarj.c unarj241a/unarj.c --- unarj241a.orig/unarj.c Sun Apr 10 12:00:56 1994 +++ unarj241a/unarj.c Mon Oct 9 02:47:30 2000 @@ -18,29 +18,30 @@ * structural point of view. * * Modification history: - * Date Programmer Description of modification. - * 04/05/91 R. Jung Rewrote code. - * 04/23/91 M. Adler Portabilized. - * 04/29/91 R. Jung Added l command. Removed 16 bit dependency in - * fillbuf(). - * 05/19/91 R. Jung Fixed extended header skipping code. - * 05/25/91 R. Jung Improved find_header(). - * 06/03/91 R. Jung Changed arguments in get_mode_str() and - * set_ftime_mode(). - * 06/19/81 R. Jung Added two more %c in printf() in list_arc(). - * 07/07/91 R. Jung Added default_case_path() to extract(). - * Added strlower(). - * 07/20/91 R. Jung Changed uint ratio() to static uint ratio(). - * 07/21/91 R. Jung Added #ifdef VMS. - * 08/28/91 R. Jung Changed M_DIFFHOST message. - * 08/31/91 R. Jung Added changes to support MAC THINK_C compiler - * per Eric Larson. - * 10/07/91 R. Jung Added missing ; to THINK_C additions. - * 11/11/91 R. Jung Added host_os test to fwrite_txt_crc(). - * 11/24/91 R. Jung Added more error_count processing. - * 12/03/91 R. Jung Added backup file processing. - * 02/17/93 R. Jung Added archive modified date support. - * 940410 aeb@cwi.nl Added automatic directory creation for x mode. + * Date Programmer Description of modification. + * 04/05/91 R. Jung Rewrote code. + * 04/23/91 M. Adler Portabilized. + * 04/29/91 R. Jung Added l command. Removed 16 bit dependency in + * fillbuf(). + * 05/19/91 R. Jung Fixed extended header skipping code. + * 05/25/91 R. Jung Improved find_header(). + * 06/03/91 R. Jung Changed arguments in get_mode_str() and + * set_ftime_mode(). + * 06/19/81 R. Jung Added two more %c in printf() in list_arc(). + * 07/07/91 R. Jung Added default_case_path() to extract(). + * Added strlower(). + * 07/20/91 R. Jung Changed uint ratio() to static uint ratio(). + * 07/21/91 R. Jung Added #ifdef VMS. + * 08/28/91 R. Jung Changed M_DIFFHOST message. + * 08/31/91 R. Jung Added changes to support MAC THINK_C compiler + * per Eric Larson. + * 10/07/91 R. Jung Added missing ; to THINK_C additions. + * 11/11/91 R. Jung Added host_os test to fwrite_txt_crc(). + * 11/24/91 R. Jung Added more error_count processing. + * 12/03/91 R. Jung Added backup file processing. + * 02/17/93 R. Jung Added archive modified date support. + * 940410 aeb@cwi.nl Added automatic directory creation for x mode. + * 980525 arne@unix-ag.org Added handling of multiple volume archives. * */ @@ -119,7 +120,7 @@ NULL }; -char M_VERSION [] = "UNARJ (Demo version) 2.41a Copyright (c) 1991-93 Robert K Jung\n\n"; +char M_VERSION [] = "UNARJ (Demo version) 2.41b Copyright (c) 1991-93 Robert K Jung\n\n"; char M_ARCDATE [] = "Archive created: %s"; char M_ARCDATEM[] = ", modified: %s"; @@ -137,6 +138,7 @@ char M_ERRORCNT[] = "%sFound %5d error(s)!"; char M_EXTRACT [] = "Extracting %-25s"; char M_FEXISTS [] = "%-25s exists, "; +char M_FNEXISTS[] = "%-25s doesn't exist, unable to extend, "; char M_HEADRCRC[] = "Header CRC error!"; char M_NBRFILES[] = "%5d file(s)\n"; char M_NOMEMORY[] = "Out of memory"; @@ -148,6 +150,7 @@ char M_UNKNMETH[] = "Unsupported method: %d, "; char M_UNKNTYPE[] = "Unsupported file type: %d, "; char M_UNKNVERS[] = "Unsupported version: %d, "; +char M_WRONGPOS[] = "%-25s wrong position to continue, "; #define get_crc() get_longword() #define fget_crc(f) fget_longword(f) @@ -215,6 +218,7 @@ static uchar *get_ptr; static UCRC file_crc; static UCRC header_crc; +static ulong ext_file_pos; static long first_hdr_pos; static long torigsize; @@ -223,6 +227,7 @@ static int clock_inx; static char *writemode[2] = { "wb", "w" }; +static char *appendmode[2] = { "ab", "a" }; static UCRC crctable[UCHAR_MAX + 1]; @@ -622,6 +627,7 @@ entry_pos = get_word(); file_mode = get_word(); host_data = get_word(); + ext_file_pos = get_longword(); hdr_filename = (char *)&header[first_hdr_size]; strncopy(filename, hdr_filename, sizeof(filename)); @@ -752,7 +758,7 @@ if (host_os != OS) default_case_path(name); - if (file_exists(name)) + if (file_exists(name) && !(arj_flags & EXTFILE_FLAG)) { printf(M_FEXISTS, name); printf(M_SKIPPED, name); @@ -760,11 +766,22 @@ error_count++; return 0; } + if (!file_exists(name) && (arj_flags & EXTFILE_FLAG)) + { + printf(M_FNEXISTS, name); + printf(M_SKIPPED, name); + skip(); + error_count++; + return 0; + } #ifdef UNIX if (command == 'X') create_required_dirs(name); #endif - outfile = file_open(name, writemode[file_type & 1]); + if(arj_flags & EXTFILE_FLAG) + outfile = file_open(name, appendmode[file_type & 1]); + else + outfile = file_open(name, writemode[file_type & 1]); if (outfile == NULL) { printf(M_CANTOPEN, name); @@ -773,9 +790,21 @@ error_count++; return 0; } + if( (arj_flags & EXTFILE_FLAG) && (ftell(outfile)!=ext_file_pos) ) { + printf(M_WRONGPOS, name); + printf(M_SKIPPED, name); + skip(); + error_count++; + return 0; + } + printf(M_EXTRACT, name); if (host_os != OS && file_type == BINARY_TYPE) printf(M_DIFFHOST); + if(arj_flags & EXTFILE_FLAG) + printf(" (continued)"); + if(arj_flags & VOLUME_FLAG) + printf(" (cont'd in next .arj)"); printf(" "); crc = CRC_MASK; ----------------------------end of multivolume patch-------------------------- ----------------------------begin of patch-aa -------------------------------- --- unarj.h.orig Mon Oct 9 03:36:29 2000 +++ unarj.h Mon Oct 9 03:31:26 2000 @@ -106,8 +106,12 @@ #endif typedef unsigned char uchar; /* 8 bits or more */ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) typedef unsigned int uint; /* 16 - 32 bits or more */ typedef unsigned short ushort; /* 16 bits or more */ +#else +# include <sys/types.h> +#endif typedef unsigned long ulong; /* 32 bits or more */ #define USHRT_BIT (CHAR_BIT * sizeof(ushort)) @@ -198,90 +202,90 @@ /* end of environmental defines */ /* ********************************************************* */ -/* ********************************************************* */ -/* -/* Structure of archive main header (low order byte first): -/* -/* 2 header id (comment and local file) = 0x60, 0xEA -/* 2 basic header size (from 'first_hdr_size' thru 'comment' below) -/* = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1 -/* = 0 if end of archive -/* -/* 1 first_hdr_size (size up to 'extra data') -/* 1 archiver version number -/* 1 minimum archiver version to extract -/* 1 host OS (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MACDOS) -/* (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT) -/* (9 = VAX VMS) -/* 1 arj flags (0x01 = GARBLED_FLAG, 0x02 = OLD_SECURED_FLAG) -/* (0x04 = VOLUME_FLAG, 0x08 = EXTFILE_FLAG) -/* (0x10 = PATHSYM_FLAG, 0x20 = BACKUP_FLAG) -/* (0x40 = SECURED_FLAG) -/* 1 arj security version (2 = current) -/* 1 file type (2 = comment header) -/* 1 ? ] -/* 4 date time stamp created -/* 4 date time stamp modified -/* 4 archive size up to the end of archive marker -/* 4 file position of security envelope data -/* 2 entryname position in filename -/* 2 length in bytes of trailing security data -/* 2 host data -/* ? extra data -/* -/* ? archive filename (null-terminated) -/* ? archive comment (null-terminated) -/* -/* 4 basic header CRC -/* -/* 2 1st extended header size (0 if none) -/* ? 1st extended header -/* 4 1st extended header's CRC -/* ... -/* -/* -/* Structure of archive file header (low order byte first): -/* -/* 2 header id (comment and local file) = 0x60, 0xEA -/* 2 basic header size (from 'first_hdr_size' thru 'comment' below) -/* = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1 -/* = 0 if end of archive -/* -/* 1 first_hdr_size (size up to 'extra data') -/* 1 archiver version number -/* 1 minimum archiver version to extract -/* 1 host OS (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MACDOS) -/* (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT) -/* (9 = VAX VMS) -/* 1 arj flags (0x01 = GARBLED_FLAG, 0x02 = NOT USED) -/* (0x04 = VOLUME_FLAG, 0x08 = EXTFILE_FLAG) -/* (0x10 = PATHSYM_FLAG, 0x20 = BACKUP_FLAG) -/* (0x40 = NOT USED) -/* 1 method (0 = stored, 1 = compressed most ... 4 compressed fastest) -/* 1 file type (0 = binary, 1 = text, 2 = comment header, 3 = directory) -/* (4 = label) -/* 1 garble password modifier -/* 4 date time stamp modified -/* 4 compressed size -/* 4 original size -/* 4 original file's CRC -/* 2 entryname position in filename -/* 2 file access mode -/* 2 host data -/* ? extra data -/* 4 bytes for extended file position -/* -/* ? filename (null-terminated) -/* ? comment (null-terminated) -/* -/* 4 basic header CRC -/* -/* 2 1st extended header size (0 if none) -/* ? 1st extended header -/* 4 1st extended header's CRC -/* ... -/* ? compressed file /* + * + * Structure of archive main header (low order byte first): + * + * 2 header id (comment and local file) = 0x60, 0xEA + * 2 basic header size (from 'first_hdr_size' thru 'comment' below) + * = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1 + * = 0 if end of archive + * + * 1 first_hdr_size (size up to 'extra data') + * 1 archiver version number + * 1 minimum archiver version to extract + * 1 host OS (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MACDOS) + * (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT) + * (9 = VAX VMS) + * 1 arj flags (0x01 = GARBLED_FLAG, 0x02 = OLD_SECURED_FLAG) + * (0x04 = VOLUME_FLAG, 0x08 = EXTFILE_FLAG) + * (0x10 = PATHSYM_FLAG, 0x20 = BACKUP_FLAG) + * (0x40 = SECURED_FLAG) + * 1 arj security version (2 = current) + * 1 file type (2 = comment header) + * 1 ? ] + * 4 date time stamp created + * 4 date time stamp modified + * 4 archive size up to the end of archive marker + * 4 file position of security envelope data + * 2 entryname position in filename + * 2 length in bytes of trailing security data + * 2 host data + * ? extra data + * + * ? archive filename (null-terminated) + * ? archive comment (null-terminated) + * + * 4 basic header CRC + * + * 2 1st extended header size (0 if none) + * ? 1st extended header + * 4 1st extended header's CRC + * ... + * + * + * Structure of archive file header (low order byte first): + * + * 2 header id (comment and local file) = 0x60, 0xEA + * 2 basic header size (from 'first_hdr_size' thru 'comment' below) + * = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1 + * = 0 if end of archive + * + * 1 first_hdr_size (size up to 'extra data') + * 1 archiver version number + * 1 minimum archiver version to extract + * 1 host OS (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MACDOS) + * (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT) + * (9 = VAX VMS) + * 1 arj flags (0x01 = GARBLED_FLAG, 0x02 = NOT USED) + * (0x04 = VOLUME_FLAG, 0x08 = EXTFILE_FLAG) + * (0x10 = PATHSYM_FLAG, 0x20 = BACKUP_FLAG) + * (0x40 = NOT USED) + * 1 method (0 = stored, 1 = compressed most ... 4 compressed fastest) + * 1 file type (0 = binary, 1 = text, 2 = comment header, 3 = directory) + * (4 = label) + * 1 garble password modifier + * 4 date time stamp modified + * 4 compressed size + * 4 original size + * 4 original file's CRC + * 2 entryname position in filename + * 2 file access mode + * 2 host data + * ? extra data + * 4 bytes for extended file position + * + * ? filename (null-terminated) + * ? comment (null-terminated) + * + * 4 basic header CRC + * + * 2 1st extended header size (0 if none) + * ? 1st extended header + * 4 1st extended header's CRC + * ... + * ? compressed file + */ /* ********************************************************* */ /* ********************************************************* */ /* */ ----------------------------end of patch-aa ---------------------------------- ----------------------------begin of patch-ad -------------------------------- --- unarj.c.orig Mon Oct 9 03:34:19 2000 +++ unarj.c Mon Oct 9 03:35:58 2000 @@ -42,7 +42,8 @@ * 02/17/93 R. Jung Added archive modified date support. * 01/22/94 R. Jung Changed copyright message. * 07/29/96 R. Jung Added "/" to list of path separators. - * + * 08/08/00 P. Knirsch Added subdirectory creation for the x command. Also + * fixed some compiler warnings. */ #include "unarj.h" @@ -51,6 +52,12 @@ #include <stdlib.h> #include <string.h> #include <ctype.h> +#ifdef UNIX +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> +#include <unistd.h> +#endif #else /* !MODERN */ extern void free(); extern void exit(); @@ -137,6 +144,7 @@ char M_ERRORCNT[] = "%sFound %5d error(s)!"; char M_EXTRACT [] = "Extracting %-25s"; char M_FEXISTS [] = "%-25s exists, "; +char M_FNEXISTS[] = "%-25s doesn't exist, unable to extend, "; char M_HEADRCRC[] = "Header CRC error!"; char M_NBRFILES[] = "%5d file(s)\n"; char M_NOMEMORY[] = "Out of memory"; @@ -148,6 +156,7 @@ char M_UNKNMETH[] = "Unsupported method: %d, "; char M_UNKNTYPE[] = "Unsupported file type: %d, "; char M_UNKNVERS[] = "Unsupported version: %d, "; +char M_WRONGPOS[] = "%-25s wrong position to continue, "; #define get_crc() get_longword() #define fget_crc(f) fget_longword(f) @@ -215,6 +224,7 @@ static uchar *get_ptr; static UCRC file_crc; static UCRC header_crc; +static ulong ext_file_pos; static long first_hdr_pos; static long torigsize; @@ -223,6 +233,7 @@ static int clock_inx; static char *writemode[2] = { "wb", "w" }; +static char *appendmode[2] = { "ab", "a" }; static UCRC crctable[UCHAR_MAX + 1]; @@ -622,6 +633,7 @@ entry_pos = get_word(); file_mode = get_word(); host_data = get_word(); + ext_file_pos = get_longword(); hdr_filename = (char *)&header[first_hdr_size]; strncopy(filename, hdr_filename, sizeof(filename)); @@ -712,6 +724,8 @@ extract() { char name[FNAME_MAX]; + char dir[FNAME_MAX]; + char *pos; if (check_flags()) { @@ -731,7 +745,22 @@ if (host_os != OS) default_case_path(name); - if (file_exists(name)) + + /* + 8/8/2000 Phil Knirsch: Bugfix to create subdirectories. Unarj didn't + do this for a long time, so it's finally fixed. + */ + pos = strchr(name, PATH_CHAR); + + while (pos != NULL) + { + strncpy(dir, name, pos-name); + dir[pos-name] = '\0'; + mkdir(dir, 0777); + pos = strchr(pos+1, PATH_CHAR); + } + + if (file_exists(name) && !(arj_flags & EXTFILE_FLAG)) { printf(M_FEXISTS, name); printf(M_SKIPPED, name); @@ -739,7 +768,10 @@ error_count++; return 0; } - outfile = file_open(name, writemode[file_type & 1]); + if(arj_flags & EXTFILE_FLAG) + outfile = file_open(name, appendmode[file_type & 1]); + else + outfile = file_open(name, writemode[file_type & 1]); if (outfile == NULL) { printf(M_CANTOPEN, name); @@ -748,9 +780,21 @@ error_count++; return 0; } + if( (arj_flags & EXTFILE_FLAG) && (ftell(outfile)!=ext_file_pos) ) { + printf(M_WRONGPOS, name); + printf(M_SKIPPED, name); + skip(); + error_count++; + return 0; + } + printf(M_EXTRACT, name); if (host_os != OS && file_type == BINARY_TYPE) printf(M_DIFFHOST); + if(arj_flags & EXTFILE_FLAG) + printf(" (continued)"); + if(arj_flags & VOLUME_FLAG) + printf(" (cont'd in next .arj)"); printf(" "); crc = CRC_MASK; ---------------------------- end of patch-ad ---------------------------------- >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-ports" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200010132236.e9DMaOx56081>