wok annotate busybox/stuff/busybox-1.10.3-cpio.u @ rev 2705

fix: consonance BUILD_DEPENDS
author Rohit Joshi <jozee@slitaz.org>
date Wed Apr 22 16:32:38 2009 +0000 (2009-04-22)
parents ae743024f98b
children
rev   line source
pascal@888 1 diff -purN busybox-1.10.0/archival/Config.in busybox/archival/Config.in
pascal@888 2 --- busybox-1.10.0/archival/Config.in 2008-03-29 21:47:37.000000000 +0100
pascal@888 3 +++ busybox-1.10.0/archival/Config.in 2008-03-29 21:47:37.000000000 +0100
pascal@888 4 @@ -78,6 +78,14 @@ config CPIO
pascal@888 5 Unless you have a specific application which requires cpio, you should
pascal@888 6 probably say N here.
pascal@888 7
pascal@888 8 +config FEATURE_CPIO_O
pascal@888 9 + bool "Support for archive creation"
pascal@888 10 + default n
pascal@888 11 + depends on CPIO
pascal@888 12 + help
pascal@888 13 + This implementation of cpio can create cpio archives in the "newc"
pascal@888 14 + format only.
pascal@888 15 +
pascal@888 16 config DPKG
pascal@888 17 bool "dpkg"
pascal@888 18 default n
pascal@888 19 diff -purN busybox-1.10.0/archival/cpio.c busybox/archival/cpio.c
pascal@888 20 --- busybox-1.10.0/archival/cpio.c 2008-03-29 21:47:55.000000000 +0100
pascal@888 21 +++ busybox-1.10.0/archival/cpio.c 2008-03-29 21:47:55.000000000 +0100
pascal@888 22 @@ -21,12 +21,146 @@
pascal@888 23 #define CPIO_OPT_FILE 0x10
pascal@888 24 #define CPIO_OPT_CREATE_LEADING_DIR 0x20
pascal@888 25 #define CPIO_OPT_PRESERVE_MTIME 0x40
pascal@888 26 +#define CPIO_OPT_CREATE 0x80
pascal@888 27 +#define CPIO_OPT_FORMAT 0x100
pascal@888 28 +
pascal@888 29 +#if ENABLE_FEATURE_CPIO_O
pascal@888 30 +static void cpio_pad(off_t *size, int n)
pascal@888 31 +{
pascal@888 32 + int i;
pascal@888 33 + for (*size += i = (-*size) & n; --i >= 0; bb_putchar(0));
pascal@888 34 +}
pascal@888 35 +
pascal@888 36 +static void cpio_o(void)
pascal@888 37 +{
pascal@888 38 + struct name_s {
pascal@888 39 + struct name_s *next;
pascal@888 40 + char name[0];
pascal@888 41 + };
pascal@888 42 + struct inodes_s {
pascal@888 43 + struct name_s *names;
pascal@888 44 + struct inodes_s *next;
pascal@888 45 + struct stat st;
pascal@888 46 + } *links = NULL;
pascal@888 47 + off_t bytes = 0; // output bytes count
pascal@888 48 +#if CONFIG_FEATURE_COPYBUF_KB < 1
pascal@888 49 + char buf[1024];
pascal@888 50 +#else
pascal@888 51 + char buf[CONFIG_FEATURE_COPYBUF_KB * 1024];
pascal@888 52 +#endif
pascal@888 53 +
pascal@888 54 + while (1) {
pascal@888 55 + const char *name = "TRAILER!!!";
pascal@888 56 + char *line = xmalloc_getline(stdin);
pascal@888 57 + // allocate inode struct each loop to avoid struct stat copy
pascal@888 58 + struct inodes_s *inode = xzalloc(sizeof(*inode)); // die if fail
pascal@888 59 + off_t size;
pascal@888 60 +
pascal@888 61 + inode->st.st_nlink++; // =1
pascal@888 62 + if (line) {
pascal@888 63 + /* Strip leading `./' from the filename. */
pascal@888 64 + for (name = line; name[0] == '.' && name[1] == '/';) {
pascal@888 65 + while (*++name == '/');
pascal@888 66 + }
pascal@888 67 + if (!*name) goto free_and_continue; // line empty
pascal@888 68 + if (lstat(name, &inode->st)) {
pascal@888 69 + abort_cpio_o:
pascal@888 70 + bb_perror_msg_and_die(name);
pascal@888 71 + }
pascal@888 72 + if (!S_ISLNK(inode->st.st_mode) && !S_ISREG(inode->st.st_mode))
pascal@888 73 + inode->st.st_size = 0;
pascal@888 74 + }
pascal@888 75 + // hard links will are stored and will be processed later
pascal@888 76 + if (!S_ISDIR(inode->st.st_mode) && !S_ISLNK(inode->st.st_mode) && inode->st.st_nlink > 1) {
pascal@888 77 + struct name_s *n;
pascal@888 78 + struct inodes_s *l;
pascal@888 79 +
pascal@888 80 + for (l = links; l && l->st.st_ino != inode->st.st_ino; l = l->next);
pascal@888 81 + if (l == NULL) { // not found: new hard links set
pascal@888 82 + l = inode; // l->names = NULL; l->st = inode->st
pascal@888 83 + l->next = links;
pascal@888 84 + links = l;
pascal@888 85 + }
pascal@888 86 + n = xmalloc(sizeof(*n) + strlen(name) + 1); // die if fail
pascal@888 87 + strcpy(n->name, name);
pascal@888 88 + n->next = l->names;
pascal@888 89 + l->names = n; // will not free inode if l == inode
pascal@888 90 + goto free_and_continue;
pascal@888 91 + }
pascal@888 92 + size = inode->st.st_size;
pascal@888 93 + // no more files ? process hard links
pascal@888 94 + if (!line && links) {
pascal@888 95 + struct name_s *n;
pascal@888 96 +
pascal@888 97 + free(inode); // trailer pseudo inode
pascal@888 98 + inode = links;
pascal@888 99 + n = links->names;
pascal@888 100 + name = line = xstrdup(n->name); // line will free *name memory
pascal@888 101 + links->names = n->next;
pascal@888 102 + if (links->names == NULL) { // inode will free *links memory
pascal@888 103 + size = links->st.st_size;
pascal@888 104 + links = links->next;
pascal@888 105 + }
pascal@888 106 + free(n);
pascal@888 107 + }
pascal@888 108 + bytes += printf("070701%08lx%08lx%08lx%08lx%08lx%08lx%08lx"
pascal@888 109 + "%08lx%08lx%08lx%08lx%08lx%08lx%s%c",
pascal@888 110 + (unsigned long) inode->st.st_ino,
pascal@888 111 + (unsigned long) inode->st.st_mode,
pascal@888 112 + (unsigned long) inode->st.st_uid,
pascal@888 113 + (unsigned long) inode->st.st_gid,
pascal@888 114 + (unsigned long) inode->st.st_nlink,
pascal@888 115 + (unsigned long) inode->st.st_mtime,
pascal@888 116 + (unsigned long) size,
pascal@888 117 + (unsigned long) major(inode->st.st_dev),
pascal@888 118 + (unsigned long) minor(inode->st.st_dev),
pascal@888 119 + (unsigned long) major(inode->st.st_rdev),
pascal@888 120 + (unsigned long) minor(inode->st.st_rdev),
pascal@888 121 + strlen(name) + 1UL, 0UL, name, 0);
pascal@888 122 + cpio_pad(&bytes, (line) ? 4-1 : 512-1);
pascal@888 123 + if (size) {
pascal@888 124 + if (S_ISLNK(inode->st.st_mode)) {
pascal@888 125 + char *lpath = xmalloc_readlink_or_warn(name);
pascal@888 126 +
pascal@888 127 + if (!lpath) goto abort_cpio_o;
pascal@888 128 + bytes += printf("%s", lpath);
pascal@888 129 + free(lpath);
pascal@888 130 + }
pascal@888 131 + if (S_ISREG(inode->st.st_mode)) {
pascal@888 132 + int fd = open_or_warn(name, O_RDONLY);
pascal@888 133 +
pascal@888 134 + while (1) {
pascal@888 135 + int len = full_read(fd, buf, sizeof(buf));
pascal@888 136 + if (len < 0) goto abort_cpio_o;
pascal@888 137 + if (len == 0) break;
pascal@888 138 + bytes += len;
pascal@888 139 + fwrite(buf, 1, len, stdout);
pascal@888 140 + }
pascal@888 141 + close(fd);
pascal@888 142 + }
pascal@888 143 + cpio_pad(&bytes, 4-1);
pascal@888 144 + }
pascal@888 145 +
pascal@888 146 + if (!line) {
pascal@888 147 + fputc('\n', stderr); // GNU cpio do that...
pascal@888 148 + return; // was trailer
pascal@888 149 + }
pascal@888 150 +
pascal@888 151 + free_and_continue:
pascal@888 152 + if (!inode->names) free(inode);
pascal@888 153 + free(line);
pascal@888 154 + }
pascal@888 155 +}
pascal@888 156 +#endif
pascal@888 157
pascal@888 158 int cpio_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
pascal@888 159 int cpio_main(int argc, char **argv)
pascal@888 160 {
pascal@888 161 archive_handle_t *archive_handle;
pascal@888 162 char *cpio_filename = NULL;
pascal@888 163 +#if ENABLE_FEATURE_CPIO_O
pascal@888 164 + const char *cpio_fmt = "";
pascal@888 165 +#endif
pascal@888 166 unsigned opt;
pascal@888 167
pascal@888 168 /* Initialise */
pascal@888 169 @@ -35,10 +169,26 @@ int cpio_main(int argc, char **argv)
pascal@888 170 archive_handle->seek = seek_by_read;
pascal@888 171 archive_handle->flags = ARCHIVE_EXTRACT_NEWER | ARCHIVE_PRESERVE_DATE;
pascal@888 172
pascal@888 173 +#if ENABLE_FEATURE_CPIO_O
pascal@888 174 + opt = getopt32(argv, "ituvF:dmoH:", &cpio_filename,&cpio_fmt);
pascal@888 175 +
pascal@888 176 + if (opt & CPIO_OPT_CREATE) {
pascal@888 177 + if (*cpio_fmt != 'n')
pascal@888 178 + goto cpio_show_usage;
pascal@888 179 + if (cpio_filename) {
pascal@888 180 + fclose(stdout);
pascal@888 181 + stdout = fopen(cpio_filename,"w");
pascal@888 182 + }
pascal@888 183 + cpio_o();
pascal@888 184 + return EXIT_SUCCESS;
pascal@888 185 + }
pascal@888 186 +#else
pascal@888 187 opt = getopt32(argv, "ituvF:dm", &cpio_filename);
pascal@888 188 +#endif
pascal@888 189
pascal@888 190 /* One of either extract or test options must be given */
pascal@888 191 if ((opt & (CPIO_OPT_TEST | CPIO_OPT_EXTRACT)) == 0) {
pascal@888 192 + cpio_show_usage:
pascal@888 193 bb_show_usage();
pascal@888 194 }
pascal@888 195
pascal@888 196 diff -purN busybox-1.10.0/include/usage.h busybox/include/usage.h
pascal@888 197 --- busybox-1.10.0/include/usage.h 2008-03-29 21:48:22.000000000 +0100
pascal@888 198 +++ busybox-1.10.0/include/usage.h 2008-03-29 21:48:22.000000000 +0100
pascal@888 199 @@ -496,13 +496,19 @@
pascal@888 200 "\n -l,-s Create (sym)links" \
pascal@888 201
pascal@888 202 #define cpio_trivial_usage \
pascal@888 203 - "-[dimtuv][F cpiofile]"
pascal@888 204 + "-[dim" USE_FEATURE_CPIO_O("o") "tuv][F cpiofile]" \
pascal@888 205 + USE_FEATURE_CPIO_O( "[H newc]" )
pascal@888 206 #define cpio_full_usage \
pascal@888 207 - "Extract or list files from a cpio archive\n" \
pascal@888 208 + "Extract or list files from a cpio archive" \
pascal@888 209 + USE_FEATURE_CPIO_O( ", or create a cpio archive" ) "\n" \
pascal@888 210 "Main operation mode:" \
pascal@888 211 "\n d Make leading directories" \
pascal@888 212 "\n i Extract" \
pascal@888 213 "\n m Preserve mtime" \
pascal@888 214 + USE_FEATURE_CPIO_O( \
pascal@888 215 + "\n o Create" \
pascal@888 216 + "\n H newc Define format" \
pascal@888 217 + ) \
pascal@888 218 "\n t List" \
pascal@888 219 "\n v Verbose" \
pascal@888 220 "\n u Unconditional overwrite" \