~ubuntu-branches/ubuntu/precise/arj/precise-security

« back to all changes in this revision

Viewing changes to environ.h

  • Committer: Bazaar Package Importer
  • Author(s): Guillem Jover
  • Date: 2004-06-27 08:07:09 UTC
  • Revision ID: james.westby@ubuntu.com-20040627080709-1gkxm72ex66gkwe4
Tags: upstream-3.10.21
ImportĀ upstreamĀ versionĀ 3.10.21

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * $Id: environ.h,v 1.14 2004/05/31 16:08:41 andrew_belov Exp $
 
3
 * ---------------------------------------------------------------------------
 
4
 * All environment-specific declarations are held here.
 
5
 *
 
6
 */
 
7
 
 
8
#ifndef ENVIRON_INCLUDED
 
9
#define ENVIRON_INCLUDED
 
10
 
 
11
/* First of all, let's try to guess what kind of compiler we're using. The
 
12
   COMPILER macro will lead us all the way */
 
13
 
 
14
#ifndef C_DEFS_INCLUDED                 /* All-time definitions */
 
15
 #include "c_defs.h"
 
16
#endif
 
17
 
 
18
#define GENERIC                    0
 
19
 
 
20
#define BCC                        1
 
21
#define MSC                        2
 
22
#define ICC                        3
 
23
#define GCC                        4
 
24
#define HIGHC                      5
 
25
#define WCC                        6
 
26
#define MSVC                       7
 
27
 
 
28
#if defined(__TURBOC__)||defined(__BORLANDC__)
 
29
 #define COMPILER BCC
 
30
#elif defined(_MSC_VER)||defined(_QC)
 
31
  #ifdef _WIN32
 
32
   #define COMPILER MSVC
 
33
  #else
 
34
   #define COMPILER MSC
 
35
   #ifdef MSC_VER
 
36
    #error BUG
 
37
   #endif
 
38
   #if (defined(_MSC_VER)&&_MSC_VER<600)||(!defined(_MSC_VER)&&defined(_QC))
 
39
    #define MSC_ANCIENT                   /* Old-style Microsoft compiler */
 
40
   #endif
 
41
 #endif
 
42
#elif defined(__IBMC__)||defined(__IBMCPP__)
 
43
 #define COMPILER ICC
 
44
#elif defined(__GNUC__)
 
45
 #define COMPILER GCC
 
46
#elif defined(__WATCOMC__)
 
47
 #define COMPILER WCC
 
48
 #ifdef M_I386
 
49
  #define __32BIT__
 
50
 #endif
 
51
#elif defined(__HIGHC__)||defined(__HIGHC_ANSI__)||defined(_OS2)
 
52
 #define COMPILER HIGHC
 
53
 #define __32BIT__
 
54
#else
 
55
 #define COMPILER GENERIC
 
56
#endif
 
57
 
 
58
/* Now, make it clear about target OS */
 
59
 
 
60
#define DOS                        1
 
61
#define OS2                        2    /* OS/2-32 is OS2+__32BIT__ */
 
62
#ifdef UNIX
 
63
 #undef UNIX
 
64
#endif
 
65
#define UNIX                       3
 
66
#define WIN32                      4
 
67
 
 
68
#if defined(_OS2)||defined(__OS2__)||defined(__EMX__)
 
69
 #define TARGET                  OS2
 
70
#elif defined(_WIN32)
 
71
 #define TARGET                WIN32
 
72
#elif defined(_UNIX)
 
73
 #define TARGET                 UNIX
 
74
#else
 
75
 #define TARGET                  DOS
 
76
#endif
 
77
 
 
78
#if TARGET==DOS||TARGET==OS2&&!defined(__32BIT__)
 
79
 #define TILED
 
80
#endif
 
81
 
 
82
#if TARGET!=UNIX
 
83
 #define HAVE_DRIVES
 
84
 #define HAVE_VOL_LABELS
 
85
#endif
 
86
 
 
87
#if TARGET==OS2||TARGET==WIN32
 
88
 #define HAVE_EAS
 
89
#endif
 
90
 
 
91
#include <ctype.h>
 
92
 
 
93
#if COMPILER==BCC
 
94
 #include <alloc.h>
 
95
#elif COMPILER==MSC||COMPILER==MSVC
 
96
 #include <malloc.h>
 
97
#endif
 
98
 #include <errno.h>
 
99
 #include <string.h>
 
100
 #include <stdarg.h>
 
101
 #include <stdio.h>
 
102
 #if COMPILER==ICC&&defined(DEBUG)
 
103
  #define __DEBUG_ALLOC__               /* For heap checking */
 
104
 #endif
 
105
 #include <stdlib.h>
 
106
 #include <time.h>
 
107
#if COMPILER==BCC
 
108
 #include <values.h>
 
109
#else
 
110
 #include <limits.h>
 
111
#endif
 
112
#if TARGET!=UNIX
 
113
 #include <io.h>
 
114
#endif
 
115
#if COMPILER==BCC
 
116
 #include <dir.h>
 
117
#elif COMPILER!=GCC && !defined(SUNOS)
 
118
 #include <direct.h>
 
119
#endif
 
120
 
 
121
/* OS-dependent headers */
 
122
 
 
123
#if TARGET==DOS
 
124
 #include <dos.h>
 
125
#elif TARGET==OS2
 
126
 #define INCL_BASE
 
127
 #include <os2.h>
 
128
#elif TARGET==WIN32
 
129
 #include <windows.h>
 
130
#elif TARGET==UNIX
 
131
 #include <dirent.h>
 
132
 #include <sys/types.h>
 
133
 #include <sys/stat.h>                  /* For dev_t, chmod(), etc. */
 
134
#endif
 
135
 
 
136
/* Keywords remapping */
 
137
 
 
138
#if !defined(TILED)
 
139
 #ifndef _WIN32
 
140
  #define FAR
 
141
  #define NEAR
 
142
 #endif
 
143
 #define S_NEAR
 
144
#elif COMPILER==BCC
 
145
 #define FAR                     far
 
146
 #define NEAR                   near
 
147
 #define S_NEAR                 NEAR
 
148
#elif COMPILER==MSC
 
149
 #if TARGET==DOS
 
150
  #ifdef MSC_ANCIENT
 
151
   #define FAR                   far
 
152
   #define NEAR                 near
 
153
  #else
 
154
   #define FAR                  _far
 
155
   #define NEAR                _near
 
156
  #endif
 
157
 #endif
 
158
 #ifndef MSC_ANCIENT
 
159
  #define asm                   _asm
 
160
 #endif
 
161
 #define S_NEAR                 NEAR
 
162
#else
 
163
 #error *** A FAR/NEAR translation must be defined for this compiler!
 
164
#endif
 
165
 
 
166
/* Special functions enablement */
 
167
 
 
168
#if COMPILER==MSC
 
169
 #define FINETUNE_BUFSIZ                /* Alternate adjustment method */
 
170
#endif
 
171
 
 
172
#if defined(TILED)&&!defined(MSC_ANCIENT)
 
173
 #define ASM8086                        /* Enable assembly routines */
 
174
#endif
 
175
 
 
176
/* Library functions/equates remapping */
 
177
 
 
178
#if !defined(TILED)
 
179
 #define farfree                free
 
180
 #define farmalloc            malloc
 
181
 #define farrealloc          realloc
 
182
 #define farcalloc            calloc
 
183
 #define coreleft()          1048576    /* Don't know/care about it */
 
184
#elif COMPILER==MSC
 
185
 #define farfree              _ffree
 
186
 #define farmalloc(s) _fmalloc((size_t)s)
 
187
 #define farrealloc(p, s)  _frealloc(p, (size_t)s)
 
188
 #define farcalloc(n, s) _fcalloc((size_t)(n), (size_t)(s))
 
189
 #define coreleft            _memmax    /* Size of largest unallocated block */
 
190
#endif
 
191
 
 
192
#if COMPILER==MSC
 
193
 #define findfirst    _dos_findfirst
 
194
 #define findnext      _dos_findnext
 
195
 #define getvect        _dos_getvect
 
196
 #define setvect        _dos_setvect
 
197
 #ifdef MSC_ANCIENT
 
198
  #define _far                   far
 
199
 #endif
 
200
 #if _MSC_VER>=0x0700
 
201
  #define diskfree_t     _diskfree_t
 
202
  #define dosdate_t       _dosdate_t
 
203
  #define dostime_t       _dostime_t
 
204
  #define _far                 __far
 
205
  #define find_t             _find_t
 
206
  #define _interrupt     __interrupt
 
207
  #define rccoord          __rccoord
 
208
  #define stackavail     _stackavail
 
209
  #define strlwr             _strlwr
 
210
  #define strupr             _strupr
 
211
  #define videoconfig  __videoconfig
 
212
 #else
 
213
  #define _close               close
 
214
  #define _chmod               chmod
 
215
  #define _creat               creat
 
216
  #define _open                 open
 
217
  #define _read                 read
 
218
  #define _write               write
 
219
 #endif
 
220
 #if _MSC_VER<600
 
221
  #define _fcalloc           fcalloc
 
222
  #define _fmemcmp           fmemcmp
 
223
  #define _fmemset           fmemset
 
224
  #define _frealloc         frealloc
 
225
  #define _fstrcat           fstrcat
 
226
  #define _fstrchr           fstrchr
 
227
  #define _fstrcmp           fstrcmp
 
228
  #define _fstrcpy           fstrcpy
 
229
  #define _fstrlen           fstrlen
 
230
 #endif
 
231
#endif
 
232
#if (COMPILER==MSC&&_MSC_VER>=0x0700)||COMPILER==IBMC||COMPILER==HIGHC||TARGET==OS2&&defined(LIBC)
 
233
 #define filelength      _filelength
 
234
 #define fcloseall        _fcloseall
 
235
#endif
 
236
#if COMPILER==BCC||COMPILER==MSC
 
237
 #define _lseek                lseek
 
238
#endif
 
239
#if COMPILER==ICC||COMPILER==HIGHC
 
240
 #define mkdir                _mkdir
 
241
#endif
 
242
#if TARGET==UNIX
 
243
 #ifndef __QNXNTO__
 
244
    #define O_BINARY                  0    /* N/A under UNIX */
 
245
 #endif /* __QNXNTO__ */
 
246
 #define _lseek                lseek
 
247
 #define _open                  open
 
248
 #define _write                write
 
249
 #define _read                  read
 
250
 #define _close                close
 
251
#endif
 
252
/* BSD 4.3 LIBC forwarders */
 
253
#ifdef HAVE_STRCASECMP
 
254
 #define stricmp          strcasecmp
 
255
 #define strnicmp        strncasecmp
 
256
#endif
 
257
 
 
258
/* Watcom variables remapping: the "-5r" convention requires this */
 
259
 
 
260
#if TARGET==OS2&&COMPILER==WCC&&defined(LIBC)
 
261
 #pragma aux stdin "*"
 
262
 #pragma aux stdout "*"
 
263
 #pragma aux stderr "*"
 
264
 #pragma aux stdaux "*"
 
265
 #pragma aux stdprn "*"
 
266
 #pragma aux _timezone "*"
 
267
 #pragma aux _daylight "*"
 
268
 #pragma aux errno "*"
 
269
#endif
 
270
 
 
271
/* MetaWare High C/C++, GCC, etc. add-ons */
 
272
 
 
273
#if !defined(HAVE_MIN)&&!defined(min)
 
274
 #define min(a, b) ((a)<(b)?(a):(b))
 
275
#endif
 
276
 
 
277
#if !defined(HAVE_MAX)&&!defined(max)
 
278
 #define max(a, b) ((a)>(b)?(a):(b))
 
279
#endif
 
280
 
 
281
/* Structures that are already present in Borland C but missing from MS C */
 
282
 
 
283
#if COMPILER!=BCC
 
284
 
 
285
/* DOS FCB */
 
286
 
 
287
struct fcb
 
288
{
 
289
 char fcb_drive;
 
290
 char fcb_name[8];
 
291
 char fcb_ext[3];
 
292
 short fcb_curblk;
 
293
 short fcb_recsize;
 
294
 long fcb_filsize;
 
295
 short fcb_date;
 
296
 char fcb_resv[10];
 
297
 char fcb_currec;
 
298
 long fcb_random;
 
299
};
 
300
 
 
301
/* DOS Extended FCB */
 
302
 
 
303
struct xfcb
 
304
{
 
305
 char xfcb_flag;
 
306
 char xfcb_resv[5];
 
307
 char xfcb_attr;
 
308
 struct fcb xfcb_fcb;
 
309
};
 
310
 
 
311
/* Time structure */
 
312
 
 
313
struct time
 
314
{
 
315
 unsigned char ti_min;
 
316
 unsigned char ti_hour;
 
317
 unsigned char ti_hund;
 
318
 unsigned char ti_sec;
 
319
};
 
320
 
 
321
/* Date structure */
 
322
 
 
323
struct date
 
324
{
 
325
 int da_year;
 
326
 char da_day;
 
327
 char da_mon;
 
328
};
 
329
 
 
330
 
 
331
#endif
 
332
 
 
333
/* Far pointer creation macro */
 
334
 
 
335
#ifndef MK_FP
 
336
 #define MK_FP(seg,ofs)  ((void FAR *)(((unsigned long)seg<<16)+(unsigned long)ofs))
 
337
#endif
 
338
 
 
339
/* Far memory comparison macro/function */
 
340
 
 
341
#if !defined(TILED)
 
342
 #define far_memcmp           memcmp
 
343
#elif COMPILER==BCC
 
344
 #include "fmemcmp.h"
 
345
#elif COMPILER==MSC
 
346
 #define far_memcmp         _fmemcmp
 
347
#endif
 
348
 
 
349
/* Error message output */
 
350
 
 
351
#if COMPILER==BCC
 
352
 #define error_report() msg_cprintf(H_ERR, M_ERROR_CODE, errno, strerror(errno))
 
353
 #define error_freport() msg_cprintf(H_ERR, M_ERROR_CODE, errno, strerror(errno))
 
354
#else
 
355
 /* LIBCS.DLL complains about missing message resources */
 
356
 #if defined(LIBC)&&TARGET==OS2
 
357
  #define error_report()
 
358
 #else
 
359
  #define error_report() \
 
360
          { \
 
361
           msg_cprintf(H_ERR, M_ERROR_CODE, errno, strerror(errno)); \
 
362
           msg_cprintf(H_ERR, (FMSG *)lf); \
 
363
          }
 
364
 #endif
 
365
#endif
 
366
 
 
367
/* Signal handler parameter set */
 
368
 
 
369
#if COMPILER==BCC
 
370
 #define SIGHDLPARAMS
 
371
#else
 
372
 #define SIGHDLPARAMS        int sig
 
373
#endif
 
374
 
 
375
/* Host operating system. Note that OS codes are defined separately in
 
376
   DEFINES.H, so this macro has no effect until DEFINES.H is included. */
 
377
 
 
378
#if TARGET==DOS
 
379
 #define OS                   OS_DOS
 
380
#elif TARGET==OS2
 
381
 #define OS                   OS_OS2
 
382
#elif TARGET==UNIX
 
383
 #define OS                  OS_UNIX
 
384
#elif TARGET==WIN32
 
385
 #define OS                 OS_WIN32
 
386
#endif
 
387
 
 
388
/* Fixed-bit quantities. Atomic integer types comprising no less than the
 
389
   designated number of bits */
 
390
 
 
391
#define UINT32         unsigned long
 
392
#define INT32          unsigned long
 
393
 
 
394
/* Case sensitivity (under OS/2, this actually depends on the IFS used!) */
 
395
 
 
396
#if TARGET!=UNIX
 
397
 #define CASE_INSENSITIVE
 
398
#endif
 
399
 
 
400
/* Maximum size of path/path component */
 
401
 
 
402
#if TARGET==OS2||defined(__TILED__)
 
403
 #define CCHMAXPATH              260
 
404
 #define CCHMAXPATHCOMP          256
 
405
#else
 
406
 #define CCHMAXPATH              512
 
407
 #define CCHMAXPATHCOMP   CCHMAXPATH
 
408
#endif
 
409
#define MAXWILDAST               128    /* Maximum # of asterisks in wildcards */
 
410
 
 
411
/* Our own archive filename storage */
 
412
 
 
413
#ifdef FILENAME_MAX
 
414
 #undef FILENAME_MAX                    /* Already defined in some compilers */
 
415
#endif
 
416
#if TARGET==DOS
 
417
 #define FILENAME_MAX            500
 
418
#else
 
419
 #define FILENAME_MAX            512
 
420
#endif
 
421
 
 
422
/* Wildcard equates */
 
423
 
 
424
#define WC_RESERVE                10    /* Number of bytes to reserve for w/c */
 
425
 
 
426
/* Length of screen-wide strings */
 
427
 
 
428
#define INPUT_LENGTH              80    /* Used in various queries */
 
429
#define TXTD_LENGTH               78    /* Used when displaying found text */
 
430
 
 
431
/* Length of command lines */
 
432
 
 
433
#if TARGET==DOS
 
434
 #define CMDLINE_LENGTH          160
 
435
#elif TARGET==OS2
 
436
 #define CMDLINE_LENGTH          264
 
437
#else
 
438
 #define CMDLINE_LENGTH          512    /* ASR fix: applies to Unices too!
 
439
                                           15/01/2003 -- Win32 preparations */
 
440
#endif
 
441
 
 
442
/* Number of command-line parameters. It must NOT be too high since some arrays
 
443
   are based on its value */
 
444
 
 
445
#if TARGET==DOS
 
446
 #define PARAMS_MAX               64    /* parameters+spaces: 64*2=128 */
 
447
 #define SFLIST_MAX               64    /* ARJSFX filelist array limit */
 
448
#elif TARGET==OS2
 
449
 #define PARAMS_MAX              131    /* ~262 */
 
450
 #define SFLIST_MAX              131
 
451
#else
 
452
 #define PARAMS_MAX             1024    /* May be less on some platforms */
 
453
 #define SFLIST_MAX             1024
 
454
#endif
 
455
 
 
456
/* FAR memory block size limit */
 
457
 
 
458
#ifdef TILED
 
459
 #if COMPILER==BCC
 
460
  #define FAR_BLK_MAX           65535
 
461
 #elif COMPILER==MSC
 
462
  #define FAR_BLK_MAX           65512
 
463
 #else
 
464
  #define FAR_BLK_MAX           65535
 
465
 #endif
 
466
 #define FLIST_ALLOC_MAX  FAR_BLK_MAX
 
467
#elif TARGET==OS2
 
468
 #define FAR_BLK_MAX        469762048   /* Unless it's Aurora */
 
469
 #define FLIST_ALLOC_MAX        65535
 
470
#else
 
471
 #define FAR_BLK_MAX        524288000   /* ASR fix 27/10/2002: larger
 
472
                                           values overflow the 2G limit in
 
473
                                           FILELIST.C, leading to
 
474
                                           ARJSFXV/Linux failure */
 
475
 #define FLIST_ALLOC_MAX        65535
 
476
#endif
 
477
 
 
478
/* CFA block increments. It will be wise to keep them proportional to the
 
479
   page size under OS/2, and memory-conserving under DOS. As a sidenote, this
 
480
   significantly reduces the memory requirements for ARJ under DOS. */
 
481
 
 
482
#if TARGET==OS2
 
483
 #define CFA_BLOCK_SIZE        16384
 
484
#elif defined(TILED)
 
485
 #define CFA_BLOCK_SIZE         4096
 
486
#else
 
487
 #define CFA_BLOCK_SIZE        16384    /* Presume i386 paged RAM */
 
488
#endif
 
489
 
 
490
/* Maximum # of files in the filelist. No longer an environment limit but
 
491
   a marketing logic! */
 
492
 
 
493
#define FILELIST_INCREMENT       256    /* Increment count for order blocks */
 
494
/* In original ARJ, there was a "commercial" filelist capacity (EXT LIC). The
 
495
   shareware/ordinary license limit was FLIST_ALLOC_MAX-1. */
 
496
#define EXT_FILELIST_CAPACITY ((unsigned long)FAR_BLK_MAX*4-5)
 
497
#define FILELIST_CAPACITY (FLIST_ALLOC_MAX-1)
 
498
#define FLIST_SPEC_BASE FILELIST_CAPACITY /* Special entries start here */
 
499
 
 
500
/* Implicit filelist limits */
 
501
 
 
502
#define FCLIM_DELETION  FILELIST_CAPACITY /* Limit for deletion */
 
503
#define FCLIM_ARCHIVE   EXT_FILELIST_CAPACITY /* Archive filelist size */
 
504
#define FCLIM_EXCLUSION FILELIST_CAPACITY /* Limit for exclusion */
 
505
#define FCLIM_EA        FILELIST_CAPACITY /* Limit for EA [in/ex]clusion */
 
506
 
 
507
/* Console settings */
 
508
 
 
509
#ifdef CR
 
510
 #undef CR
 
511
#endif
 
512
#define CR                      0x0D    /* CR */
 
513
 
 
514
#ifdef LF
 
515
 #undef LF
 
516
#endif
 
517
#define LF                      0x0A    /* LF */
 
518
 
 
519
#ifdef BEL
 
520
 #undef BEL
 
521
#endif
 
522
#define BEL                     0x07    /* Bell */
 
523
 
 
524
#ifdef TAB
 
525
 #undef TAB
 
526
#endif
 
527
#define TAB                     0x09    /* Tab */
 
528
#define TAB_POS                    8    /* Tab stops spacing */
 
529
 
 
530
#define CON_LBOUND                32    /* Lowest displayable character */
 
531
#define CON_UBOUND               126    /* Highest displayable character */
 
532
 
 
533
#if TARGET==UNIX||COMPILER==ICC||COMPILER==HIGHC||TARGET==OS2&&defined(LIBC)
 
534
 #define STDOUT_SETBUF_FIX              /* XPG.4 libraries (namely, IBM LIBC
 
535
                                           and GLIBC) do excessive stdout
 
536
                                           buffering */
 
537
#endif
 
538
 
 
539
#if TARGET==UNIX||TARGET==OS2
 
540
 #define DIRECT_TO_ANSI                 /* Means to reimplement screen commands
 
541
                                           via ANSI */
 
542
#endif
 
543
 
 
544
/* UNIX and DOS-style path separators */
 
545
 
 
546
#if TARGET==UNIX
 
547
 #define PATH_SEPARATORS         "/"
 
548
#else
 
549
 #define PATH_SEPARATORS      "\\:/"    /* Path separators allowed by target
 
550
                                           OS */
 
551
#endif
 
552
#if TARGET==UNIX
 
553
 #define PATHSEP_DEFAULT          '/'
 
554
 #define PATHSEP_DEFSTR           "/"
 
555
#else
 
556
 #define PATHSEP_DEFAULT         '\\'
 
557
 #define PATHSEP_DEFSTR          "\\"
 
558
#endif
 
559
 
 
560
/* File buffering equates (defining NO_CACHING will disable buffering) */
 
561
 
 
562
#define CACHE_SIZE              4096    /* Allocate this amount for buffer */
 
563
#define CACHE_SIZE_SFXJR        8192    /* ARJSFXJR incoming data cache size */
 
564
#define PROC_BLOCK_SIZE        27648    /* Size of sequential processing block */
 
565
#if TARGET==DOS
 
566
 #define VBUF_ADD               4096    /* Old archive stream */
 
567
 #define VBUF_EXTRACT           8192    /* Input archive stream */
 
568
 #define TBUF_ARJ               4096    /* Output archive stream */
 
569
 #if COMPILER==BCC
 
570
  #define VBUF_SFX              4096
 
571
 #else
 
572
  #define VBUF_SFX              2048
 
573
 #endif
 
574
#elif TARGET==OS2||TARGET==WIN32
 
575
 /* Microsoft C constraints (fragmented heap, and so on...) */
 
576
 #ifdef TILED
 
577
  #define VBUF_ADD              1024
 
578
  #define VBUF_EXTRACT          1024
 
579
  #define TBUF_ARJ              1024
 
580
  #define VBUF_SFX              1024
 
581
 #else
 
582
  #define VBUF_ADD              8192
 
583
  #define VBUF_EXTRACT         16384
 
584
  #define TBUF_ARJ              8192
 
585
  #define VBUF_SFX              8192
 
586
 #endif
 
587
#elif TARGET==UNIX
 
588
 #define VBUF_ADD               8192
 
589
 #define VBUF_EXTRACT           8192
 
590
 #define VBUF_ARJ               8192
 
591
 #define TBUF_ARJ               8192
 
592
 #define VBUF_SFX               8192
 
593
#else
 
594
 #error *** Buffering limits must be defined for the target platform!
 
595
#endif
 
596
#define TBUF_MINFREE          42000U    /* If less memory left, tbuf>>=1 */
 
597
#define VBUF_MINFREE          40000U    /* If less memory left, vbuf>>=1 */
 
598
 
 
599
/*
 
600
 * Error handling capabilities:
 
601
 *
 
602
 *   NO_TERM_HDL        disables termination handler
 
603
 *   NO_FATAL_ERROR_HDL disables fatal error handler
 
604
 *
 
605
 */
 
606
 
 
607
#if TARGET==DOS
 
608
 #define NO_TERM_HDL                    /* Disable termination handler */
 
609
#endif
 
610
#if TARGET==WIN32
 
611
 #define HAVE_BREAK_HANDLER
 
612
#endif
 
613
 
 
614
/* File attribute mapping */
 
615
 
 
616
/* DOS-way */
 
617
#define FATTR_HIDDEN          0x0002
 
618
#define FATTR_SYSTEM          0x0004
 
619
#define FATTR_RDONLY          0x0001
 
620
#define FATTR_ARCH            0x0020
 
621
#define FATTR_NOARCH          0x0000
 
622
#define FATTR_DIREC           0x0010
 
623
#define FATTR_LABEL           0x0008
 
624
/* UNIX-way */
 
625
#define FATTR_IROTH           0x0004
 
626
#define FATTR_IWOTH           0x0002
 
627
#define FATTR_IXOTH           0x0001
 
628
#define FATTR_IRGRP (FATTR_IROTH<<3)
 
629
#define FATTR_IWGRP (FATTR_IWOTH<<3)
 
630
#define FATTR_IXGRP (FATTR_IXOTH<<3)
 
631
#define FATTR_IRUSR (FATTR_IRGRP<<3)
 
632
#define FATTR_IWUSR (FATTR_IWGRP<<3)
 
633
#define FATTR_IXUSR (FATTR_IXGRP<<3)
 
634
#define FATTR_SVTX            0x0200    /* Sticky bit */
 
635
#define FATTR_SGID            0x0400    /* Set GID on exec */
 
636
#define FATTR_SUID            0x0800    /* Set UID on exec */
 
637
#define FATTR_UFMASK          0x0FFF    /* UID/GID/VTX + rwxrwxrwx */
 
638
#define ufattr(a) ((a)&FATTR_UFMASK)
 
639
/* Internal mapping for wild_list(), etc. */
 
640
#define FATTR_DT_ANY          0x0000    /* Default */
 
641
#define FATTR_DT_REG          0x1000    /* Regular files */
 
642
#define FATTR_DT_DIR          0x2000    /* Directories */
 
643
#define FATTR_DT_UXSPECIAL    0x4000    /* Links, pipes, etc. */
 
644
#define uftype(a)  ((a)&~FATTR_UFMASK)
 
645
 
 
646
/* Certain capabilities of non-UNIX operating systems aren't supported at all
 
647
   or are heavily modified */
 
648
 
 
649
#if TARGET==UNIX
 
650
 #define MAP_UNIX_ATTRS                 /* Convert to DOS representation */
 
651
#endif
 
652
 
 
653
#if TARGET!=UNIX
 
654
 #define STD_ATTRS              0x27    /* Borland compatibility mask */
 
655
 /* The following is for fileinfo searches */
 
656
 #define STD_FI_ATTRS (FATTR_DIREC|FATTR_HIDDEN|FATTR_SYSTEM|FATTR_RDONLY)
 
657
 #define STD_DIR_ATTR    FATTR_DIREC
 
658
 #define STD_FATTR_NOARCH FATTR_NOARCH
 
659
#else
 
660
 #define STD_FI_ATTRS (FATTR_DT_REG|FATTR_DT_DIR|FATTR_DT_UXSPECIAL)
 
661
 #define STD_DIR_ATTR   FATTR_DT_DIR
 
662
 #define STD_FATTR_NOARCH       0644
 
663
#endif
 
664
 
 
665
/* Priority classes */
 
666
 
 
667
#if TARGET==OS2||TARGET==WIN32
 
668
 #define PRIORITY_CLASSES               4       /* 1...4 */
 
669
#elif TARGET==UNIX
 
670
 #define PRIORITY_CLASSES              41       /* -20...20 -> 1...41 */
 
671
#else
 
672
 #define PRIORITY_CLASSES             100       /* For compatibility */
 
673
#endif
 
674
 
 
675
/* OS-specific options */
 
676
 
 
677
#if TARGET==DOS||TARGET==OS2||TARGET==WIN32
 
678
 #if TARGET==DOS
 
679
  #define EXE_EXTENSION            ".EXE"
 
680
  #define MOD_EXTENSION            ".COM"
 
681
 #else
 
682
  #define EXE_EXTENSION            ".exe"
 
683
  #define MOD_EXTENSION            ".dll"
 
684
 #endif
 
685
#else
 
686
 #define EXE_EXTENSION                 ""
 
687
 #define NULL_EXE_EXTENSION             /* For ARJ_USER to construct SFX names */
 
688
 #define MOD_EXTENSION              ".so"
 
689
#endif
 
690
 
 
691
/* OS-dependent types */
 
692
 
 
693
typedef unsigned short ATTRIB;          /* Attributes in internal structures */
 
694
 
 
695
/* File count type */
 
696
 
 
697
#define FILE_COUNT     unsigned long
 
698
 
 
699
 
 
700
/* Hard link search structure in ffblks and properties */
 
701
 
 
702
#if TARGET==UNIX
 
703
struct l_search
 
704
{
 
705
 dev_t dev;
 
706
 ino_t inode;
 
707
 nlink_t refcount;
 
708
 FILE_COUNT ref;
 
709
};
 
710
#endif
 
711
 
 
712
/* lfn_findfirst/findnext customized structure */
 
713
 
 
714
struct new_ffblk
 
715
{
 
716
 /* To stay compatible with findfirst/findnext functions that rely on DOS
 
717
    block format: */
 
718
 #if TARGET==DOS
 
719
  char ff_reserved[21];
 
720
 #endif
 
721
 #if TARGET!=UNIX
 
722
  char ff_attrib;
 
723
 #else
 
724
  int ff_attrib;
 
725
  int ff_ftype;                         /* Wild UNIX representation - for
 
726
                                           circular symlink treatment */
 
727
 #endif
 
728
 unsigned long ff_ftime;
 
729
 unsigned long ff_fsize;
 
730
 char ff_name[CCHMAXPATH];
 
731
 #if TARGET==DOS
 
732
  short ff_handle;
 
733
 #elif TARGET==OS2
 
734
  HDIR ff_handle;
 
735
 #elif TARGET==WIN32
 
736
  HANDLE ff_handle;
 
737
 #elif TARGET==UNIX
 
738
  DIR *ff_handle;
 
739
  char dir[CCHMAXPATH];                 /* dirent doesn't hold it */
 
740
  char wildcard[CCHMAXPATH];            /* dirent doesn't hold it */
 
741
  int attrs;                            /* dirent doesn't hold it */
 
742
  struct l_search l_search;
 
743
 #endif
 
744
 unsigned long ff_atime;
 
745
 unsigned long ff_ctime;
 
746
};
 
747
 
 
748
/* File information structure (used in file_find and so on) */
 
749
 
 
750
struct file_properties
 
751
{
 
752
 unsigned long fsize;
 
753
 unsigned long ftime;
 
754
 unsigned long atime;
 
755
 unsigned long ctime;
 
756
 ATTRIB attrib;
 
757
 char type;                             /* One of ARJT_* */
 
758
 char isarchive;
 
759
 /* For hardlink detection */
 
760
 #if TARGET==UNIX
 
761
  struct l_search l_search;
 
762
  char islink;
 
763
 #endif
 
764
};
 
765
 
 
766
/* Priority structure */
 
767
 
 
768
struct priority
 
769
{
 
770
 int class;
 
771
 int delta;
 
772
};
 
773
 
 
774
/* After defining all OS-dependent types, we may include additional files */
 
775
 
 
776
#include "filelist.h"                   /* For flist_root structure */
 
777
 
 
778
/* Exported from ENVIRON.C */
 
779
 
 
780
extern int friendly_systems[];
 
781
extern char dev_null[];
 
782
extern char dev_con[];
 
783
extern char cur_dir_spec[];
 
784
extern char up_dir_spec[];
 
785
extern char pathsep_str[];
 
786
extern char all_wildcard[];
 
787
extern char root_wildcard[];
 
788
 
 
789
/*
 
790
 * Macro section
 
791
 */
 
792
 
 
793
/* A substitution of kbhit() */
 
794
 
 
795
#if COMPILER==BCC||COMPILER==MSC||COMPILER==MSVC
 
796
 #define flush_kbd() kbhit()
 
797
#else
 
798
 #define flush_kbd() fetch_keystrokes()
 
799
#endif
 
800
 
 
801
/* OS-dependent strcmp() used for comparing filenames */
 
802
 
 
803
#ifdef HAVE_STRCASECMP
 
804
 #define stricmp strcasecmp
 
805
#endif
 
806
 
 
807
#ifdef CASE_INSENSITIVE
 
808
 #define strcmp_os(s1, s2) stricmp(s1, s2)
 
809
 #define strncmp_os(s1, s2, l) strnicmp(s1, s2, l)
 
810
#else
 
811
 #define strcmp_os(s1, s2) strcmp(s1, s2)
 
812
 #define strncmp_os(s1, s2, l) strncmp(s1, s2, l)
 
813
#endif
 
814
 
 
815
/* IBM's implementation of XPG4 CRT (LIBCS.DLL in OS/2) can't do localtime() properly.
 
816
   So we expose a timezone variable and use a homebrew implementation. May be used as a
 
817
   macro, i.e. real timezone converted to seconds. */
 
818
 
 
819
#if (defined(LIBC)&&TARGET==OS2)||TARGET==WIN32
 
820
 #define TZ_VAR             _timezone
 
821
#endif
 
822
 
 
823
/* fchmod() to make SFX'es executable and other archives non-executable */
 
824
 
 
825
#if TARGET==UNIX
 
826
 int file_acc(FILE *stream);
 
827
 void make_executable(FILE *stream);
 
828
 #define make_nonexecutable(stream) fchmod(fileno(stream), file_acc(stream)&~0111)
 
829
#else
 
830
 #define make_executable(stream)
 
831
 #define make_nonexecutable(stream)
 
832
#endif
 
833
 
 
834
/* Block optimizers in insane compilers. __LINE__ is for the compiler to be unable
 
835
   to optimize the function arguments if called more than once. */
 
836
 
 
837
#if COMPILER==HIGHC||COMPILER==ICC
 
838
 #define stop_optimizer() nullsub(__LINE__)
 
839
#else                                   /* Others are considered sane */
 
840
 #define stop_optimizer()
 
841
#endif
 
842
 
 
843
/*
 
844
 * Exported function prototypes - see ENVIRON.C for details
 
845
 */
 
846
 
 
847
#if TARGET==UNIX
 
848
#define SKIP_GET_EXE_NAME
 
849
void get_exe_name(char *dest, char *arg);
 
850
#else
 
851
void get_exe_name(char *dest);
 
852
#endif
 
853
#if TARGET==OS2&&SFX_LEVEL>=ARJSFX
 
854
 char *malloc_env_str(char *t);
 
855
 #define free_env_str(str) free(str)
 
856
 int system_cmd(char *cmd);
 
857
#else
 
858
 #define malloc_env_str(t) getenv(t)
 
859
 #define free_env_str(str)
 
860
 #define system_cmd(cmd) system(cmd)
 
861
#endif
 
862
 
 
863
#if SFX_LEVEL!=ARJSFXJR
 
864
 
 
865
int verify_heap();
 
866
int verify_far_heap();
 
867
#if SFX_LEVEL>=ARJSFXV&&COMPILER!=BCC
 
868
long farcoreleft();
 
869
#endif
 
870
#if COMPILER!=BCC
 
871
 #ifndef SUNOS 
 
872
  int getdisk();
 
873
  int setdisk(int drive);
 
874
 #endif
 
875
 void arj_gettime(struct time *ts);
 
876
 void arj_getdate(struct date *ds);
 
877
#else
 
878
 #define arj_gettime(x) gettime(x)
 
879
 #define arj_getdate(x) getdate(x)
 
880
#endif
 
881
#if TARGET==OS2&&defined(TILED)
 
882
 void FAR *farcalloc_based(unsigned long num, unsigned long size);
 
883
 void farfree_based(void FAR *ptr);
 
884
#else
 
885
 #define farcalloc_based farcalloc
 
886
 #define farfree_based farfree
 
887
#endif
 
888
void set_priority(struct priority *priority);
 
889
int test_for_winnt();
 
890
int file_chmod(char *name, int action, int attrs);
 
891
int lfn_findfirst(char *path, struct new_ffblk *new_ffblk, int attrib);
 
892
int lfn_findnext(struct new_ffblk *new_ffblk);
 
893
void lfn_findclose(struct new_ffblk *new_ffblk);
 
894
void toupper_loc(unsigned char *ptr, int length);
 
895
time_t sum_time(time_t t1, time_t t2);
 
896
time_t sub_time(time_t t1, time_t t2);
 
897
void case_path(char *s);
 
898
int find_dupl_drivespecs(char **argtable, int args);
 
899
int file_test_access(char *name);
 
900
int detect_lfns();
 
901
int detect_eas();
 
902
void fix_ansi_name(char *name);
 
903
void nullsub(int arg, ...);
 
904
/* IN ARJ32, it fixes filename to comply with OEM/ANSI codepage issues */
 
905
#define fix_ansi_name(name)
 
906
void arj_delay(unsigned int seconds);
 
907
void mem_stats();
 
908
int file_exists(char *name);
 
909
FILE *file_open(char *name, char *mode);
 
910
void default_case_path(char *dest, char *src);
 
911
int uni_getch();
 
912
unsigned long get_ticks();
 
913
unsigned long file_getfree(char *name);
 
914
int file_find(char *name, struct file_properties *properties);
 
915
#if SFX_LEVEL>=ARJ||defined(REARJ)
 
916
 long file_getfsize(char *name);
 
917
#endif
 
918
unsigned long file_getftime(char *name);
 
919
int file_getlabel(char *label, char drive, ATTRIB *attrib, unsigned long *ftime);
 
920
int read_line(char *buf, int size);
 
921
void get_mode_str(char *str, unsigned int mode);
 
922
int exec_pgm(char *cmdline);
 
923
#if TARGET==OS2&&SFX_LEVEL>=ARJSFX
 
924
 char *malloc_env_str(char *t);
 
925
 #define free_env_str(str) free(str)
 
926
 int system_cmd(char *cmd);
 
927
#else
 
928
 #define malloc_env_str(t) getenv(t)
 
929
 #define free_env_str(str)
 
930
 #define system_cmd(cmd) system(cmd)
 
931
#endif
 
932
int read_line_noecho(char *buf, int size);
 
933
unsigned int get_bytes_per_cluster(char *name);
 
934
void get_canonical_longname(char *cname, char *name);
 
935
void get_canonical_shortname(char *cname, char *name);
 
936
void install_smart_handler();
 
937
int is_file(FILE *stream);
 
938
int file_is_removable(char *name);
 
939
int is_tty(FILE *stream);
 
940
int file_mkdir(char *name);
 
941
int match_wildcard(char *name, char *wcard);
 
942
int file_rmdir(char *name);
 
943
int file_unlink(char *name);
 
944
int file_rename(char *oldname, char *newname);
 
945
int dos_clear_arch_attr(char *name);
 
946
int reset_drive(char *name);
 
947
int fetch_keystrokes();
 
948
int dos_chmod(char *name, int attrib);
 
949
int file_chsize(FILE *stream, unsigned long size);
 
950
int file_setftime_on_stream(FILE *stream, unsigned long ftime);
 
951
int file_setatime(char *name, unsigned long ftime);
 
952
int file_setctime(char *name, unsigned long ftime);
 
953
int file_setftime(char *name, unsigned long ftime);
 
954
int file_setlabel(char *label, char drive, ATTRIB attrib, unsigned long ftime);
 
955
int file_settype(FILE *stream, int istext);
 
956
void set_file_apis(int is_ansi);
 
957
#if SFX_LEVEL>=ARJSFXV
 
958
 int create_subdir_tree(char *path, int qmode, int datatype);
 
959
#else
 
960
 int create_subdir_tree(char *path, int datatype);
 
961
#endif
 
962
int is_filename_valid(char *name);
 
963
int is_directory(char *name);
 
964
char *malloc_subdir_wc(char *name);
 
965
int file_copy(char *dest, char *src, int chk);
 
966
#ifndef REARJ
 
967
 int wild_list(struct flist_root *root, struct flist_root *search_flist, char *name, int expand_wildcards, int recurse_subdirs, int file_type, FILE_COUNT *count);
 
968
#else
 
969
 int wild_list(struct flist_root *root, char *name, int file_type, int expand_wildcards, int recurse_subdirs, FILE_COUNT *count);
 
970
#endif
 
971
 
 
972
#if SFX_LEVEL>=ARJSFX&&SFX_LEVEL<=ARJSFXV
 
973
 void file_getcwd(char *buf, int len);
 
974
 void file_chdir(char *dir);
 
975
#endif
 
976
 
 
977
#ifdef REARJ
 
978
 char *file_getcwd(char *buf);
 
979
 int file_chdir(char *dir);
 
980
 char get_sw_char();
 
981
#endif
 
982
 
 
983
#endif /* !ARJSFXJR */
 
984
 
 
985
int file_setftime_on_hf(int hf, unsigned long ftime);
 
986
 
 
987
#endif