|
|
1.1 ! root 1: DMSDOS ioctl commands (outdated.... newers are missing here) ! 2: ! 3: ***************************************************************************** ! 4: WARNING: INFORMATION IN THIS FILE IS OUTDATED AND PARTIALLY WRONG. SEE THE ! 5: DMSDOS UTILITIES SOURCE CODE FOR PROGRAMMING EXAMPLES. ! 6: ! 7: When I have enough time I write better documentation..... ! 8: ***************************************************************************** ! 9: ! 10: Example code: ! 11: ! 12: #include<stdio.h> ! 13: #include<linux/dmsdos_fs.h> ! 14: #include<sys/ioctl.h> ! 15: #include<sys/types.h> ! 16: #include<sys/stat.h> ! 17: #include<fcntl.h> ! 18: #include<string.h> ! 19: #include<errno.h> ! 20: ! 21: Dblsb dblsb; ! 22: int fd; ! 23: int ret; ! 24: unsigned long w[10]; ! 25: Mdfat_entry mde; ! 26: ! 27: /* open file descriptor fd */ ! 28: fd=open(CVF_name,O_RDONLY); ! 29: if(fd<0) ! 30: { printf("No such file or directory.\n"); ! 31: return; ! 32: } ! 33: ! 34: DMSDOS_GET_DBLSB: ! 35: read DMSDOS version number and read CVF parameters in dblsb structure. ! 36: This function also performs a version check, i.e. if the dmsdos driver in ! 37: the kernel thinks the version number you supply in s_dcluster is too old, ! 38: it "or"s the returned value with 0x0f000000 and doesn't fill in the values ! 39: for the dblsb structure. ! 40: ! 41: ** Since not all DMSDOS versions support all commands, this ioctl should be ! 42: always issued first ** ! 43: ! 44: dblsb.s_dcluster=DMSDOS_VERSION; ! 45: ret=ioctl(fd,DMSDOS_GET_DBLSB,&dblsb); ! 46: if(ret<0) ! 47: { printf("This is not a DMSDOS directory.\n"); ! 48: exit(1); ! 49: } ! 50: printf("You are running DMSDOS Version %d.%d.%d.\n\n",(ret&0xff0000)>>16, ! 51: (ret&0x00ff00)>>8,ret&0xff); ! 52: if(ret&0x0f000000) ! 53: { printf("This program is too old for the DMSDOS version you are running.\n"); ! 54: exit(1); ! 55: } ! 56: ! 57: dblsb structure see dmsdos.h. ! 58: ! 59: DMSDOS_READ_BITFAT: ! 60: read bitfat entry ! 61: w[0]=sectornr; returns 0 in w[1] if sector free ! 62: ! 63: ret=ioctl(fd,DMSDOS_READ_BITFAT,w); ! 64: if(ret<0)error.....; ! 65: ! 66: DMSDOS_WRITE_BITFAT: ! 67: write bitfat entry ! 68: w[0]=sectornr, w[1]=new value (0=free, 1=allocated) ! 69: ! 70: ret=ioctl(fd,DMSDOS_WRITE_BITFAT,w); ! 71: if(ret<0)error.....; ! 72: ! 73: DMSDOS_READ_MDFAT: ! 74: read mdfat entry ! 75: w[0]=clusternr; returns result in mde structure. ! 76: ! 77: w[1]=&mde; ! 78: ret=ioctl(fd,DMSDOS_READ_MDFAT,w); ! 79: if(ret<0)error......; ! 80: ! 81: DMSDOS_WRITE_MDFAT: ! 82: write mdfat entry ! 83: w[0]=clusternr; mde=new mdfat entry value. ! 84: ! 85: w[1]=&mde; ! 86: ret=ioctl(fd,DMSDOS_WRITE_MDFAT,w); ! 87: if(ret<0)error......; ! 88: ! 89: raw MDFAT entry: 32/40 bit number (hidden to the user) ! 90: ! 91: dos 6.x, Win95 without drivespace 3: ! 92: 3322222222221111111111 ! 93: 10987654321098765432109876543210 ! 94: ucaaaammmm?sssssssssssssssssssss ! 95: ! 96: Win95 with drivespace 3: ! 97: 33333333322222222221111111111 ! 98: 9876543210987654321098765432109876543210 ! 99: ucaaaaaammmmmm??ssssssssssssssssssssssss ! 100: ! 101: Mdfat_entry structure: (the dmsdos driver automatically converts it to the ! 102: appropriate 32 or 40 bit number) ! 103: ! 104: mde.sector_minus_1= ('ssss...' bits) ! 105: mde.size_lo_minus_1= ('mmmmmm' bits) ! 106: mde.size_hi_minus_1= ('aaaaaa' bits) ! 107: mde.flags= ('uc' bits) ! 108: mde.unknown= ('?' bit(s)), are NOT written, always set to zero ! 109: ! 110: u: 1=entry is used, 0=entry is free ! 111: c: 1=cluster is uncompressed, 0=cluster is compressed ! 112: a: uncompressed size minus 1 (number of sectors belonging to this cluster) ! 113: m: compressed size minus 1 ( " " " ) ! 114: ?: unknown, but seem(s) to be used sometimes ! 115: s: sector number minus 1 (theoretical 2 GB limit) ! 116: The sector number is counted from the beginning of the CVF file ! 117: starting with sector number 0. ! 118: ! 119: DMSDOS_SET_COMP: ! 120: set compression method for write access. ! 121: ! 122: ioctl(fd,DMSDOS_SET_COMP,READ_ONLY); or: ! 123: ioctl(fd,DMSDOS_SET_COMP,UNCOMPRESSED); or: ! 124: ioctl(fd,DMSDOS_SET_COMP,GUESS); or: ! 125: ioctl(fd,DMSDOS_SET_COMP,DS_0_0); or: ! 126: ioctl(fd,DMSDOS_SET_COMP,DS_0_1); or: ! 127: ioctl(fd,DMSDOS_SET_COMP,DS_0_2); or: ! 128: ioctl(fd,DMSDOS_SET_COMP,JM_0_0); or: ! 129: ioctl(fd,DMSDOS_SET_COMP,JM_0_1); or: ! 130: ioctl(fd,DMSDOS_SET_COMP,SQ_0_0); ! 131: ! 132: DMSDOS_SET_CF: ! 133: set compression level: ! 134: ! 135: ioctl(fd,DMSDOS_SET_CF,level-1); ! 136: ! 137: DMSDOS_EXTRA_STATFS: ! 138: special statfs command for dmsdos ! 139: reads special info in w. ! 140: ! 141: ioctl(fd,DMSDOS_EXTRA_STATFS,w); ! 142: ! 143: w[0]= free sectors in CVF. ! 144: w[1]= used sectors. ! 145: w[2]= maximum free unfragmented sectors (contiguous sectors) ! 146: w[3]= free fat clusters ! 147: w[4]= used fat clusters ! 148: w[5]= clusters allocated in fat but free in MDFAT (filesystem error if > 0) ! 149: w[6]= sum of sectors used by compressed clusters ! 150: w[7]= sum of sectors used by uncompressed clusters ! 151: w[8]= number of compressed clusters ! 152: w[9]= number of uncompressed clusters ! 153: ! 154: DMSDOS_READ_BLOCK: ! 155: read sector from CVF; returns sector contents in bstruct.data; ! 156: ! 157: struct bstruct ! 158: { unsigned long sectornr; ! 159: unsigned char data[512]; ! 160: }; ! 161: ! 162: bstruct.sectornr= sector number; ! 163: ! 164: ioctl(fd,DMSDOS_READ_BLOCK,&bstruct); ! 165: ! 166: DMSDOS_WRITE_BLOCK: ! 167: ! 168: analogue to read_block... ! 169: ! 170: DMSDOS_READ_DIRENTRY: ! 171: DMSDOS_WRITE_DIRENTRY: ! 172: ! 173: removed and unsupported... ! 174: ! 175: DMSDOS_READ_DFAT: ! 176: w[0]=clusternr; returns fat entry value in w[1]; (last=-1 or 0xFFFFFFFF) ! 177: ! 178: ret=ioctl(fd,DMSDOS_READ_DFAT,w); ! 179: if(ret<0)error......; ! 180: ! 181: DMSDOS_WRITE_DFAT: ! 182: w[0]=clusternr; w[1]=new value; ! 183: ! 184: ret=ioctl(fd,DMSDOS_WRITE_DFAT,w); ! 185: if(ret<0)error......; ! 186: ! 187: DMSDOS_SIMPLE_CHECK: ! 188: performs simple filesystem check (crosslinks & allocation errors) ! 189: w[0]=0; means do not try to repair errors ! 190: ! 191: returns result in w[0] (0=ok, -1=FAT error, -2=MDFAT error, -3=BITFAT error, ! 192: 1=out of memory, check aborted, ! 193: 2=FAT ok, but out of memory for MDFAT check) ! 194: ! 195: ioctl(fd,DMSDOS_SIMPLE_CHECK,w); ! 196: if(w[0]==....)printf(.....); ! 197: ! 198: ! 199: dmsdos daemon ioctls missing here....
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.