1 #include <precomp.h> 2 #include <direct.h> 3 #include <tchar.h> 4 5 /* 6 * @implemented 7 * 8 * _getdcwd (MSVCRT.@) 9 * 10 * Get the current working directory on a given disk. 11 * 12 * PARAMS 13 * drive [I] Drive letter to get the current working directory from. 14 * buf [O] Destination for the current working directory. 15 * size [I] Length of drive in characters. 16 * 17 * RETURNS 18 * Success: If drive is NULL, returns an allocated string containing the path. 19 * Otherwise populates drive with the path and returns it. 20 * Failure: NULL. errno indicates the error. 21 */ 22 _TCHAR* _tgetdcwd(int drive, _TCHAR * buf, int size) 23 { 24 static _TCHAR* dummy; 25 26 TRACE(":drive %d(%c), size %d\n",drive, drive + 'A' - 1, size); 27 28 if (!drive || drive == _getdrive()) 29 return _tgetcwd(buf,size); /* current */ 30 else 31 { 32 _TCHAR dir[MAX_PATH]; 33 _TCHAR drivespec[] = _T("A:"); 34 int dir_len; 35 36 drivespec[0] += drive - 1; 37 if (GetDriveType(drivespec) < DRIVE_REMOVABLE) 38 { 39 _set_errno(EACCES); 40 return NULL; 41 } 42 43 /* GetFullPathName for X: means "get working directory on drive X", 44 * just like passing X: to SetCurrentDirectory means "switch to working 45 * directory on drive X". -Gunnar */ 46 dir_len = GetFullPathName(drivespec,MAX_PATH,dir,&dummy); 47 if (dir_len >= size || dir_len < 1) 48 { 49 _set_errno(ERANGE); 50 return NULL; /* buf too small */ 51 } 52 53 TRACE(":returning '%s'\n", dir); 54 if (!buf) 55 return _tcsdup(dir); /* allocate */ 56 57 _tcscpy(buf,dir); 58 } 59 return buf; 60 } 61 62 63