Changeset 3710
- Timestamp:
- Mar 17, 2011, 5:22:45 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libc/src/libc/misc/_getdcwd.c
r2254 r3710 50 50 * @param pszBuffer Where to store the current directory of the drive. 51 51 * If NULL a buffer will be malloc'ed. The size of the malloc'ed 52 * buffer will be cchBuffer and if cchBuffer is 0 it will be 53 * as big as necessary. 54 * @param cchBuffer Size of the buffer. 52 * buffer will be at least @a cbBuffer bytes. 53 * @param cbBuffer The size of the buffer @a pszBuffer points to. If 54 @a pszbuffer is NULL, it specifies the minimum buffer 55 size of the allocated buffer. 55 56 */ 56 char *_getdcwd(int iDrive, char *pszBuffer, int c chBuffer)57 char *_getdcwd(int iDrive, char *pszBuffer, int cbBuffer) 57 58 { 58 LIBCLOG_ENTER("iDrive=%d pszBuffer=%p c chBuffer=%d\n", iDrive, (void *)pszBuffer, cchBuffer);59 LIBCLOG_ENTER("iDrive=%d pszBuffer=%p cbBuffer=%d\n", iDrive, (void *)pszBuffer, cbBuffer); 59 60 char chDrive = iDrive ? iDrive + 'A' - 1 : 0; 60 61 … … 62 63 if (!pszBuffer) 63 64 { 64 LIBCLOG_MSG("Allocating buffer, %d bytes.\n", cchBuffer ? cchBuffer : PATH_MAX);65 size_t cch = cchBuffer ? cchBuffer : PATH_MAX;66 pszBuffer = malloc(c ch);65 size_t cbAlloced = cbBuffer > PATH_MAX ? cbBuffer : PATH_MAX + 1; 66 LIBCLOG_MSG("Allocating buffer, %zd bytes.\n", cbAlloced); 67 pszBuffer = malloc(cbAlloced); 67 68 if (pszBuffer) 68 69 { 69 rc = __libc_Back_fsDirCurrentGet(pszBuffer, c chBuffer, chDrive, 0);70 rc = __libc_Back_fsDirCurrentGet(pszBuffer, cbAlloced, chDrive, 0); 70 71 if (!rc) 71 72 { 72 73 /* 73 * Reallocate a PATH_MAX buffer before we return.74 * Reallocate the buffer before we return? 74 75 */ 75 if (!cchBuffer) 76 size_t cbReturned = strlen(pszBuffer) + 1; 77 if ( cbReturned + 64 <= cbAlloced 78 && cbBuffer < (ssize_t)cbAlloced) 76 79 { 77 80 char *pvOld = pszBuffer; 78 cch = strlen(pszBuffer) + 1; 79 pszBuffer = realloc(pszBuffer, cch > cchBuffer ? cch : cchBuffer); 80 if (!pszBuffer) 81 if (cbReturned <= cbBuffer) 82 cbReturned = cbBuffer + 1; 83 pszBuffer = realloc(pszBuffer, cbReturned); 84 if (pszBuffer) 85 cbAlloced = cbReturned; 86 else 81 87 pszBuffer = pvOld; 82 88 } 83 LIBCLOG_RETURN_MSG(pszBuffer, "ret %p:{%s} \n", (void *)pszBuffer, pszBuffer);89 LIBCLOG_RETURN_MSG(pszBuffer, "ret %p:{%s} (%zu bytes)\n", (void *)pszBuffer, pszBuffer, cbAlloced); 84 90 } 91 85 92 free(pszBuffer); 86 93 } … … 90 97 else 91 98 { 92 rc = __libc_Back_fsDirCurrentGet(pszBuffer, c chBuffer, chDrive, 0);99 rc = __libc_Back_fsDirCurrentGet(pszBuffer, cbBuffer, chDrive, 0); 93 100 if (!rc) 94 101 LIBCLOG_RETURN_MSG(pszBuffer, "ret %p:{%s}\n", (void *)pszBuffer, pszBuffer);
Note:
See TracChangeset
for help on using the changeset viewer.