1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
|
/*0 */
/*-----------------------------------------------------------
/*-
/*- FILE: BACKUP.H
/*-
/*- PURPOSE: For the BACKUP utility, this file has the required
/*- BACKUP defines, message numbers, structures,
/*- and subroutine declarations.
/*-
/*---------------------------------------------------------*/
/*----------------------
/*- Utility #DEFINES...
/*----------------------*/
#define DHLENGTH 139 /* Length, in bytes, of a Disk Header */
#define DBLENGTH 70 /* Length, in bytes, of a Directory Block */
#define FHLENGTH 34 /* Length, in bytes, of a File Header */
#define BYTE unsigned char
#define WORD unsigned short
#define DWORD unsigned long
#define NOERROR 0
#define NUL 0
#define FALSE 0
#define TRUE !FALSE
#define BACKSLASH 0x5c
#define READONLYOFF 254 /* bit mask, will be ANDed with current attribute to turn off readonly bit */
#define READONLY 0x01 /* File Attributes */
#define HIDDEN 0x02
#define SYSTEM 0x04
#define VOLLABEL 0x08
#define SUBDIR 0x10
#define ARCHIVE 0x20
#define DENYALL 0x10 /* Sharing Mode */
#define DENYWRITE 0x20
#define DENYREAD 0x30
#define DENYNONE 0x40
#define READACCESS 0x00 /* Access Modes */
#define WRITEACCESS 0x01
#define READWRITE 0x02
#define NO_CP_CHECK 0x100 /*;AN000;5*/
#define SYNCHRONOUS 0x4000 /* OS/2 File Write-Through */
#define NOTSYNCHRONOUS 0x0000 /* OS/2 File Write-Through */
#define OPENDASD 0x8000 /* OS/2 Open a DASD device */
#define OPEN_IT 0x01 /*;AN000;5*/
#define CREATE_IT 0x12 /*;AN000;5*/
#define NO_INHERIT 0x80 /* Inheritance bit */
#define STDIN 0x00 /* Predefined handles */
#define STDOUT 0x01
#define STDERR 0x02
#define BOFILE 0 /* LSEEK move methods */
#define CURRPOS 1
#define EOFILE 2
#define GET 0 /* CHMOD functions */
#define SET 1
#define SSTRING 0x2000 /*;AN000;4 Parser Match Flags */
#define DATESTRING 0x1000 /*;AN000;4*/
#define TIMESTRING 0x0800 /*;AN000;4*/
#define FILESPEC 0x0200 /*;AN000;4*/
#define DRIVELETTER 0x0100 /*;AN000;4*/
#define OPTIONAL 0x0001 /*;AN000;4*/
#define CAP_FILETABLE 0x0001 /*;AN000;4 Parser Function flag*/
#define CAP_CHARTABLE 0x0002 /*;AN000;4 Parser Function flag*/
#define LABELLEN 11
#define SETLOGICALDRIVE 0x440F /*;AN000;8 */
/*--------APPEND FUNCTIONS-----------*/
#define INSTALL_CHECK 0xB700 /*;AN000;2*/
#define NOT_INSTALLED 0 /*;AN000;2*/
#define GET_APPEND_VER 0xB702 /*;AN000;2*/
#define NET_APPEND 1 /*;AN000;2*/
#define DOS_APPEND 2 /*;AN000;2*/
#define GET_STATE 0xB706 /*;AN000;2*/
#define SET_STATE 0xB707 /*;AN000;2*/
#define APPEND_X_BIT 0x8000 /*;AN000;2*/
#define ACTIONHOOK 2
#define CTRLC 1
#define CTRLBREAK 4
#define EOL -1 /*;AN000;4*/
#define QUOTED_STRING 9 /*;AN000;4*/
#define RET_DATE 7 /*;AN000;4*/
#define RET_TIME 8 /*;AN000;4*/
#define CPSW_ACTIVE 1 /*;AN000;3*/
#define CPSW_NOTACTIVE 0 /*;AN000;3*/
#define GET_CPSW 0x3303 /*;AN000;3*/
#define CARRY 0x0001 /*;AN000;*/
/***********************************/
/* Utility-specific definitions */
/***********************************/
#define ROOTDIR 0
#define BACKUPDIR 1
#define PUT_SEG(fp,seg) (*((unsigned *)&(fp)+1)) = (unsigned) seg
#define PUT_OFF(fp,off) (*((unsigned *)&(fp))) = (unsigned) off
#define MAXMSGLEN 160
#define PATHLEN 64
#define MAX_RETRY_OPEN_COUNT 5
#define RETCODE_NO_ERROR 0 /* Errorlevels */
#define RETCODE_NO_FILES 1
#define RETCODE_SHARE_ERROR 2
#define RETCODE_CTL_BREAK 3
#define RETCODE_ERROR 4
/************************************************/
/* NOTE FROM PARSER SUBROUTINE !!!!! */
/************************************************/
/* The SECONDS bits in the DOS Directory are in */
/* 2-second increments. Therefore, div by 2, */
/* take the integer portion and use in search. */
/* Note that files can be backed up that were */
/* modified 1 second before the time that a user*/
/* enters, which is better than not backing up */
/* a file that was modified at exactly that time*/
/************************************************/
/*-------------------------------------------*/
/*------ BACKUP messages --------*/
/*-------------------------------------------*/
#define BAD_DOS_VER 1 /*;AN000;6*/
#define INSUFF_MEMORY 2 /*;AN000;6*/
#define INV_DRIVE 6 /*;AN000;6*/
#define INV_DATE 7 /*;AN000;6*/
#define INV_TIME 8 /*;AN000;6*/
#define INV_PATH 11 /*;AN000;6*/
#define NO_SOURCE 12 /*;AN000;6*/
#define NO_TARGET 13 /*;AN000;6*/
#define SRC_AND_TGT_SAME 14 /*;AN000;6*/
#define ERR_EXEC_FORMAT 15 /*;AN000;6*/
#define CANT_FIND_FORMAT 16 /*;AN000;d178*/
#define CANT_OPEN_LOGFILE 17 /*;AN000;6*/
#define LOGGING 18 /*;AN000;6*/
#define NOTLASTMSG 19 /*;AN000;6*/
#define ERASEMSG 20 /*;AN000;6*/
#define FERASEMSG 21 /*;AN000;6*/
#define BUDISKMSG 22 /*;AN000;6*/
#define SEQUENCEMSG 23 /*;AN000;6*/
#define NONEFNDMSG 24 /*;AN000;6*/
#define INSERTSOURCE 25 /*;AN000;6*/
#define INSERTTARGET 26 /*;AN000;6*/
#define CONFLICTMSG 27 /*;AN000;6*/
#define LASTDISKMSG 28 /*;AN000;6*/
#define INVTARGET 29 /*;AN000;6*/
#define LASTNOTBACKUP 30 /*;AN000;6*/
#define FDISKFULLMSG 31 /*;AN000;6*/
#define LOGFILE_TARGET_FULL 32 /*;AN000;6*/
#define PRESS_ANY_KEY 33 /*;AN000;6*/
#define CRLF 34 /*;AN000;6*/
#define CANT_FORMAT_HARDFILE 35 /*;AN000;/*
/*------------------------------------*/
/*- MESSAGE CLASSES -*/
/*------------------------------------*/
#define EXTENDED 1 /*;AN000;6*/
#define PARSEERROR 2 /*;AN000;6*/
#define UTIL_MSG -1 /*;AN000;6*/
#define NOWAIT 0 /*;AN000;6*/
#define WAIT 0xc8 /*;AN000;6*/
/*-------------------------------------------------------------*/
/*- CONTROL BLOCK FOR EACH BACKUP DISKETTE */
/*-------------------------------------------------------------*/
/*- THIS STRUCTURE WILL MAKE UP THE FIRST DH_DHLength BYTES */
/*- OF THE control.xxx FILE ON THE BACKUP TARGET. */
/*- IT IDENTIFIES THE DISK AS BEING A BACKUP, AND INCLUDES */
/*- DISKETTE SEQUENCE NUMBER AND A FLAG INDICATING IF THIS */
/*- IS THE LAST TARGET. */
/*-------------------------------------------------------------*/
#define LAST_TARGET 0xFF
#define NOT_LAST_TARGET 0x00
struct Disk_Header
{
BYTE DH_Length; /* Length, in bytes, of disk header */
BYTE DH_Identifier[8]; /* Identifies disk as a backup */
BYTE DH_Sequence; /* Backup diskette seq num (1-255) */
BYTE DH_reserved [128]; /* Save area for nothing */
BYTE DH_LastDisk; /* Indicates if this is last target */
/* 0xFF if last target, 0 otherwise */
};
/*----------------------------------------------------------------------*/
/*- DIRECTORY BLOCK */
/*----------------------------------------------------------------------*/
/*- THIS STRUCTURE IS WRITTEN TO THE control.xxx FILE AT LEAST ONCE */
/*- FOR EACH SUBDIRECTORY, INCLUDING THE ROOT, BACKED UP. IT CONTAINS */
/*- THE PATH TO THAT DIRECTORY, THE NUMBER OF FILES FROM THAT */
/*- DIRECTORY THAT ARE BACKED UP ON CURRENT TARGET, AND THE OFFSET */
/*- OF THE NEXT DIRECTORY BLOCK ON THAT DISKETTE, IF ONE EXISTS. */
/*- IF THERE ARE NO OTHER DIRECTORY BLOCKS, IT EQUALS 0xffffffff. */
/*----------------------------------------------------------------------*/
#define LAST_DB 0xFFFFFFFF
struct Dir_Block
{
BYTE DB_Length; /* Length, in bytes, of dir block */
BYTE DB_Path[63];
/* ASCII path of this directory, */
/* drive letter omitted */
WORD DB_NumEntries; /* Num of filenames currently in list*/
DWORD DB_NextDB; /* Offset of next directory block */
}; /* =0xffffffff if there are no more*/
/* on current target */
/*--------------------------------------------------------------------*/
/*- CONTROL BLOCK FOR EACH BACKED-UP FILE */
/*--------------------------------------------------------------------*/
/*- THIS STRUCTURE WILL BE REPEATED AFTER THE DIRECTORYBLOCK ONCE */
/*- FOR EACH FILE BACKED UP FROM THAT DIRECTORY. IT CONTAINS THE */
/*- FILENAME, DIRECTORY INFORMATION, AND OTHER NECESSARY INFORMATION. */
/*--------------------------------------------------------------------*/
#define NOTLASTPART 0
#define LASTPART 1
#define NOTSUCCESSFUL 0
#define SUCCESSFUL 2
#define EXT_ATTR 4 /*;AN000;3*/
struct File_Header
{
BYTE FH_Length; /* Length, in bytes, of file header */
BYTE FH_FName[12]; /* ASCII file name (from directory)*/
BYTE FH_Flags; /* bit 0=1 if last part of file */
/* bit 1=1 if it is backed up successfully */
/* bit 2=1 if Extended Attributes are backed up (New for DOS4.00) ;AN000;3*/
DWORD FH_FLength; /* Total length of the file (from directory) */
WORD FH_FSequence; /* Sequence #, for files that span */
DWORD FH_BeginOffset; /* Offset in BACKUP.xxx where this segment begins */
DWORD FH_PartSize; /* Length of part of file on current target */
WORD FH_Attribute; /* File attribute (from directory) */
WORD FH_FTime; /* Time when file was last modified (from directory)*/
WORD FH_FDate; /* Date when file was last modified (from directory)*/
};
/*--------------------------------------------------------------------*/
/*- THIS IS THE STRUCTURE THAT IS USED IN THE LINKED LIST OF */
/*- DIRECTORIES THAT NEED TO BE PROCESSED (if /S option specified) */
/*--------------------------------------------------------------------*/
struct node
{
struct node *np;
char path[PATHLEN+15];
};
/*--------------------------------------------------------------------*/
/*- THIS IS THE STRUCTURE THAT IS USED BY THE DOS FUNCTION */
/*- "RETURN COUNTRY INFORMATION" */
/*--------------------------------------------------------------------*/
struct ctry_info_blk
{
WORD country_code;
WORD code_page;
WORD date_format;
#define USA 0
#define EUR 1
#define JAP 2
BYTE currency_symbol[5];
WORD thousands_separator;
WORD decimal_Separator;
WORD date_separator;
WORD time_separator;
BYTE currency_format;
BYTE num_sig_dec_dig_in_currency;
BYTE time_format;
DWORD case_map_call;
WORD data_list_separator;
WORD reserved[5];
};
/*------------------------------------------------------------------------*/
/*- THIS STRUCTURE IS USED BY THE DOS MESSAGE HANDLER SERVICE ROUTINES -*/
/*------------------------------------------------------------------------*/
/************************************************/
/* Substitution List for Message Retriever */
/************************************************/
/*-----------------------
; SUBLIST Equates
;------------------------*/
#define SUBLIST_SIZE 11 /*;AN000;6*/
#define LEFT_ALIGN 0x0 /*;AN000;600xxxxxx */
#define RIGHT_ALIGN 0x80 /*;AN000;610xxxxxx */
#define CHAR_FIELD_CHAR 0x0 /*;AN000;6a0000000 */
#define CHAR_FIELD_ASCIIZ 0x10 /*;AN000;6a0010000 */
#define UNSGN_BIN_BYTE 0x11 /*;AN000;6a0010001 - Unsigned BINary to Decimal CHARacter */
#define UNSGN_BIN_WORD 0x21 /*;AN000;6a0100001 */
#define UNSGN_BIN_DWORD 0x31 /*;AN000;6a0110001 */
/*---------------------------------------------*/
/*- Message substitution list structure -*/
/*---------------------------------------------*/
struct subst_list /*;AN000;6*/
{ /*;AN000;6*/
BYTE sl_size1; /* Size of List */ /*;AN000;6*/
BYTE zero1; /* Reserved */ /*;AN000;6*/
char far *value1; /* Time, date, or ptr to data item*/ /*;AN000;6*/
BYTE one; /* n of %n */ /*;AN000;6*/
BYTE flags1; /* Data Type flags */ /*;AN000;6*/
BYTE max_width1; /* Maximum FIELD width */ /*;AN000;6*/
BYTE min_width1; /* Minimum FIELD width */ /*;AN000;6*/
BYTE pad_char1; /* Character for pad FIELD */ /*;AN000;6*/
BYTE sl_size2; /* Size of List */ /*;AN000;6*/
BYTE zero2; /* Reserved */ /*;AN000;6*/
char far *value2; /* Time; date; or ptr to data item*/ /*;AN000;6*/
BYTE two; /* n of %n */ /*;AN000;6*/
BYTE flags2; /* Data Type flags */ /*;AN000;6*/
BYTE max_width2; /* Maximum FIELD width */ /*;AN000;6*/
BYTE min_width2; /* Minimum FIELD width */ /*;AN000;6*/
BYTE pad_char2; /* Character for pad FIELD */ /*;AN000;6*/
}; /*;AN000;6*/
/*----------------------------------*/
/*- EXTENDED OPEN PARAMETER LIST -*/
/*----------------------------------*/
#define EXTATTBUFLEN 4086 /*;AN000;3*/
struct parm_list /*;AN000;3*/
{ /*;AN000;3*/
DWORD ext_attr_addr; /*;AN000;3*/
WORD num_additional; /*;AN000;3*/
BYTE id_io_mode; /*;AN000;3*/
WORD io_mode; /*;AN000;3*/
}; /*;AN000;3*/
/* */
/*----------------------------------------------------*/
/*- SUBROUTINE DECLARATIONS -*/
/*----------------------------------------------------*/
int cdecl sprintf(char *, char *, ...);
int cdecl printf(char *,...);
void alloc_buffer(void);
void alloc_first_node(void);
struct node * alloc_node(unsigned int);
void check_appendX(void); /*;AN000;2*/
void alloc_seg(void);
void build_ext(int);
void change_levels(void);
void check_date(WORD,BYTE,BYTE); /*;AN000;4*/
void check_DOS_version(void);
void check_drive_validity(int,char * []);
void check_for_device_names(char * []); /*;AN000;p2592*/
void check_last_target(void);
void check_path_validity(char * []);
void check_time(BYTE,BYTE,BYTE,BYTE); /*;AN000;4*/
void clean_up_and_exit(void);
void close_file(WORD);
void close_out_current_target(void);
void control_break_handler(void);
void create_target(void);
void datetime(void);
void delete(char *);
void delete_files(char);
long disk_free_space(void);
void display_it(int,WORD,int,BYTE,BYTE); /*;AN000;6*/
void display_msg(int);
void do_backup(void);
void do_copy(void);
void do_dos_error(WORD);
extern unsigned far pascal set_int24_vector(void); /*;AN000;*/
void error_exit(int);
WORD exist(char *);
WORD extended_open(WORD,WORD,char far *,WORD); /*;AN000;5*/
void file_sharing_error(void); /*;AN000;9*/
char far * far_ptr(WORD,WORD);
void findclose(WORD);
void find_all_subdirs(void);
void find_first(char *,WORD *,struct FileFindBuf *,WORD);
void find_first_file(void);
void find_format(void); /*;AN000;d178*/
void find_next(WORD,struct FileFindBuf *);
void find_next_file(void);
void find_the_first(void);
void find_the_next(void);
void format_target(void);
void free_seg(unsigned);
WORD get_attribute(char *);
void get_current_dir(WORD,char *);
WORD get_current_drive(void);
void get_country_info(void);
void get_diskette(void);
void get_drive_types(void);
void get_extended_attributes(WORD); /*;AN000;3 */
void get_first_target(void);
void get_hardfile(void);
void get_next_target(void);
void get_path(char *); /*;AN002;*/
WORD handle_open(char *,WORD);
WORD handle_read(WORD,WORD,char far *);
WORD handle_write(WORD,WORD,char far *);
void init(void); /*;AN000;6*/
void insert_node(char *);
WORD ioctl(WORD);
void label_target_drive(void);
DWORD lseek(WORD,BYTE,DWORD);
int main(int, char * []);
void mark_as_last_target(void);
void mark_as_not_last_target(void);
void mark_files_read_only(void);
void open_logfile(void);
void open_source_file(void);
void open_target(void);
void parser(int,char * []); /*;AN000;4*/
void parse_error(WORD,WORD); /*;AN000;4*//*;AN008;*/
void parse_init(void); /*;AN000;4*/
void process_switch(void); /*;AN000;4*//*;AN008;*/
void put_disk_header(void);
void put_new_db(void);
void put_new_fh(void);
void remove_last_backslash_from_BDS(void);
void remove_node(void);
void replace_volume_label(char *);
void reset_archive_bit(char *);
void restore_default_directories(void);
void save_current_dirs(void);
void see_if_it_should_be_backed_up(void);
void set_attribute(char *,WORD);
void set_vectors(void); /*;AN000;*/
void set_default_dir(void);
void set_default_drive(WORD);
void setsignal(WORD,WORD);
void show_path(void);
char *strcat(char *,const char *); /* */
size_t strlen(const char *); /* */
char *strcpy(char *, const char *); /* */
char *strncpy(char *, const char *, unsigned int); /* */
int strncmp(const char *,const char *,unsigned int);/* */
int strcmp(const char *,const char *); /* */
void terminate(void);
void update_db_entries(WORD);
void update_fh_entries(void);
/***** void write_extended_attributes(void); /*;AN000;3*/
WORD write_till_target_full(WORD,WORD);
void write_to_control_file(char far *,WORD);
void write_to_target(WORD);
void xlat(char *,char *); /*;AN000;*/
extern void sysloadmsg(union REGS *, union REGS *); /*;AN000;6*/
extern void update_logfile(union REGS *, union REGS *); /*;AN000;9*/
extern void sysdispmsg(union REGS *, union REGS *); /*;AN000;6*/
extern void parse (union REGS *, union REGS *); /*;AN000;4*/
/*-------------------------------*/
/*- From COMSUB.H */
/*-------------------------------*/
/* convert character to uppercase */
extern int com_toupper(
unsigned char ); /* character to be converted to uppercase */
/* search the first occurrence of a character in a string */
extern char *com_strchr(
unsigned char *, /* a source string */
unsigned char ); /* a character to be searched */
/* search the last charater occurrence in a string */
extern unsigned char
*com_strrchr(
unsigned char *, /* source string */
unsigned char ); /* target string */
|