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