home *** CD-ROM | disk | FTP | other *** search
- /*
- ** SETVOL.C - set, change, or kill a disk volume label
- **
- ** public domain demo by Bob Stout
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <dos.h>
- #include <io.h>
-
- #if defined(__TURBOC__)
- #pragma option -a-
- #include <dir.h>
- #define _dos_findfirst(f,a,b) findfirst(f,b,a)
- #define _dos_findnext(b) findnext(b)
- #define find_t ffblk
- #define _A_VOLID FA_LABEL
- #define attrib ff_attrib
- #define name ff_name
- #define size ff_size
- #define wr_time ff_time
- #define wr_date ff_date
- #define dos_creat _creat
- #else
- #include <direct.h>
- #if defined(__ZTC__)
- #pragma ZTC align 1
- #if __ZTC__ < 0x210
- #include <mflfiles.h> /* old ZTC didn't do recursive find first/next */
- #include <msport.h> /* ...so use MFLZT library functions */
- #endif
- #else /* MSC/QC/WATCOM/METAWARE */
- #pragma pack(1)
- int dos_creat(const char *fname, unsigned attrib)
- {
- int fd;
-
- if (_dos_creat(fname, attrib, &fd))
- return -1;
- else return fd;
- }
- #endif
- struct fcb {
- char fcb_drive;
- char fcb_name[8];
- char fcb_ext[3];
- short fcb_curblk;
- short fcb_recsize;
- long fcb_filsize;
- short fcb_date;
- char fcb_resv[10];
- char fcb_currec;
- long fcb_random;
- };
-
- struct xfcb {
- char xfcb_flag;
- char xfcb_resv[5];
- char xfcb_attr;
- struct fcb xfcb_fcb;
- };
- #endif
-
- void vol_kill(char *fname)
- {
- union REGS regs;
- struct SREGS sregs;
- struct xfcb buf;
-
- /* Parse the filename into an FCB */
- segread(&sregs);
- regs.h.ah = 0x29;
- regs.h.al = 0;
- regs.x.si = (unsigned)fname;
- regs.x.di = (unsigned)&buf.xfcb_fcb;
- sregs.es = sregs.ds;
- intdosx(®s, ®s, &sregs);
-
- /* Volume labels require extended FCB's */
- buf.xfcb_flag = 0xff;
- buf.xfcb_attr = _A_VOLID;
-
- /* Delete the old label */
- regs.h.ah = 0x13;
- regs.x.dx = (unsigned)&buf;
- intdos(®s, ®s);
- }
-
- void setvol(char *label)
- {
- int fd;
- struct find_t finfo;
- union REGS regs;
-
- chdir("\\"); /* Move to the root directory */
- /* If drive is already labeled, remove it */
- if (0 == _dos_findfirst("*.*", _A_VOLID, &finfo)) do
- { if (_A_VOLID & finfo.attrib)
- break;
- } while (0 == _dos_findnext(&finfo));
- if (_A_VOLID & finfo.attrib)
- vol_kill(finfo.name);
- fd = dos_creat(label, _A_VOLID); /* Create new label */
- close(fd);
- }
-
- void main(int argc, char *argv[])
- {
- if (2 > argc)
- { puts("\aUsage: SETVOL new_name");
- abort();
- }
- setvol(argv[1]);
- }
-