cpio.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* vi: set sw=4 ts=4: */
  2. /*
  3. * Mini cpio implementation for busybox
  4. *
  5. * Copyright (C) 2001 by Glenn McGrath
  6. *
  7. * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  8. *
  9. * Limitations:
  10. * Doesn't check CRC's
  11. * Only supports new ASCII and CRC formats
  12. *
  13. */
  14. #include <fcntl.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <unistd.h>
  18. #include "unarchive.h"
  19. #include "libbb.h"
  20. #define CPIO_OPT_EXTRACT 0x01
  21. #define CPIO_OPT_TEST 0x02
  22. #define CPIO_OPT_UNCONDITIONAL 0x04
  23. #define CPIO_OPT_VERBOSE 0x08
  24. #define CPIO_OPT_FILE 0x10
  25. #define CPIO_OPT_CREATE_LEADING_DIR 0x20
  26. #define CPIO_OPT_PRESERVE_MTIME 0x40
  27. int cpio_main(int argc, char **argv);
  28. int cpio_main(int argc, char **argv)
  29. {
  30. archive_handle_t *archive_handle;
  31. char *cpio_filename = NULL;
  32. unsigned opt;
  33. /* Initialise */
  34. archive_handle = init_handle();
  35. archive_handle->src_fd = STDIN_FILENO;
  36. archive_handle->seek = seek_by_read;
  37. archive_handle->flags = ARCHIVE_EXTRACT_NEWER | ARCHIVE_PRESERVE_DATE;
  38. opt = getopt32(argc, argv, "ituvF:dm", &cpio_filename);
  39. /* One of either extract or test options must be given */
  40. if ((opt & (CPIO_OPT_TEST | CPIO_OPT_EXTRACT)) == 0) {
  41. bb_show_usage();
  42. }
  43. if (opt & CPIO_OPT_TEST) {
  44. /* if both extract and test options are given, ignore extract option */
  45. if (opt & CPIO_OPT_EXTRACT) {
  46. opt &= ~CPIO_OPT_EXTRACT;
  47. }
  48. archive_handle->action_header = header_list;
  49. }
  50. if (opt & CPIO_OPT_EXTRACT) {
  51. archive_handle->action_data = data_extract_all;
  52. }
  53. if (opt & CPIO_OPT_UNCONDITIONAL) {
  54. archive_handle->flags |= ARCHIVE_EXTRACT_UNCONDITIONAL;
  55. archive_handle->flags &= ~ARCHIVE_EXTRACT_NEWER;
  56. }
  57. if (opt & CPIO_OPT_VERBOSE) {
  58. if (archive_handle->action_header == header_list) {
  59. archive_handle->action_header = header_verbose_list;
  60. } else {
  61. archive_handle->action_header = header_list;
  62. }
  63. }
  64. if (cpio_filename) { /* CPIO_OPT_FILE */
  65. archive_handle->src_fd = xopen(cpio_filename, O_RDONLY);
  66. archive_handle->seek = seek_by_jump;
  67. }
  68. if (opt & CPIO_OPT_CREATE_LEADING_DIR) {
  69. archive_handle->flags |= ARCHIVE_CREATE_LEADING_DIRS;
  70. }
  71. while (optind < argc) {
  72. archive_handle->filter = filter_accept_list;
  73. llist_add_to(&(archive_handle->accept), argv[optind]);
  74. optind++;
  75. }
  76. while (get_header_cpio(archive_handle) == EXIT_SUCCESS);
  77. return EXIT_SUCCESS;
  78. }