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