Changeset 67167 in vbox for trunk/src/VBox/Runtime/common/zip
- Timestamp:
- May 31, 2017 11:55:01 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/zip/tarcmd.cpp
r67134 r67167 62 62 #define RTZIPTARCMD_OPT_FORMAT 1009 63 63 #define RTZIPTARCMD_OPT_READ_AHEAD 1010 64 #define RTZIPTARCMD_OPT_USE_PUSH_FILE 1011 64 65 65 66 /** File format. */ … … 107 108 /** Whether to add a read ahead thread. */ 108 109 bool fReadAhead; 110 /** Use RTVfsFsStrmPushFile instead of RTVfsFsStrmAdd for files. */ 111 bool fUsePushFile; 109 112 /** The compressor/decompressor method to employ (0, z or j). */ 110 113 char chZipper; … … 190 193 * @param hVfsFss The TAR filesystem stream handle. 191 194 * @param pszSrc The file path or VFS spec. 195 * @param paObjInfo[3] Array of three FS object info structures. The first 196 * one is always filled with RTFSOBJATTRADD_UNIX info. 197 * The next two may contain owner and group names if 198 * available. Buffers can be modified. 192 199 * @param pszDst The name to archive the file under. 193 200 * @param pErrInfo Error info buffer (saves stack space). 194 201 */ 195 static RTEXITCODE rtZipTarCmdArchiveFile(PRTZIPTARCMDOPS pOpts, RTVFSFSSTREAM hVfsFss, 196 const char *pszSrc, const char *pszDst, PRTERRINFOSTATIC pErrInfo)202 static RTEXITCODE rtZipTarCmdArchiveFile(PRTZIPTARCMDOPS pOpts, RTVFSFSSTREAM hVfsFss, const char *pszSrc, 203 RTFSOBJINFO paObjInfo[3], const char *pszDst, PRTERRINFOSTATIC pErrInfo) 197 204 { 198 205 if (pOpts->fVerbose) … … 201 208 /* Open the file. */ 202 209 uint32_t offError; 203 RTVFSIOSTREAM hVfsIos ;210 RTVFSIOSTREAM hVfsIosSrc; 204 211 int rc = RTVfsChainOpenIoStream(pszSrc, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE, 205 &hVfsIos , &offError, RTErrInfoInitStatic(pErrInfo));212 &hVfsIosSrc, &offError, RTErrInfoInitStatic(pErrInfo)); 206 213 if (RT_FAILURE(rc)) 207 214 return RTVfsChainMsgErrorExitFailure("RTVfsChainOpenIoStream", pszSrc, rc, offError, &pErrInfo->Core); 208 215 209 216 /* I/O stream to base object. */ 210 RTVFSOBJ hVfsObj = RTVfsObjFromIoStream(hVfsIos); 211 RTVfsIoStrmRelease(hVfsIos); 212 if (hVfsObj == NIL_RTVFSOBJ) 213 return RTMsgErrorExitFailure("RTVfsObjFromIoStream failed unexpectedly!"); 214 215 /* Add it to the stream. */ 216 rc = RTVfsFsStrmAdd(hVfsFss, pszDst, hVfsObj, 0 /*fFlags*/); 217 RTVfsObjRelease(hVfsObj); 218 219 if (RT_SUCCESS(rc)) 220 { 221 if (rc != VINF_SUCCESS) 222 RTMsgWarning("%Rrc adding '%s'", rc, pszDst); 223 return RTEXITCODE_SUCCESS; 224 } 225 return RTMsgErrorExitFailure("%Rrc adding '%s'", rc, pszDst); 217 RTVFSOBJ hVfsObjSrc = RTVfsObjFromIoStream(hVfsIosSrc); 218 if (hVfsObjSrc != NIL_RTVFSOBJ) 219 { 220 /* 221 * Add it to the stream. Got to variants here so we can test the 222 * RTVfsFsStrmPushFile API too. 223 */ 224 if (!pOpts->fUsePushFile) 225 rc = RTVfsFsStrmAdd(hVfsFss, pszDst, hVfsObjSrc, 0 /*fFlags*/); 226 else 227 { 228 uint32_t cObjInfo = 1 + (paObjInfo[1].Attr.enmAdditional == RTFSOBJATTRADD_UNIX_OWNER) 229 + (paObjInfo[2].Attr.enmAdditional == RTFSOBJATTRADD_UNIX_GROUP); 230 RTVFSIOSTREAM hVfsIosDst; 231 rc = RTVfsFsStrmPushFile(hVfsFss, pszDst, paObjInfo[0].cbObject, paObjInfo, cObjInfo, 0 /*fFlags*/, &hVfsIosDst); 232 if (RT_SUCCESS(rc)) 233 { 234 rc = RTVfsUtilPumpIoStreams(hVfsIosSrc, hVfsIosDst, 0); 235 RTVfsIoStrmRelease(hVfsIosDst); 236 } 237 } 238 RTVfsIoStrmRelease(hVfsIosSrc); 239 RTVfsObjRelease(hVfsObjSrc); 240 241 if (RT_SUCCESS(rc)) 242 { 243 if (rc != VINF_SUCCESS) 244 RTMsgWarning("%Rrc adding '%s'", rc, pszDst); 245 return RTEXITCODE_SUCCESS; 246 } 247 return RTMsgErrorExitFailure("%Rrc adding '%s'", rc, pszDst); 248 } 249 RTVfsIoStrmRelease(hVfsIosSrc); 250 return RTMsgErrorExitFailure("RTVfsObjFromIoStream failed unexpectedly!"); 226 251 } 227 252 … … 236 261 * buffer as we decend. 237 262 * @param cchSrc The length of the input. 263 * @param paObjInfo[3] Array of three FS object info structures. The first 264 * one is always filled with RTFSOBJATTRADD_UNIX info. 265 * The next two may contain owner and group names if 266 * available. The three buffers can be reused. 238 267 * @param pszDst The name to archive it the under. We append to the 239 268 * buffer as we decend. … … 242 271 */ 243 272 static RTEXITCODE rtZipTarCmdArchiveDir(PRTZIPTARCMDOPS pOpts, RTVFSFSSTREAM hVfsFss, char pszSrc[RTPATH_MAX], size_t cchSrc, 244 char pszDst[RTPATH_MAX], size_t cchDst, PRTERRINFOSTATIC pErrInfo) 273 RTFSOBJINFO paObjInfo[3], char pszDst[RTPATH_MAX], size_t cchDst, 274 PRTERRINFOSTATIC pErrInfo) 245 275 { 246 RT_NOREF(pOpts, hVfsFss, pszSrc, cchSrc, p szDst, cchDst, pErrInfo);276 RT_NOREF(pOpts, hVfsFss, pszSrc, cchSrc, paObjInfo, pszDst, cchDst, pErrInfo); 247 277 return RTMsgErrorExitFailure("Adding directories has not yet been implemented! Sorry."); 248 278 } … … 418 448 { 419 449 /* 420 * What kind of object is this ?450 * What kind of object is this and what affiliations does it have? 421 451 */ 422 452 RTERRINFOSTATIC ErrInfo; 423 453 uint32_t offError; 424 RTFSOBJINFO ObjInfo;425 rc = RTVfsChainQueryInfo(szSrc, & ObjInfo, RTFSOBJATTRADD_UNIX, RTPATH_F_ON_LINK,454 RTFSOBJINFO aObjInfo[3]; 455 rc = RTVfsChainQueryInfo(szSrc, &aObjInfo[0], RTFSOBJATTRADD_UNIX, RTPATH_F_ON_LINK, 426 456 &offError, RTErrInfoInitStatic(&ErrInfo)); 427 457 if (RT_SUCCESS(rc)) 428 458 { 459 460 rc = RTVfsChainQueryInfo(szSrc, &aObjInfo[1], RTFSOBJATTRADD_UNIX_OWNER, RTPATH_F_ON_LINK, 461 &offError, RTErrInfoInitStatic(&ErrInfo)); 462 if (RT_SUCCESS(rc)) 463 { 464 rc = RTVfsChainQueryInfo(szSrc, &aObjInfo[2], RTFSOBJATTRADD_UNIX_GROUP, RTPATH_F_ON_LINK, 465 &offError, RTErrInfoInitStatic(&ErrInfo)); 466 if (RT_FAILURE(rc)) 467 RT_ZERO(aObjInfo[2]); 468 } 469 else 470 { 471 RT_ZERO(aObjInfo[1]); 472 RT_ZERO(aObjInfo[2]); 473 } 474 475 /* 476 * Process on an object type basis. 477 */ 429 478 RTEXITCODE rcExit2; 430 if (RTFS_IS_DIRECTORY(ObjInfo.Attr.fMode)) 431 rcExit2 = rtZipTarCmdArchiveDir(pOpts, hVfsFss, szSrc, strlen(szSrc), szDst, strlen(szDst), &ErrInfo); 479 if (RTFS_IS_DIRECTORY(aObjInfo[0].Attr.fMode)) 480 rcExit2 = rtZipTarCmdArchiveDir(pOpts, hVfsFss, szSrc, strlen(szSrc), aObjInfo, 481 szDst, strlen(szDst), &ErrInfo); 482 else if (RTFS_IS_FILE(aObjInfo[0].Attr.fMode)) 483 rcExit2 = rtZipTarCmdArchiveFile(pOpts, hVfsFss, szSrc, aObjInfo, szDst, &ErrInfo); 484 else if (RTFS_IS_SYMLINK(aObjInfo[0].Attr.fMode)) 485 rcExit2 = RTMsgErrorExitFailure("Symlink archiving is not implemented"); 486 else if (RTFS_IS_FIFO(aObjInfo[0].Attr.fMode)) 487 rcExit2 = RTMsgErrorExitFailure("FIFO archiving is not implemented"); 488 else if (RTFS_IS_SOCKET(aObjInfo[0].Attr.fMode)) 489 rcExit2 = RTMsgErrorExitFailure("Socket archiving is not implemented"); 490 else if (RTFS_IS_DEV_CHAR(aObjInfo[0].Attr.fMode) || RTFS_IS_DEV_BLOCK(aObjInfo[0].Attr.fMode)) 491 rcExit2 = RTMsgErrorExitFailure("Device archiving is not implemented"); 492 else if (RTFS_IS_WHITEOUT(aObjInfo[0].Attr.fMode)) 493 rcExit2 = RTEXITCODE_SUCCESS; 432 494 else 433 rcExit2 = rtZipTarCmdArchiveFile(pOpts, hVfsFss, szSrc, szDst, &ErrInfo); 495 rcExit2 = RTMsgErrorExitFailure("Unknown file type: %#x\n", aObjInfo[0].Attr.fMode); 496 if (rcExit2 != RTEXITCODE_SUCCESS) 497 rcExit = rcExit2; 434 498 } 435 499 else … … 1238 1302 " --read-ahead (-x)\n" 1239 1303 " Enabled read ahead thread when extracting files.\n" 1304 " --push-file (-A, -c, -u)\n" 1305 " Use RTVfsFsStrmPushFile instead of RTVfsFsStrmAdd.\n" 1240 1306 "\n"); 1241 1307 RTPrintf("Standard Options:\n" … … 1295 1361 { "--dir-mode-or-mask", RTZIPTARCMD_OPT_DIR_MODE_OR_MASK, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_OCT }, 1296 1362 { "--read-ahead", RTZIPTARCMD_OPT_READ_AHEAD, RTGETOPT_REQ_NOTHING }, 1363 { "--use-push-file", RTZIPTARCMD_OPT_USE_PUSH_FILE, RTGETOPT_REQ_NOTHING }, 1297 1364 }; 1298 1365 … … 1320 1387 #endif 1321 1388 Opts.enmTarFormat = RTZIPTARFORMAT_DEFAULT; 1322 Opts.fTarCreate = 0;1323 1389 1324 1390 RTGETOPTUNION ValueUnion; … … 1476 1542 break; 1477 1543 1544 case RTZIPTARCMD_OPT_USE_PUSH_FILE: 1545 Opts.fUsePushFile = true; 1546 break; 1547 1478 1548 /* Standard bits. */ 1479 1549 case 'h':
Note:
See TracChangeset
for help on using the changeset viewer.