OSDN Git Service

Don't add cpio TRAILER!!! entry by default, add new --trailer option if you
[android-x86/external-toybox.git] / toys / posix / cpio.c
index 0316cc9..90c8107 100644 (file)
@@ -16,7 +16,7 @@
  * rdevmajor rdevminor namesize check
  * This is the equiavlent of mode -H newc when using GNU CPIO.
 
-USE_CPIO(NEWTOY(cpio, "(no-preserve-owner)mduH:p:|i|t|F:v(verbose)o|[!pio][!pot][!pF]", TOYFLAG_BIN))
+USE_CPIO(NEWTOY(cpio, "(no-preserve-owner)(trailer)mduH:p:|i|t|F:v(verbose)o|[!pio][!pot][!pF]", TOYFLAG_BIN))
 
 config CPIO
   bool "cpio"
@@ -34,6 +34,7 @@ config CPIO
     -t test files (list only, stdin=archive, stdout=list of files)
     -v verbose (list files during create/extract)
     --no-preserve-owner (don't set ownership during extract)
+    --trailer Add legacy trailer (prevents concatenation).
 */
 
 #define FOR_cpio
@@ -61,7 +62,7 @@ static char *strpad(int fd, unsigned len, unsigned align)
 }
 
 //convert hex to uint; mostly to allow using bits of non-terminated strings
-unsigned x8u(char *hex)
+static unsigned x8u(char *hex)
 {
   unsigned val, inpos = 8, outpos;
   char pattern[6];
@@ -113,7 +114,8 @@ void cpio_main(void)
     int test = toys.optflags & FLAG_t, err = 0;
 
     // Read header and name.
-    xreadall(afd, toybuf, 110);
+    if (!(size =readall(afd, toybuf, 110))) break;
+    if (size != 110 || memcmp(toybuf, "070701", 6)) error_exit("bad header");
     tofree = name = strpad(afd, x8u(toybuf+94), 110);
     if (!strcmp("TRAILER!!!", name)) {
       if (CFG_TOYBOX_FREE) free(tofree);
@@ -180,7 +182,7 @@ void cpio_main(void)
         close(fd);
       }
     } else if (!test)
-      err = mknod(name, mode, makedev(x8u(toybuf+78), x8u(toybuf+86)));
+      err = mknod(name, mode, dev_makedev(x8u(toybuf+78), x8u(toybuf+86)));
 
     // Set ownership and timestamp.
     if (!test && !err) {
@@ -211,7 +213,7 @@ void cpio_main(void)
       }
     }
 
-    if (err) perror_msg("'%s'", name);
+    if (err) perror_msg_raw(name);
     free(tofree);
 
   // Output cpio archive
@@ -233,7 +235,7 @@ void cpio_main(void)
       if (lstat(name, &st) || (S_ISREG(st.st_mode)
           && st.st_size && (fd = open(name, O_RDONLY))<0))
       {
-        perror_msg("%s", name);
+        perror_msg_raw(name);
         continue;
       }
 
@@ -243,8 +245,9 @@ void cpio_main(void)
         llen = sprintf(toybuf,
           "070701%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X",
           (int)st.st_ino, st.st_mode, st.st_uid, st.st_gid, (int)st.st_nlink,
-          (int)st.st_mtime, (int)st.st_size, major(st.st_dev),
-          minor(st.st_dev), major(st.st_rdev), minor(st.st_rdev), nlen, 0);
+          (int)st.st_mtime, (int)st.st_size, dev_major(st.st_dev),
+          dev_minor(st.st_dev), dev_major(st.st_rdev), dev_minor(st.st_rdev),
+          nlen, 0);
         xwrite(afd, toybuf, llen);
         xwrite(afd, name, nlen);
 
@@ -273,9 +276,11 @@ void cpio_main(void)
     }
     free(name);
 
-    memset(toybuf, 0, sizeof(toybuf));
-    xwrite(afd, toybuf,
-      sprintf(toybuf, "070701%040X%056X%08XTRAILER!!!", 1, 0x0b, 0)+4);
+    if (FLAG_trailer) {
+      memset(toybuf, 0, sizeof(toybuf));
+      xwrite(afd, toybuf,
+        sprintf(toybuf, "070701%040X%056X%08XTRAILER!!!", 1, 0x0b, 0)+4);
+    }
   }
   if (TT.archive) xclose(afd);