home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_200
/
235_02
/
volume.c
< prev
Wrap
Text File
|
1987-06-17
|
4KB
|
120 lines
/* 005 2-Jan-87 volume.c
This module contains functions to get and set information about
DOS disk volumes.
Copyright (c) 1987 by Blue Sky Software. All rights reserved.
*/
#include <dos.h>
#ifndef NULL
#define NULL (0)
#endif
/******************************************************************************
** C U R R E N T _ D R I V E **
*****************************************************************************/
int
current_drive() { /* return the current drive # in DOS A, B, ... format */
return((bdos(25,0,0) & 0xFF)+'A');
}
/******************************************************************************
** C H A N G E _ D R I V E **
*****************************************************************************/
int
change_drive(drive) /* changes the current drive */
int drive;
{
return(bdos(14,drive-'A',0));
}
/******************************************************************************
** G E T V O L S I Z **
*****************************************************************************/
getvolsiz(drive,totalp,freep,clszp) /* return total, free space on volume */
int drive;
unsigned long *totalp, *freep;
unsigned int *clszp;
{
union REGS r;
unsigned int clustersiz;
r.h.ah = 54; /* get disk free space dos int */
r.h.dl = drive - 'A' + 1; /* for drive A = 1, B = 2... */
intdos(&r,&r);
if (r.x.ax != -1) { /* -1 if error */
clustersiz = r.x.ax * r.x.cx;
*totalp = (long) clustersiz * r.x.dx;
*freep = (long) clustersiz * r.x.bx;
*clszp = clustersiz;
} else {
*totalp = 0;
*freep = 0;
*clszp = 0;
}
}
/******************************************************************************
** G E T _ S E T _ V O L **
*****************************************************************************/
int
get_set_vol(op,np) /* get and or set the volume label of the current disk */
char *op, *np;
{
union REGS r;
char buffer[128];
static struct { /* fcb to search for volume label */
unsigned char extend;
unsigned char notused[5];
unsigned char attribute;
unsigned char drive;
unsigned char name[11];
unsigned char misc[25];
} fcb = { 0xff, 0, 0, 0, 0, 0, 0x08, 0 };
*op = '\0'; /* init old name buffer to null string */
bdos(0x1a,buffer,0); /* set the DTA addr for search */
fcb.drive = 0; /* want to use current drive */
strncpy(fcb.name,"???????????",11); /* set fcb name to wildcard search */
r.h.ah = 17; /* search first, fcb */
r.x.dx = (int) &fcb; /* offset of the FCB */
intdos(&r,&r); /* let dos do the looking */
if (r.h.al == 0) /* al = 0 if found */
strncat(op,buffer+8,11); /* put it in the caller's buffer */
if (np != NULL) /* is label to be set? */
if (r.h.al == 0) { /* is there an existing label? */
strcpyfill(buffer+24,np,11,' '); /* move new name to dta */
r.h.ah = 23; /* fcb rename */
r.x.dx = (int) buffer;
intdos(&r,&r);
} else { /* no existing label, create a new one */
strcpyfill(fcb.name,np,11,' '); /* set new name in fcb */
r.h.ah = 22; /* create file */
r.x.dx = (int) &fcb;
intdos(&r,&r);
}
return(r.h.al == 0xff ? -1 : 0); /* return 0 if worked okay */
}