Bool DnD_CPNameListToDynBufArray(char *fileList, // IN: CPName format size_t listSize, // IN DynBufArray *dynBufArray) // OUT { DynBuf buf; BufRead r; int32 pathLen; size_t count; size_t i; ASSERT(fileList); r.pos = fileList; r.unreadLen = listSize; DynBufArray_Init(dynBufArray, 0); while (r.unreadLen > 0) { DynBuf_Init(&buf); if (!DnDReadBuffer(&r, &pathLen, sizeof pathLen) || (pathLen > r.unreadLen) || !DynBuf_Append(&buf, r.pos, pathLen)) { goto error; } if (!DnDSlideBuffer(&r, pathLen)) { goto error; } if (!DynBufArray_Push(dynBufArray, buf)) { goto error; } } return TRUE; error: DynBuf_Destroy(&buf); count = DynBufArray_Count(dynBufArray); for (i = 0; i < count; i++) { DynBuf *b = DynArray_AddressOf(dynBufArray, i); DynBuf_Destroy(b); } DynBufArray_SetCount(dynBufArray, 0); DynBufArray_Destroy(dynBufArray); return FALSE; }
static Bool ReadArgsFromAddressSpaceFile(FileIODescriptor asFd, //IN psinfo_t *psInfo, //IN DynBufArray *cmdLineArr) //OUT { uintptr_t *argOffs; uintptr_t argOff; uintptr_t nextArgOff; int argc; int i; char *argBuf; char *argBufPtr; DynBuf *arg; argc = psInfo->pr_argc; DynBufArray_Init(cmdLineArr, argc); for (i = 0; i < argc; i++) { DynBuf_Init(DynBufArray_AddressOf(cmdLineArr, i)); } if (argc == 0) { return TRUE; } argOffs = Util_SafeCalloc(argc, sizeof *argOffs); if (argOffs == NULL) { return FALSE; } if (!ReadOffsetsFromAddressSpaceFile(asFd, psInfo, argOffs)) { goto fail; } /* Read the command line arguments into the cmdLineArr array. */ nextArgOff = argc > 0 ? argOffs[0] : 0; i = 0; while (i < argc) { argOff = argOffs[i]; /* * The argument strings are contiguous in the address space file. So * argOff[i] + strlen(arg[i]) + 1 should be equal to argOff[i + 1]. */ if ((argOff == 0) || (argOff != nextArgOff)) { goto fail; } argBuf = ExtractArgStringFromAddressSpaceFile(asFd, argOff); if (argBuf == NULL) { goto fail; } nextArgOff = argOff + strlen(argBuf) + 1; argBufPtr = argBuf + strlen(argBuf); while ((argBufPtr > argBuf) && isspace(*(argBufPtr - 1))) { argBufPtr--; } *argBufPtr = '\0'; arg = DynBufArray_AddressOf(cmdLineArr, i); if (!DynBuf_Append(arg, argBuf, strlen(argBuf) + 1)) { free(argBuf); goto fail; } free(argBuf); i++; } return TRUE; fail: Warning("Failed to read command line arguments\n"); argc = DynBufArray_Count(cmdLineArr); for (i = 0; i < argc; i++) { arg = DynArray_AddressOf(cmdLineArr, i); DynBuf_Destroy(arg); } DynBufArray_SetCount(cmdLineArr, 0); DynBufArray_Destroy(cmdLineArr); free(argOffs); return FALSE; }