home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.ncftp.com
/
ftp.ncftp.com.zip
/
ftp.ncftp.com
/
ncftp
/
older_versions
/
ncftp-3.2.2-src.tar.bz2
/
ncftp-3.2.2-src.tar
/
ncftp-3.2.2
/
libncftp
/
u_getcwd.c
< prev
next >
Wrap
C/C++ Source or Header
|
2005-01-01
|
2KB
|
93 lines
/* u_getcwd.c
*
* Copyright (c) 1996-2005 Mike Gleason, NcFTP Software.
* All rights reserved.
*
*/
#include "syshdrs.h"
#ifdef PRAGMA_HDRSTOP
# pragma hdrstop
#endif
/* Use getcwd/getwd to get the full path of the current local
* working directory.
*/
char *
FTPGetLocalCWD(char *buf, size_t size)
{
#ifdef HAVE_GETCWD
memset(buf, 0, size);
if ((getcwd(buf, size - 1) == NULL) || (buf[size - 1] != '\0') || (buf[size - 2] != '\0')) {
memset(buf, 0, size);
return NULL;
}
return (buf);
#elif defined(HAVE_GETWD) && !defined(_REENTRANT)
static char *cwdBuf = NULL;
char *dp;
/* Due to the way getwd is usually implemented, it's
* important to have a buffer large enough to hold the
* whole thing. getwd usually starts at the end of the
* buffer, and works backwards, returning you a pointer
* to the beginning of it when it finishes.
*/
if (size < MAXPATHLEN) {
/* Buffer not big enough, so use a temporary one,
* and then copy the first 'size' bytes of the
* temporary buffer to your 'buf.'
*/
if (cwdBuf == NULL) {
cwdBuf = (char *) malloc((size_t) MAXPATHLEN + 16);
if (cwdBuf == NULL) {
return NULL;
}
}
dp = cwdBuf;
} else {
/* Buffer is big enough already. */
dp = buf;
}
*dp = '\0';
if (getwd(dp) == NULL) {
/* getwd() should write the reason why in the buffer then,
* according to the man pages.
*/
(void) Strncpy(buf, ".", size);
return (NULL);
}
return (Strncpy(buf, dp, size));
#elif defined(HAVE_GETWD) && defined(_REENTRANT)
char wdbuf[MAXPATHLEN + 16];
if (size <= MAXPATHLEN) {
memset(wdbuf, 0, sizeof(wdbuf));
if (getwd(wdbuf) == NULL) {
(void) Strncpy(buf, ".", size);
return (NULL);
}
(void) Strncpy(buf, wdbuf, size);
} else {
memset(buf, 0, size);
if (getwd(buf) == NULL) {
(void) Strncpy(buf, ".", size);
return (NULL);
}
}
return (buf);
#elif (defined(WIN32) || defined(_WINDOWS)) && !defined(__CYGWIN__)
memset(buf, 0, size);
if ((GetCurrentDirectory((DWORD) size - 1, buf) < 1) || (buf[size - 1] != '\0') || (buf[size - 2] != '\0')) {
memset(buf, 0, size);
return NULL;
}
return buf;
#else
/* Not a solution, but does anybody not have either of
* getcwd or getwd?
*/
--Error--;
#endif
} /* FTPGetLocalCWD */