home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
crt
/
src
/
chdir.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-17
|
5KB
|
166 lines
/***
*chdir.c - change directory
*
* Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* This file has the _chdir() function - change current directory.
*
*******************************************************************************/
#ifndef _MAC
#include <cruntime.h>
#include <oscalls.h>
#include <mtdll.h>
#include <internal.h>
#include <direct.h>
#include <stdlib.h>
#include <tchar.h>
/***
*int _chdir(path) - change current directory
*
*Purpose:
* Changes the current working directory to that given in path.
*
*Entry:
* _TSCHAR *path - directory to change to
*
*Exit:
* returns 0 if successful,
* returns -1 and sets errno if unsuccessful
*
*Exceptions:
*
*******************************************************************************/
int __cdecl _tchdir (
const _TSCHAR *path
)
{
_TSCHAR env_var[4];
_TSCHAR abspath[MAX_PATH+1];
if ( SetCurrentDirectory((LPTSTR)path) )
{
/*
* If the new current directory path is NOT a UNC path, we must
* update the OS environment variable specifying the current
* directory for what is now current drive. To do this, get the
* full current directory, build the environment variable string
* and call SetEnvironmentVariable(). We need to do this because
* SetCurrentDirectory does not (i.e., does not update the
* current-directory-on-drive environment variables) and other
* functions (fullpath, spawn, etc) need them to be set.
*
* If associated with a 'drive', the current directory should
* have the form of the example below:
*
* D:\nt\private\mytests
*
* so that the environment variable should be of the form:
*
* =D:=D:\nt\private\mytests
*
*/
if ( GetCurrentDirectory(MAX_PATH+1, (LPTSTR)abspath) != 0 )
{
/*
* check if it is a UNC name, just return if is
*/
if ( ((abspath[0] == _T('\\')) || (abspath[0] == _T('/'))) &&
(abspath[0] == abspath[1]) )
return 0;
env_var[0] = _T('=');
env_var[1] = (_TSCHAR) _totupper((_TUCHAR)abspath[0]);
env_var[2] = _T(':');
env_var[3] = _T('\0');
if ( SetEnvironmentVariable(env_var, abspath) )
return 0;
}
}
_dosmaperr(GetLastError());
return -1;
}
#else /* _MAC */
#include <cruntime.h>
#include <internal.h>
#include <direct.h>
#include <string.h>
#include <errno.h>
#include <macos\osutils.h>
#include <macos\files.h>
#include <macos\errors.h>
/***
*int _chdir(path) - change current directory
*
*Purpose:
* Changes the current working directory to that given in path.
*
*Entry:
* char *path - directory to change to
*
*Exit:
* returns 0 if successful,
* returns -1 and sets errno if unsuccessful
*
*Exceptions:
*
*******************************************************************************/
#define CurDirStore (*(long *)0x398) //directory id
#define SFSaveDisk (*(short *)0x214) //negative volume number
int __cdecl _chdir (
const char *path
)
{
WDPBRec wdPB;
char st[256];
OSErr osErr;
ParamBlockRec parm;
if (!*path)
{
errno = ENOENT;
return -1;
}
strcpy(st, path);
wdPB.ioNamePtr = _c2pstr(st);
wdPB.ioVRefNum = 0;
wdPB.ioWDDirID = 0;
osErr = PBHSetVolSync(&wdPB);
if (osErr) {
/* error occured -- map error code and return */
_dosmaperr(osErr);
return -1;
}
osErr = PBHGetVolSync(&wdPB);
if (osErr) {
/* error occured -- map error code and return */
_dosmaperr(osErr);
return -1;
}
CurDirStore = wdPB.ioWDDirID;
SFSaveDisk = wdPB.ioWDVRefNum;
memset(&parm, 0, sizeof(ParamBlockRec));
osErr = PBSetVolSync(&parm);
return 0;
}
#endif /* _MAC */