|
|
1.1 root 1: /***
2: * Example of DOSQFSINFO and DOSSETFSINFO. Also DOSERROR.
3: *
4: * First do a DOSQFSINFO level 1 to get the A drive
5: * parameters, then a DOSQFSINFO level 2 to check the volume
6: * label of the A drive. Next do a DOSSETFSINFO to
7: * change the volume label to FSIDEMO, and lastly another
8: * DOSQFSINFO level 2 to verify the set.
9: */
10:
11: #include <doscalls.h>
12:
13: #define FSIBUF 40
14:
15: unsigned drive; /* drive number */
16: unsigned retcode; /* return code from call */
17: unsigned testbufsiz; /* length of volume label to set */
18: int *date_time; /* date and time returned by level 2 query */
19: char setlabel[] = "\007FSIDEMO"; /* buffer for DosSetFSInfo */
20: /* starts with byte of string length */
21:
22: /* FSInfoBuf level 1 */
23: typedef struct {
24: unsigned long fsID; /* file system ID */
25: unsigned long SecPerAU; /* number of sectors per alloc. unit */
26: unsigned long NumAU; /* number of allocation units */
27: unsigned long NumAUAvail; /* available allocation units */
28: unsigned BytesSec; /* number of bytes per sector */
29: } lev1buf;
30:
31: lev1buf fsinfobuf;
32:
33: /* the level 2 FSInfoBuf buffer contains
34: * 2 bytes - volume label date of creation
35: * 2 bytes - volume label time of creation
36: * 1 byte - length of volume label
37: * 'n' bytes - the volume label string
38: */
39:
40: char buffer[FSIBUF]; /* buffer for DosQFSInfo, level 2 */
41:
42: main()
43: {
44: unsigned level;
45: drive = 1; /* A drive */
46:
47: /* turn off hard errors so we see if user has drive A open */
48: DOSERROR(0);
49:
50: /* check the parameters of the A drive using DOSQFSINFO level 1 */
51: level = 1;
52: retcode = DOSQFSINFO( drive, level, (char *)&fsinfobuf, FSIBUF);
53:
54: if ( retcode )
55: printf("Received error %d from DOSQFSINFO\n", retcode);
56: else {
57: printf("DOSQFSINFO provided the following information:\n");
58: printf(" File System ID - %ld\n", fsinfobuf.fsID);
59: printf(" Sectors per allocation unit - %ld\n",
60: fsinfobuf.SecPerAU);
61: printf(" Number of allocation units - %ld\n",
62: fsinfobuf.NumAU);
63: printf(" Available allocation units - %ld\n",
64: fsinfobuf.NumAUAvail);
65: printf(" Bytes per sector - %d\n\n",
66: fsinfobuf.BytesSec);
67: }
68:
69: /* check for a volume label on the A drive using DOSQFSINFO
70: * level 2. Access the data in the buffer as follows:
71: * time - first pair of bytes in the buffer (date_time[0])
72: * date - second pair of bytes in the buffer (date_time[1])
73: * label length - resides at buffer[4], 4 bytes into buffer
74: * label - string starts at the fifth byte of the buffer
75: */
76:
77: level = 2;
78: retcode = DOSQFSINFO( drive, level, (char *)buffer, FSIBUF);
79:
80: date_time = (int *)buffer; /* pointer into time/date info */
81: if ( !retcode ) { /* got volume label */
82: printf("DOSQFSINFO found volume label %s on drive %d\n",
83: buffer+5, drive );
84: printf(" label length %d, date 0x%x, time 0x%x\n\n",
85: buffer[4], date_time[0], date_time[1] );
86: }
87: else if ( retcode == 125 )
88: printf("No volume label found by DOSQFSINFO on drive %d\n\n",
89: drive );
90: else
91: printf("DOSQFSINFO call failed with error %d\n\n", retcode );
92:
93: /* do a DosSetFSInfo, changing the volume label to FSIDEMO */
94: testbufsiz = strlen( setlabel );
95:
96: retcode = DOSSETFSINFO( drive, level, setlabel, testbufsiz);
97:
98: if ( retcode )
99: printf("Error %d setting volume label to %s on drive %d\n\n",
100: retcode, setlabel, drive);
101: else {
102: printf("DOSSETFSINFO set volume label %s\n", setlabel+1);
103:
104: /* do a DosQFSInfo to verify the set */
105: DOSQFSINFO( drive, level, (char *)buffer, FSIBUF);
106: printf("DOSQFSINFO found label %s\n", buffer+5);
107: }
108: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.