home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 9 Archive / 09-Archive.zip / lha100bt.zip / lha-1.00 / src / lharc.h < prev    next >
C/C++ Source or Header  |  1994-09-01  |  11KB  |  406 lines

  1. /*----------------------------------------------------------------------*/
  2. /*        LHarc Archiver Driver for UNIX                */
  3. /*                                    */
  4. /*        Copyright(C) MCMLXXXIX  Yooichi.Tagawa            */
  5. /*                                    */
  6. /*  V1.00  Fixed                1989.09.22  Y.Tagawa    */
  7. /*  V0.03  LHa for UNIX                1991.12.18  M.Oki    */
  8. /*----------------------------------------------------------------------*/
  9.  
  10. #include <stdio.h>
  11. #include <ctype.h>
  12. #include <sys/types.h>
  13. #include <sys/file.h>
  14. #include <sys/stat.h>
  15.  
  16. #include <signal.h>
  17.  
  18. /* most of System V,  define SYSTIME_HAS_NO_TM */
  19. #ifdef SYSTIME_HAS_NO_TM
  20. #include <time.h>
  21. #else
  22. #include <sys/time.h>
  23. #endif
  24.  
  25. #define  SYSV_SYSTEM_DIR    
  26.  
  27. /*----------------------------------------------------------------------*/
  28. /*            DIRECTORY ACCESS STUFF                */
  29. /*----------------------------------------------------------------------*/
  30. #ifndef NODIRECTORY
  31. #ifdef SYSV_SYSTEM_DIR
  32.  
  33. #include <dirent.h>
  34. #define DIRENTRY    struct dirent
  35. #define NAMLEN(p)    strlen (p->d_name)
  36.  
  37. #else    /* not SYSV_SYSTEM_DIR */
  38.  
  39. #ifdef NONSYSTEM_DIR_LIBRARY
  40. #include "lhdir.h"
  41. #else
  42. #include <sys/dir.h>
  43. #endif    /* not NONSYSTEM_DIR_LIBRARY */
  44.  
  45. #define DIRENTRY    struct direct
  46. #define NAMLEN(p)    p->d_namlen
  47.  
  48. extern DIR *opendir ();
  49. extern struct direct *readdir ();
  50.  
  51. #endif    /* not SYSV_SYSTEM_DIR */
  52. #endif
  53.  
  54. /*----------------------------------------------------------------------*/
  55. /*                FILE ATTRIBUTES                */
  56. /*----------------------------------------------------------------------*/
  57.  
  58. /* If file mode is not compatible between your Machine/OS and
  59.    LHarc standard UNIX file mode.
  60.    (See UNIX Manual stat(1), <sys/stat.h>,
  61.    and/or below UNIX_* definitions. ) */
  62. /* #define NOT_COMPATIBLE_MODE */
  63. #define is_directory(statp)    (((statp)->st_mode & S_IFMT) == S_IFDIR)
  64. #define is_regularfile(statp)    (((statp)->st_mode & S_IFMT) == S_IFREG)
  65.  
  66. /* #define WRITE_BINARY    "wb" */
  67. /* #define READ_BINARy    "rb" */
  68. #define WRITE_BINARY    "wb"
  69. #define READ_BINARY    "rb"
  70.  
  71. /*----------------------------------------------------------------------*/
  72. /*            MEMORY AND STRING FUNCTIONS            */
  73. /*----------------------------------------------------------------------*/
  74.  
  75. #ifndef USG
  76. #include <strings.h>
  77. #else
  78. #include <string.h>
  79. #endif    /* USG */
  80.  
  81. #ifdef NOINDEX
  82. #define index strchr
  83. #define rindex strrchr
  84. #endif    /* NOINDEX */
  85.  
  86. #ifdef NOBSTRING
  87. #define bcmp(a,b,n) memcmp ((a),(b),(n))
  88. #define bzero(d,n) memset((d),0,(n))
  89. #define bcopy(s,d,n) memmove((d),(s),(n))
  90. #endif    /* NOBSTRING */
  91.  
  92. #ifdef USESTRCASECMP
  93. #define strucmp(p,q) strcasecmp((p),(q))
  94. #endif
  95.  
  96. /*----------------------------------------------------------------------*/
  97. /*                YOUR CUSTOMIZIES            */
  98. /*----------------------------------------------------------------------*/
  99. /* These definitions are changable to you like.             */
  100. /* #define ARCHIVENAME_EXTENTION        ".LZH"            */
  101. /* #define BACKUPNAME_EXTENTION            ".BAK"            */
  102. /* #define TMP_FILENAME_TEMPLATE        "/usr/tmp/lhXXXXXX"    */
  103. /* #define MULTIBYTE_CHAR                        */
  104. /* #define USE_PROF                            */
  105.  
  106. #ifndef ARCHIVENAME_EXTENTION
  107. #define ARCHIVENAME_EXTENTION    ".lzh"
  108. #endif
  109. #ifndef BACKUPNAME_EXTENTION
  110. #define BACKUPNAME_EXTENTION    ".bak"
  111. #endif
  112. #ifndef TMP_FILENAME_TEMPLATE
  113. #define TMP_FILENAME_TEMPLATE    "lhXXXXXX"
  114. #endif
  115.  
  116. #define SJC_FIRST_P(c)            \
  117.   (((unsigned char)(c) >= 0x80) &&    \
  118.    (((unsigned char)(c) < 0xa0) ||    \
  119.     ((unsigned char)(c) >= 0xe0) &&    \
  120.     ((unsigned char)(c) < 0xfd)))
  121. #define SJC_SECOND_P(c)            \
  122.   (((unsigned char)(c) >= 0x40) &&    \
  123.    ((unsigned char)(c) < 0xfd) &&    \
  124.    ((ungigned char)(c) != 0x7f))
  125.  
  126. #ifdef MULTIBYTE_CHAR
  127. #define MULTIBYTE_FIRST_P    SJC_FIRST_P
  128. #define MULTIBYTE_SECOND_P    SJC_SECOND_P
  129. #endif /* MULTIBYTE_CHAR */
  130.  
  131. /*----------------------------------------------------------------------*/
  132. /*            OTHER DIFINITIONS                */
  133. /*----------------------------------------------------------------------*/
  134.  
  135. /* Your C-Compiler has no 'void' */
  136. #ifdef NO_VOID
  137. #define void
  138. #endif
  139.  
  140. #ifndef SEEK_SET
  141. #define SEEK_SET    0
  142. #define SEEK_CUR    1
  143. #define SEEK_END    2
  144. #endif
  145.  
  146. #define FILENAME_LENGTH    1024
  147.  
  148.  
  149. /* non-integral functions */
  150. extern struct tm *localtime ();
  151. extern char *getenv ();
  152.  
  153. #ifndef _MINIX
  154. #ifndef __STDC__
  155. extern char *malloc ();
  156. extern char *realloc ();
  157. #endif
  158. #endif
  159.  
  160. /* external variables */
  161. extern int errno;
  162.  
  163.  
  164. #define    FALSE    0
  165. #define TRUE    1
  166. typedef int boolean;
  167.  
  168.  
  169. /*----------------------------------------------------------------------*/
  170. /*            LHarc FILE DEFINITIONS                */
  171. /*----------------------------------------------------------------------*/
  172. #define METHOD_TYPE_STRAGE    5
  173. #define LZHUFF0_METHOD        "-lh0-"
  174. #define LZHUFF1_METHOD        "-lh1-"
  175. #define LZHUFF2_METHOD        "-lh2-"
  176. #define LZHUFF3_METHOD        "-lh3-"
  177. #define LZHUFF4_METHOD        "-lh4-"
  178. #define LZHUFF5_METHOD        "-lh5-"
  179. #define LARC4_METHOD        "-lz4-"
  180. #define LARC5_METHOD        "-lz5-"
  181. #define LZHDIRS_METHOD        "-lhd-"
  182.  
  183. #define I_HEADER_SIZE            0
  184. #define I_HEADER_CHECKSUM        1
  185. #define I_METHOD            2
  186. #define I_PACKED_SIZE            7
  187. #define I_ORIGINAL_SIZE            11
  188. #define I_LAST_MODIFIED_STAMP        15
  189. #define I_ATTRIBUTE            19
  190. #define I_HEADER_LEVEL            20
  191. #define I_NAME_LENGTH            21
  192. #define I_NAME                22
  193.  
  194. #define I_CRC                22 /* + name_length */
  195. #define I_EXTEND_TYPE            24 /* + name_length */
  196. #define I_MINOR_VERSION            25 /* + name_length */
  197. #define I_UNIX_LAST_MODIFIED_STAMP    26 /* + name_length */
  198. #define I_UNIX_MODE            30 /* + name_length */
  199. #define I_UNIX_UID            32 /* + name_length */
  200. #define I_UNIX_GID            34 /* + name_length */
  201. #define I_UNIX_EXTEND_BOTTOM        36 /* + name_length */
  202.  
  203. #define I_GENERIC_HEADER_BOTTOM        I_EXTEND_TYPE
  204.  
  205.  
  206.  
  207. #define EXTEND_GENERIC        0
  208. #define EXTEND_UNIX        'U'
  209. #define EXTEND_MSDOS        'M'
  210. #define EXTEND_MACOS        'm'
  211. #define EXTEND_OS9        '9'
  212. #define EXTEND_OS2        '2'
  213. #define EXTEND_OS68K        'K'
  214. #define EXTEND_OS386        '3'        /* OS-9000??? */
  215. #define EXTEND_HUMAN        'H'
  216. #define EXTEND_CPM        'C'
  217. #define EXTEND_FLEX        'F'
  218. #define EXTEND_RUNSER        'R'
  219. /*    this OS type is not official */
  220. #define EXTEND_TOWNSOS        'T'
  221. #define EXTEND_XOSK        'X'
  222. /*------------------------------*/
  223.  
  224. #define GENERIC_ATTRIBUTE            0x20
  225. #define GENERIC_DIRECTORY_ATTRIBUTE        0x10
  226. #define HEADER_LEVEL0                0x00
  227. #define HEADER_LEVEL1                0x01
  228. #define HEADER_LEVEL2                0x02
  229.  
  230. #define CURRENT_UNIX_MINOR_VERSION        0x00
  231.  
  232. #define DELIM ('/')
  233. #define DELIM2 (0xff)
  234. #define DELIMSTR "/"
  235.  
  236.  
  237. typedef struct LzHeader {
  238.   unsigned char        header_size;
  239.   char            method[METHOD_TYPE_STRAGE];
  240.   long            packed_size;
  241.   long            original_size;
  242.   long            last_modified_stamp;
  243.   unsigned char    attribute;
  244.   unsigned char header_level;
  245.   char            name[256];
  246.   unsigned short    crc;
  247.   boolean        has_crc;
  248.   unsigned char        extend_type;
  249.   unsigned char        minor_version;
  250.   /*  extend_type == EXTEND_UNIX  and convert from other type. */
  251.   time_t        unix_last_modified_stamp;
  252.   unsigned short    unix_mode;
  253.   unsigned short    unix_uid;
  254.   unsigned short    unix_gid;
  255. } LzHeader;
  256.  
  257. #define OSK_RW_RW_RW            0000033
  258. #define OSK_FILE_REGULAR        0000000
  259. #define OSK_DIRECTORY_PERM        0000200
  260. #define OSK_SHARED_PERM            0000100
  261. #define OSK_OTHER_EXEC_PERM        0000040
  262. #define OSK_OTHER_WRITE_PERM        0000020
  263. #define OSK_OTHER_READ_PERM        0000010
  264. #define OSK_OWNER_EXEC_PERM        0000004
  265. #define OSK_OWNER_WRITE_PERM        0000002
  266. #define OSK_OWNER_READ_PERM        0000001
  267.  
  268. #define UNIX_FILE_TYPEMASK        0170000
  269. #define UNIX_FILE_REGULAR        0100000
  270. #define UNIX_FILE_DIRECTORY        0040000
  271. #define UNIX_SETUID            0004000
  272. #define UNIX_SETGID            0002000
  273. #define UNIX_STYCKYBIT            0001000
  274. #define UNIX_OWNER_READ_PERM        0000400
  275. #define UNIX_OWNER_WRITE_PERM        0000200
  276. #define UNIX_OWNER_EXEC_PERM        0000100
  277. #define UNIX_GROUP_READ_PERM        0000040
  278. #define UNIX_GROUP_WRITE_PERM        0000020
  279. #define UNIX_GROUP_EXEC_PERM        0000010
  280. #define UNIX_OTHER_READ_PERM        0000004
  281. #define UNIX_OTHER_WRITE_PERM        0000002
  282. #define UNIX_OTHER_EXEC_PERM        0000001
  283. #define UNIX_RW_RW_RW            0000666
  284.  
  285. #define LZHEADER_STRAGE            4096
  286.  
  287. #ifdef S_IFLNK
  288. #define GETSTAT lstat
  289. #else
  290. #define GETSTAT stat
  291. #endif
  292.  
  293. /* used by qsort() for alphabetic-sort */
  294. #define STRING_COMPARE(a,b) strcmp((a),(b))
  295.  
  296. struct string_pool {
  297.   int used;
  298.   int size;
  299.   int n;
  300.   char *buffer;
  301. };
  302.  
  303.  
  304. /*----------------------------------------------------------------------*/
  305. /*                OPTIONS                    */
  306. /*----------------------------------------------------------------------*/
  307.  
  308. /* command line options (common options) */
  309. extern boolean    quiet;
  310. extern boolean    text_mode;
  311. extern boolean    verbose;
  312. extern boolean    noexec;        /* debugging option */
  313. extern boolean    force;
  314. extern boolean    prof;
  315. extern boolean    delete_after_append;
  316.  
  317. /* list command flags */
  318. extern boolean    verbose_listing;
  319.  
  320. /* extract/print command flags */
  321. extern boolean    output_to_stdout;
  322.  
  323. /* add/update/delete command flags */
  324. extern boolean    new_archive;
  325. extern boolean    update_if_newer;
  326. extern boolean    generic_format;
  327.  
  328. /**************************************
  329.  Added 31-8-1994 by Enrico Demarin
  330. ***************************************/
  331.  
  332. extern boolean make_backups ;
  333. extern boolean recurse_subdirs ;
  334. extern int file_mask ;
  335.  
  336. /**************************************/
  337.  
  338.  
  339. /*----------------------------------------------------------------------*/
  340. /*                VARIABLES                */
  341. /*----------------------------------------------------------------------*/
  342.  
  343. extern char    **cmd_filev;
  344. extern int    cmd_filec;
  345.  
  346. extern char    *archive_name;
  347. extern char    expanded_archive_name[FILENAME_LENGTH];
  348. extern char    temporary_name[FILENAME_LENGTH];
  349. extern char    backup_archive_name[FILENAME_LENGTH];
  350.  
  351. extern char *reading_filename, *writting_filename;
  352. extern boolean    remove_temporary_at_error;
  353. extern boolean    recover_archive_when_interrupt;
  354. extern boolean    remove_extracting_file_when_interrupt;
  355.  
  356. extern int    archive_file_mode;
  357. extern int    archive_file_gid;
  358.  
  359. /*----------------------------------------------------------------------*/
  360. /*                Functions                */
  361. /*----------------------------------------------------------------------*/
  362.  
  363. extern void interrupt ();
  364.  
  365. extern void message ();
  366. extern void warning ();
  367. extern void error ();
  368. extern void fatal_error ();
  369.  
  370. extern boolean need_file ();
  371. extern int inquire ();
  372. extern FILE *xfopen ();
  373.  
  374. extern boolean find_files ();
  375. extern void free_files ();
  376.  
  377. extern void init_sp ();
  378. extern void add_sp ();
  379. extern void finish_sp ();
  380. extern void free_sp ();
  381. extern void cleaning_files ();
  382.  
  383. extern void build_temporary_name ();
  384. extern void build_backup_file_name ();
  385. extern void build_standard_archive_name ();
  386.  
  387. extern FILE *open_old_archive ();
  388. extern void init_header ();
  389. extern boolean get_header ();
  390. extern boolean archive_is_msdos_sfx1 ();
  391. extern boolean skip_msdos_sfx1_code ();
  392. extern void write_header ();
  393. extern void write_archive_tail ();
  394. extern void copy_old_one ();
  395. extern unsigned char *convdelim ();
  396. extern long copyfile ();
  397.  
  398. extern void cmd_list (), cmd_extract (), cmd_add (), cmd_delete ();
  399.  
  400. extern boolean ignore_directory;
  401. extern boolean compress_method;
  402. extern boolean verify_mode;
  403.  
  404. extern char *extract_directory;
  405. extern FILE *temporary_fp;
  406.