! FIO_compressFilename_dstFile() : * open dstFileName, or pass-through if ress.dstFile != NULL, * then start compression with FIO_compressFilename_internal(). * Manages source removal (--rm) and file permissions transfer. * note : ress.srcFile must be != NULL, * so reach this function through FIO_compressFilename_srcFile(). * @return : 0 : compression completed correctly, *
| 1584 | * 1 : pb |
| 1585 | */ |
| 1586 | static int FIO_compressFilename_dstFile(FIO_ctx_t* const fCtx, |
| 1587 | FIO_prefs_t* const prefs, |
| 1588 | cRess_t ress, |
| 1589 | const char* dstFileName, |
| 1590 | const char* srcFileName, |
| 1591 | int compressionLevel) |
| 1592 | { |
| 1593 | int closeDstFile = 0; |
| 1594 | int result; |
| 1595 | stat_t statbuf; |
| 1596 | int transfer_permissions = 0; |
| 1597 | assert(ress.srcFile != NULL); |
| 1598 | if (ress.dstFile == NULL) { |
| 1599 | closeDstFile = 1; |
| 1600 | DISPLAYLEVEL(6, "FIO_compressFilename_dstFile: opening dst: %s \n", dstFileName); |
| 1601 | ress.dstFile = FIO_openDstFile(fCtx, prefs, srcFileName, dstFileName); |
| 1602 | if (ress.dstFile==NULL) return 1; /* could not open dstFileName */ |
| 1603 | /* Must only be added after FIO_openDstFile() succeeds. |
| 1604 | * Otherwise we may delete the destination file if it already exists, |
| 1605 | * and the user presses Ctrl-C when asked if they wish to overwrite. |
| 1606 | */ |
| 1607 | addHandler(dstFileName); |
| 1608 | |
| 1609 | if ( strcmp (srcFileName, stdinmark) |
| 1610 | && UTIL_stat(srcFileName, &statbuf) |
| 1611 | && UTIL_isRegularFileStat(&statbuf) ) |
| 1612 | transfer_permissions = 1; |
| 1613 | } |
| 1614 | |
| 1615 | result = FIO_compressFilename_internal(fCtx, prefs, ress, dstFileName, srcFileName, compressionLevel); |
| 1616 | |
| 1617 | if (closeDstFile) { |
| 1618 | FILE* const dstFile = ress.dstFile; |
| 1619 | ress.dstFile = NULL; |
| 1620 | |
| 1621 | clearHandler(); |
| 1622 | |
| 1623 | DISPLAYLEVEL(6, "FIO_compressFilename_dstFile: closing dst: %s \n", dstFileName); |
| 1624 | if (fclose(dstFile)) { /* error closing dstFile */ |
| 1625 | DISPLAYLEVEL(1, "zstd: %s: %s \n", dstFileName, strerror(errno)); |
| 1626 | result=1; |
| 1627 | } |
| 1628 | if ( (result != 0) /* operation failure */ |
| 1629 | && strcmp(dstFileName, stdoutmark) /* special case : don't remove() stdout */ |
| 1630 | ) { |
| 1631 | FIO_removeFile(dstFileName); /* remove compression artefact; note don't do anything special if remove() fails */ |
| 1632 | } else if (transfer_permissions) { |
| 1633 | DISPLAYLEVEL(6, "FIO_compressFilename_dstFile: transferring permissions into dst: %s \n", dstFileName); |
| 1634 | UTIL_setFileStat(dstFileName, &statbuf); |
| 1635 | } else { |
| 1636 | DISPLAYLEVEL(6, "FIO_compressFilename_dstFile: do not transfer permissions into dst: %s \n", dstFileName); |
| 1637 | } |
| 1638 | } |
| 1639 | |
| 1640 | return result; |
| 1641 | } |
| 1642 | |
| 1643 | /* List used to compare file extensions (used with --exclude-compressed flag) |
no test coverage detected