/*** *drive.c - get and change current drive * * Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved. * *Purpose: * This file has the _getdrive() and _chdrive() functions * *******************************************************************************/ #ifndef _MAC #include #include #include #include #include #include #include #include #include /*** *int _getdrive() - get current drive (1=A:, 2=B:, etc.) * *Purpose: * Returns the current disk drive * *Entry: * No parameters. * *Exit: * returns 1 for A:, 2 for B:, 3 for C:, etc. * returns 0 if current drive cannot be determined. * *Exceptions: * *******************************************************************************/ int __cdecl _getdrive ( void ) { ULONG drivenum; UCHAR curdirstr[_MAX_PATH]; drivenum = 0; if (GetCurrentDirectory(sizeof(curdirstr), curdirstr)) if (curdirstr[1] == ':') drivenum = toupper(curdirstr[0]) - 64; return drivenum; } /*** *int _chdrive(int drive) - set the current drive (1=A:, 2=B:, etc.) * *Purpose: * Allows the user to change the current disk drive * *Entry: * drive - the number of drive which should become the current drive * *Exit: * returns 0 if successful, else -1 * *Exceptions: * *******************************************************************************/ int __cdecl _chdrive ( int drive ) { char newdrive[3]; if (drive < 1 || drive > 31) { errno = EACCES; _doserrno = ERROR_INVALID_DRIVE; return -1; } _mlock(_ENV_LOCK); newdrive[0] = (char)('A' + (char)drive - (char)1); newdrive[1] = ':'; newdrive[2] = '\0'; /* * Set new drive. If current directory on new drive exists, it * will become the cwd. Otherwise defaults to root directory. */ if ( SetCurrentDirectory((LPSTR)newdrive) ) { _munlock(_ENV_LOCK); return 0; } else { _dosmaperr(GetLastError()); _munlock(_ENV_LOCK); return -1; } } #else /* _MAC */ #include #include #include #include #include #include /*** *int _getdrive() - get current drive (-1=BootDisk, -2=Second mounted drive, etc.) * *Purpose: * Returns the current disk drive * *Entry: * No parameters. * *Exit: * returns 1 for BootDisk, 2 for Second mounted drive, etc. * returns 0 if current drive cannot be determined. * *Exceptions: * *******************************************************************************/ int __cdecl _getdrive ( void ) { OSErr osErr; WDPBRec wdPB; char st[256]; wdPB.ioNamePtr = &st[0]; osErr = PBHGetVolSync(&wdPB); if (osErr) { return 0; } return wdPB.ioWDVRefNum; } /*** *int _chdrive(int drive) - set the current drive (-1=BootDisk, -2=Second drive, etc.) * *Purpose: * Allows the user to change the current disk drive * * *Entry: * drive - the number of drive which should become the current drive * *Exit: * returns 0 if successful, else -1 * *Exceptions: * *******************************************************************************/ int __cdecl _chdrive ( int drive ) { OSErr osErr; WDPBRec wdPB; wdPB.ioNamePtr = NULL; wdPB.ioWDDirID = 0; wdPB.ioVRefNum = drive; osErr = PBHSetVolSync(&wdPB); if (osErr) { return -1; } return 0; } #endif /* _MAC */