home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / fileutil / scan.lha / src / lhunarc.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-21  |  10.7 KB  |  344 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. /*----------------------------------------------------------------------*/
  8.  
  9.  
  10. #include <ctype.h>
  11. #include <signal.h>
  12.  
  13. #include <exec/types.h>
  14. #include <time.h>
  15. #include <fcntl.h>
  16. #include <stat.h>
  17.  
  18. #include <string.h>
  19.  
  20.  
  21. /*----------------------------------------------------------------------*/
  22. /*                      DIRECTORY ACCESS STUFF                          */
  23. /*----------------------------------------------------------------------*/
  24. #ifndef NODIRECTORY
  25.  
  26. #include <dirent.h>
  27.  
  28. #ifdef _MINIX
  29. #       define direct           dirent
  30. #       define DIRENTRY         struct dirent
  31. #       define NAMLEN(p)        strlen (p->d_name)
  32. #else
  33. #       ifdef SYSV_SYSTEM_DIR
  34. #               define DIRENTRY         struct dirent
  35. #               define NAMLEN(p)        strlen (p->d_name)
  36. #       else
  37. #               ifdef NONSYSTEM_DIR_LIBRARY
  38. #                       include "lhdir.h"
  39. #               else
  40. #                       include <sys/dir.h>
  41. #               endif
  42. #               define DIRENTRY         struct direct
  43. #               define NAMLEN(p)        p->d_namlen
  44. #       endif
  45. #endif  /* _MINIX */
  46.  
  47. #endif  /* NODIRECTORY */
  48.  
  49. #ifdef SHORTNAMES
  50. #       include "lhshort.h"
  51. #endif
  52.  
  53. /*----------------------------------------------------------------------*/
  54. /*                      FILE ATTRIBUTES                                 */
  55. /*----------------------------------------------------------------------*/
  56.  
  57. /* If file mode is not compatible between your Machine/OS and
  58.    LHarc standard UNIX file mode.
  59.    (See UNIX Manual stat(1), <sys/stat.h>,
  60.    and/or below UNIX_* difinitions. ) */
  61. /* #define NOT_COMPATIBLE_MODE */
  62. #define is_directory(statp)     (((statp)->st_mode & S_IFMT) == S_IFDIR)
  63. #define is_regularfile(statp)   (((statp)->st_mode & S_IFMT) == S_IFREG)
  64.  
  65. /* #define WRITE_BINARY "wb" */
  66. /* #define READ_BINARy  "rb" */
  67. #define WRITE_BINARY    "w"
  68. #define READ_BINARY     "r"
  69.  
  70. /*----------------------------------------------------------------------*/
  71. /*                      MEMORY FUNCTIONS                                */
  72. /*----------------------------------------------------------------------*/
  73.  
  74. #ifdef NOBSTRING
  75. #ifdef __ANSI__
  76. #include "mem.h"
  77. #define bcmp(a,b,n) memcmp ((a),(b),(n))
  78. #define bcopy(s,d,n) memmove((d),(s),(n))
  79. #define bzero(d,n) memset((d),0,(n))
  80. #else   /* not __ANSI__ */
  81. #include <exec/memory.h>
  82. #define bcmp(a,b,n) memcmp ((a),(b),(n))
  83. #define bcopy(s,d,n) memcpy ((d),(s),(n))       /* movmem((s),(d),(n)) */
  84. #define bzero(d,n) memset((d),0,(n))
  85. #endif  /* not __ANSI__ */
  86. #endif  /* NOBSTRING */
  87.  
  88.  
  89. /*----------------------------------------------------------------------*/
  90. /*                      YOUR CUSTOMIZATIONS                             */
  91. /*----------------------------------------------------------------------*/
  92. /* These definitions are changable to you likings. */
  93. /* #define ARCHIVENAME_EXTENTION        ".LZH"          */
  94. /* #define BACKUPNAME_EXTENTION         ".BAK"          */
  95. /* #define TMP_FILENAME_TEMPLATE        "/usr/tmp/lhXXXXXX" */
  96. /* #define MULTIBYTE_CHAR                               */
  97. /* #define USE_PROF                                     */
  98.  
  99.  
  100. #ifndef ARCHIVENAME_EXTENTION
  101. #       define ARCHIVENAME_EXTENTION    ".lzh"
  102. #endif
  103. #ifndef BACKUPNAME_EXTENTION
  104. #       define BACKUPNAME_EXTENTION     ".bak"
  105. #endif
  106. #ifndef TMP_FILENAME_TEMPLATE
  107. #       define TMP_FILENAME_TEMPLATE    "/tmp/lhXXXXXX"
  108. #endif
  109.  
  110. #define SJC_FIRST_P(c)                  \
  111.   (((unsigned char)(c) >= 0x80) &&      \
  112.    (((unsigned char)(c) < 0xa0) ||      \
  113.     ((unsigned char)(c) >= 0xe0) &&     \
  114.     ((unsigned char)(c) < 0xfd)))
  115. #define SJC_SECOND_P(c)                 \
  116.   (((unsigned char)(c) >= 0x40) &&      \
  117.    ((unsigned char)(c) < 0xfd) &&       \
  118.    ((ungigned char)(c) != 0x7f))
  119.  
  120. #ifdef MULTIBYTE_CHAR
  121. #       define MULTIBYTE_FIRST_P        SJC_FIRST_P
  122. #       define MULTIBYTE_SECOND_P       SJC_SECOND_P
  123. #endif
  124.  
  125. /*----------------------------------------------------------------------*/
  126. /*                      OTHER DIFINITIONS                               */
  127. /*----------------------------------------------------------------------*/
  128.  
  129. /* Your C-Compiler has no 'void' */
  130. #ifdef NO_VOID
  131. #       define void
  132. #endif
  133.  
  134. #ifndef SEEK_SET
  135. #       define SEEK_SET 0
  136. #       define SEEK_CUR 1
  137. #       define SEEK_END 2
  138. #endif
  139.  
  140. #       define FILENAME_LENGTH  255
  141.  
  142. #include <stdio.h>
  143.  
  144. /* non-integral functions */
  145. extern struct tm *localtime ();
  146. extern char *getenv ();
  147. extern char *malloc ();
  148. extern char *realloc ();
  149.  
  150.  
  151. /* external variables */
  152. extern int errno;
  153.  
  154.  
  155. #define FALSE   0
  156. #define TRUE    1
  157. typedef int boolean;
  158.  
  159.  
  160. /*----------------------------------------------------------------------*/
  161. /*              LHarc FILE DIFINITIONS                                  */
  162. /*----------------------------------------------------------------------*/
  163. #define METHOD_TYPE_STRAGE      5
  164. #define LZHUFF0_METHOD          "-lh0-"
  165. #define LZHUFF1_METHOD          "-lh1-"
  166. #define LZHUFF5_METHOD          "-lh5-"
  167. #define LARC4_METHOD            "-lz4-"
  168. #define LARC5_METHOD            "-lz5-"
  169.  
  170. #define I_HEADER_SIZE                   0
  171. #define I_HEADER_CHECKSUM               1
  172. #define I_METHOD                        2
  173. #define I_PACKED_SIZE                   7
  174. #define I_ORIGINAL_SIZE                 11
  175. #define I_LAST_MODIFIED_STAMP           15
  176. #define I_ATTRIBUTE                     19
  177. #define I_NAME_LENGTH                   21
  178. #define I_NAME                          22
  179.  
  180. #define I_CRC                           22 /* + name_length */
  181. #define I_EXTEND_TYPE                   24 /* + name_length */
  182. #define I_MINOR_VERSION                 25 /* + name_length */
  183. #define I_UNIX_LAST_MODIFIED_STAMP      26 /* + name_length */
  184. #define I_UNIX_MODE                     30 /* + name_length */
  185. #define I_UNIX_UID                      32 /* + name_length */
  186. #define I_UNIX_GID                      34 /* + name_length */
  187. #define I_UNIX_EXTEND_BOTTOM            36 /* + name_length */
  188.  
  189. #define I_GENERIC_HEADER_BOTTOM         I_EXTEND_TYPE
  190.  
  191.  
  192.  
  193. #define EXTEND_GENERIC  0
  194. #define EXTEND_UNIX     'U'
  195. #define EXTEND_MSDOS    'M'
  196. #define EXTEND_MACOS    'm'
  197. #define EXTEND_OS9      '9'
  198. #define EXTEND_OS2      '2'
  199. #define EXTEND_OS68K    'K'
  200. #define EXTEND_OS386    '3'
  201. #define EXTEND_HUMAN    'H'
  202. #define EXTEND_CPM      'C'
  203. #define EXTEND_FLEX     'F'
  204.  
  205. #define GENERIC_ATTRIBUTE               0x20
  206. #define GENERIC_DIRECTORY_ATTRIBUTE     0x10
  207.  
  208. #define CURRENT_UNIX_MINOR_VERSION      0x00
  209.  
  210.  
  211.  
  212. typedef struct LzHeader {
  213.   unsigned char         header_size;
  214.   char                  method[METHOD_TYPE_STRAGE];
  215.   long                  packed_size;
  216.   long                  original_size;
  217.   long                  last_modified_stamp;
  218.   unsigned short        attribute;
  219.   char                  name[256];
  220.   unsigned short        crc;
  221.   boolean               has_crc;
  222.   unsigned char         extend_type;
  223.   unsigned char         minor_version;
  224.   /*  extend_type == EXTEND_UNIX  and convert from other type. */
  225.   time_t                unix_last_modified_stamp;
  226.   unsigned short        unix_mode;
  227.   unsigned short        unix_uid;
  228.   unsigned short        unix_gid;
  229. } LzHeader;
  230.  
  231. #define UNIX_FILE_TYPEMASK      0170000
  232. #define UNIX_FILE_REGULAR       0100000
  233. #define UNIX_FILE_DIRECTORY     0040000
  234. #define UNIX_SETUID             0004000
  235. #define UNIX_SETGID             0002000
  236. #define UNIX_STYCKYBIT          0001000
  237. #define UNIX_OWNER_READ_PERM    0000400
  238. #define UNIX_OWNER_WRITE_PERM   0000200
  239. #define UNIX_OWNER_EXEC_PERM    0000100
  240. #define UNIX_GROUP_READ_PERM    0000040
  241. #define UNIX_GROUP_WRITE_PERM   0000020
  242. #define UNIX_GROUP_EXEC_PERM    0000010
  243. #define UNIX_OTHER_READ_PERM    0000004
  244. #define UNIX_OTHER_WRITE_PERM   0000002
  245. #define UNIX_OTHER_EXEC_PERM    0000001
  246. #define UNIX_RW_RW_RW           0000666
  247.  
  248. #define LZHEADER_STRAGE         256
  249.  
  250. /* used by qsort() for alphabetic-sort */
  251. #define STRING_COMPARE(a,b) strcmp((a),(b))
  252.  
  253. struct string_pool {
  254.   int used;
  255.   int size;
  256.   int n;
  257.   char *buffer;
  258. };
  259.  
  260.  
  261. /*----------------------------------------------------------------------*/
  262. /*                      OPTIONS                                         */
  263. /*----------------------------------------------------------------------*/
  264.  
  265. /* command line options (common options) */
  266. extern boolean  quiet;
  267. extern boolean  text_mode;
  268. extern boolean  verbose;
  269. extern boolean  noexec;         /* debugging option */
  270. extern boolean  force;
  271. extern boolean  prof;
  272. extern boolean  delete_after_append;
  273.  
  274. /* list command flags */
  275. extern boolean  verbose_listing;
  276.  
  277. /* extract/print command flags */
  278. extern boolean  output_to_stdout;
  279.  
  280. /* add/update/delete command flags */
  281. extern boolean  new_archive;
  282. extern boolean  update_if_newer;
  283. extern boolean  generic_format;
  284.  
  285.  
  286. /*----------------------------------------------------------------------*/
  287. /*                      VARIABLES                                       */
  288. /*----------------------------------------------------------------------*/
  289.  
  290. extern char     **cmd_filev;
  291. extern int      cmd_filec;
  292.  
  293. extern char     *archive_name;
  294. extern char     expanded_archive_name[FILENAME_LENGTH];
  295. extern char     temporary_name[FILENAME_LENGTH];
  296. extern char     backup_archive_name[FILENAME_LENGTH];
  297.  
  298. extern char *reading_filename, *writting_filename;
  299. extern boolean  remove_temporary_at_error;
  300. extern boolean  recover_archive_when_interrupt;
  301. extern boolean  remove_extracting_file_when_interrupt;
  302.  
  303. extern int      archive_file_mode;
  304. extern int      archive_file_gid;
  305.  
  306. /*----------------------------------------------------------------------*/
  307. /*              Functions                                               */
  308. /*----------------------------------------------------------------------*/
  309.  
  310. extern int interrupt ();
  311.  
  312. extern void message ();
  313. extern void warning ();
  314. extern void error ();
  315. extern void fatal_error ();
  316.  
  317. extern boolean need_file ();
  318. extern int inquire ();
  319. extern FILE *xfopen ();
  320.  
  321. extern boolean find_files ();
  322. extern void free_files ();
  323.  
  324. extern void init_sp ();
  325. extern void add_sp ();
  326. extern void finish_sp ();
  327. extern void free_sp ();
  328. extern void cleaning_files ();
  329.  
  330. extern void build_temporary_name ();
  331. extern void build_backup_file_name ();
  332. extern void build_standard_archive_name ();
  333.  
  334. extern FILE *open_old_archive ();
  335. extern void init_header ();
  336. extern boolean get_header ();
  337. extern boolean archive_is_msdos_sfx1 ();
  338. extern boolean skip_msdos_sfx1_code ();
  339. extern void write_header ();
  340. extern void write_archive_tail ();
  341. extern void copy_old_one ();
  342.  
  343. extern void cmd_list (), cmd_extract (), cmd_add (), cmd_delete ();
  344.