summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/BACKUP/BACKUP.H
blob: 61cc9815468a3a2fed075fd7cd4024ed05619c15 (plain) (blame)
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 */