wok rev 517

Busybox: Add top and cpio (with cpio -o -H new support)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Apr 08 14:42:37 2008 +0000 (2008-04-08)
parents f43146da6d21
children 70b2d74dff92
files busybox/receipt busybox/stuff/busybox-1.10.0-cpio.u busybox/stuff/busybox-1.10.0-vcsa2txt.u busybox/stuff/busybox-1.10.0.config
line diff
     1.1 --- a/busybox/receipt	Tue Apr 08 14:23:22 2008 +0000
     1.2 +++ b/busybox/receipt	Tue Apr 08 14:42:37 2008 +0000
     1.3 @@ -16,6 +16,7 @@
     1.4  {
     1.5      patch -p0 < stuff/$PACKAGE-$VERSION-patch.u
     1.6      patch -p0 < stuff/$PACKAGE-$VERSION-vcsa2txt.u
     1.7 +    patch -p0 < stuff/$PACKAGE-$VERSION-cpio.u
     1.8      cp stuff/$PACKAGE-$VERSION.config $PACKAGE-$VERSION/.config
     1.9      cd $PACKAGE-$VERSION
    1.10      make oldconfig
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/busybox/stuff/busybox-1.10.0-cpio.u	Tue Apr 08 14:42:37 2008 +0000
     2.3 @@ -0,0 +1,220 @@
     2.4 +diff -purN busybox-1.10.0/archival/Config.in busybox/archival/Config.in
     2.5 +--- busybox-1.10.0/archival/Config.in	2008-03-29 21:47:37.000000000 +0100
     2.6 ++++ busybox-1.10.0/archival/Config.in	2008-03-29 21:47:37.000000000 +0100
     2.7 +@@ -78,6 +78,14 @@ config CPIO
     2.8 + 	  Unless you have a specific application which requires cpio, you should
     2.9 + 	  probably say N here.
    2.10 + 
    2.11 ++config FEATURE_CPIO_O
    2.12 ++	bool "Support for archive creation"
    2.13 ++	default n
    2.14 ++	depends on CPIO
    2.15 ++	help
    2.16 ++	  This implementation of cpio can create cpio archives in the "newc"
    2.17 ++	  format only.
    2.18 ++
    2.19 + config DPKG
    2.20 + 	bool "dpkg"
    2.21 + 	default n
    2.22 +diff -purN busybox-1.10.0/archival/cpio.c busybox/archival/cpio.c
    2.23 +--- busybox-1.10.0/archival/cpio.c	2008-03-29 21:47:55.000000000 +0100
    2.24 ++++ busybox-1.10.0/archival/cpio.c	2008-03-29 21:47:55.000000000 +0100
    2.25 +@@ -21,12 +21,146 @@
    2.26 + #define CPIO_OPT_FILE                   0x10
    2.27 + #define CPIO_OPT_CREATE_LEADING_DIR     0x20
    2.28 + #define CPIO_OPT_PRESERVE_MTIME         0x40
    2.29 ++#define CPIO_OPT_CREATE                 0x80
    2.30 ++#define CPIO_OPT_FORMAT                0x100
    2.31 ++
    2.32 ++#if ENABLE_FEATURE_CPIO_O
    2.33 ++static void cpio_pad(off_t *size, int n)
    2.34 ++{
    2.35 ++    int i;
    2.36 ++    for (*size += i = (-*size) & n; --i >= 0; bb_putchar(0));
    2.37 ++}
    2.38 ++
    2.39 ++static void cpio_o(void)
    2.40 ++{
    2.41 ++    struct name_s {
    2.42 ++        struct name_s *next;
    2.43 ++        char name[0];
    2.44 ++    };
    2.45 ++    struct inodes_s {
    2.46 ++        struct name_s *names;
    2.47 ++        struct inodes_s *next;
    2.48 ++        struct stat st;
    2.49 ++    } *links = NULL;
    2.50 ++    off_t bytes = 0; // output bytes count
    2.51 ++#if CONFIG_FEATURE_COPYBUF_KB < 1
    2.52 ++    char buf[1024];
    2.53 ++#else
    2.54 ++    char buf[CONFIG_FEATURE_COPYBUF_KB * 1024];
    2.55 ++#endif
    2.56 ++	
    2.57 ++    while (1) {
    2.58 ++        const char *name = "TRAILER!!!";
    2.59 ++        char *line = xmalloc_getline(stdin);
    2.60 ++        // allocate inode struct each loop to avoid struct stat copy
    2.61 ++        struct inodes_s *inode = xzalloc(sizeof(*inode)); // die if fail
    2.62 ++
    2.63 ++        inode->st.st_nlink++; // =1
    2.64 ++        if (line) {
    2.65 ++            /* Strip leading `./' from the filename.  */
    2.66 ++            for (name = line; name[0] == '.' && name[1] == '/';) {
    2.67 ++                while (*++name == '/');
    2.68 ++            }
    2.69 ++            if (!*name) goto free_and_continue; // line empty
    2.70 ++            if (lstat(name, &inode->st)) {
    2.71 ++          abort_cpio_o:
    2.72 ++                bb_perror_msg_and_die(name);
    2.73 ++            }
    2.74 ++        }
    2.75 ++
    2.76 ++        // hard links will are stored and will be processed later
    2.77 ++        if (!S_ISDIR(inode->st.st_mode) && inode->st.st_nlink > 1) {
    2.78 ++            struct name_s *n;
    2.79 ++            struct inodes_s *l;
    2.80 ++
    2.81 ++            for (l = links; l && l->st.st_ino != inode->st.st_ino; l = l->next);
    2.82 ++            if (l == NULL) { // not found: new hard links set
    2.83 ++                l = inode; // l->names = NULL; l->st = inode->st
    2.84 ++                l->next = links;
    2.85 ++                links = l;
    2.86 ++            }
    2.87 ++            n = xmalloc(sizeof(*n) + strlen(name) + 1); // die if fail
    2.88 ++            strcpy(n->name, name);
    2.89 ++            n->next = l->names;
    2.90 ++            l->names = n; // will not free inode if l == inode
    2.91 ++            goto free_and_continue;
    2.92 ++        }
    2.93 ++
    2.94 ++        // no more files ? process hard links
    2.95 ++        if (!line && links) {
    2.96 ++            struct name_s *n;
    2.97 ++
    2.98 ++            free(inode); // trailer pseudo inode
    2.99 ++            inode = links;
   2.100 ++            n = links->names;
   2.101 ++            name = line = xstrdup(n->name);    // line will free *name memory
   2.102 ++            links->names = n->next;
   2.103 ++            if (links->names == NULL)          // inode will free *links memory
   2.104 ++                links = links->next;
   2.105 ++            else links->st.st_size = 0;        // not last link: no data
   2.106 ++            free(n);
   2.107 ++        }
   2.108 ++
   2.109 ++        bytes += printf("070701%08lx%08lx%08lx%08lx%08lx%08lx%08lx"
   2.110 ++                        "%08lx%08lx%08lx%08lx%08lx%08lx%s%c",
   2.111 ++                        (unsigned long) inode->st.st_ino,
   2.112 ++                        (unsigned long) inode->st.st_mode, 
   2.113 ++                        (unsigned long) inode->st.st_uid,
   2.114 ++                        (unsigned long) inode->st.st_gid,
   2.115 ++                        (unsigned long) inode->st.st_nlink,
   2.116 ++                        (unsigned long) inode->st.st_mtime,
   2.117 ++                        (unsigned long) inode->st.st_size,
   2.118 ++                        (unsigned long) major(inode->st.st_dev),
   2.119 ++                        (unsigned long) minor(inode->st.st_dev),
   2.120 ++                        (unsigned long) major(inode->st.st_rdev), 
   2.121 ++                        (unsigned long) minor(inode->st.st_rdev),
   2.122 ++                        strlen(name) + 1UL, 0UL, name, 0);
   2.123 ++
   2.124 ++        cpio_pad(&bytes, (line) ? 4-1 : 512-1);
   2.125 ++
   2.126 ++        if (inode->st.st_size) {
   2.127 ++
   2.128 ++            if (S_ISLNK(inode->st.st_mode)) {
   2.129 ++                char *lpath = xmalloc_readlink_or_warn(name);
   2.130 ++
   2.131 ++                if (!lpath) goto abort_cpio_o;
   2.132 ++                bytes += printf("%s", lpath);
   2.133 ++                free(lpath);
   2.134 ++            }
   2.135 ++
   2.136 ++            if (S_ISREG(inode->st.st_mode)) {
   2.137 ++                int fd = open_or_warn(name, O_RDONLY);
   2.138 ++
   2.139 ++                while (1) {
   2.140 ++                    int len = full_read(fd, buf, sizeof(buf));
   2.141 ++                    if (len < 0) goto abort_cpio_o;
   2.142 ++                    if (len == 0) break;
   2.143 ++                    bytes += len;
   2.144 ++                    fwrite(buf, 1, len, stdout);
   2.145 ++                }
   2.146 ++                close(fd);
   2.147 ++            }
   2.148 ++
   2.149 ++            cpio_pad(&bytes, 4-1);
   2.150 ++        }
   2.151 ++
   2.152 ++        if (!line) return; // was trailer
   2.153 ++
   2.154 ++    free_and_continue:
   2.155 ++        if (!inode->names) free(inode);
   2.156 ++            free(line);
   2.157 ++    }
   2.158 ++}
   2.159 ++#endif
   2.160 + 
   2.161 + int cpio_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
   2.162 + int cpio_main(int argc, char **argv)
   2.163 + {
   2.164 + 	archive_handle_t *archive_handle;
   2.165 + 	char *cpio_filename = NULL;
   2.166 ++#if ENABLE_FEATURE_CPIO_O
   2.167 ++	const char *cpio_fmt = "";
   2.168 ++#endif
   2.169 + 	unsigned opt;
   2.170 + 
   2.171 + 	/* Initialise */
   2.172 +@@ -35,10 +169,26 @@ int cpio_main(int argc, char **argv)
   2.173 + 	archive_handle->seek = seek_by_read;
   2.174 + 	archive_handle->flags = ARCHIVE_EXTRACT_NEWER | ARCHIVE_PRESERVE_DATE;
   2.175 + 
   2.176 ++#if ENABLE_FEATURE_CPIO_O
   2.177 ++	opt = getopt32(argv, "ituvF:dmoH:", &cpio_filename,&cpio_fmt);
   2.178 ++
   2.179 ++	if (opt & CPIO_OPT_CREATE) {
   2.180 ++		if (*cpio_fmt != 'n')
   2.181 ++			goto cpio_show_usage;
   2.182 ++		if (cpio_filename) {
   2.183 ++			fclose(stdout);
   2.184 ++			stdout = fopen(cpio_filename,"w");
   2.185 ++		}
   2.186 ++		cpio_o();
   2.187 ++		return EXIT_SUCCESS;
   2.188 ++	}
   2.189 ++#else
   2.190 + 	opt = getopt32(argv, "ituvF:dm", &cpio_filename);
   2.191 ++#endif
   2.192 + 
   2.193 + 	/* One of either extract or test options must be given */
   2.194 + 	if ((opt & (CPIO_OPT_TEST | CPIO_OPT_EXTRACT)) == 0) {
   2.195 ++ cpio_show_usage:
   2.196 + 		bb_show_usage();
   2.197 + 	}
   2.198 + 
   2.199 +diff -purN busybox-1.10.0/include/usage.h busybox/include/usage.h
   2.200 +--- busybox-1.10.0/include/usage.h	2008-03-29 21:48:22.000000000 +0100
   2.201 ++++ busybox-1.10.0/include/usage.h	2008-03-29 21:48:22.000000000 +0100
   2.202 +@@ -496,13 +496,19 @@
   2.203 +      "\n	-l,-s	Create (sym)links" \
   2.204 + 
   2.205 + #define cpio_trivial_usage \
   2.206 +-       "-[dimtuv][F cpiofile]"
   2.207 ++       "-[dim" USE_FEATURE_CPIO_O("o") "tuv][F cpiofile]" \
   2.208 ++       USE_FEATURE_CPIO_O( "[H newc]" ) 
   2.209 + #define cpio_full_usage \
   2.210 +-       "Extract or list files from a cpio archive\n" \
   2.211 ++       "Extract or list files from a cpio archive" \
   2.212 ++       USE_FEATURE_CPIO_O( ", or create a cpio archive" ) "\n" \
   2.213 +        "Main operation mode:" \
   2.214 +      "\n	d	Make leading directories" \
   2.215 +      "\n	i	Extract" \
   2.216 +      "\n	m	Preserve mtime" \
   2.217 ++       USE_FEATURE_CPIO_O( \
   2.218 ++     "\n	o	Create" \
   2.219 ++     "\n	H newc	Define format" \
   2.220 ++       ) \
   2.221 +      "\n	t	List" \
   2.222 +      "\n	v	Verbose" \
   2.223 +      "\n	u	Unconditional overwrite" \
     3.1 --- a/busybox/stuff/busybox-1.10.0-vcsa2txt.u	Tue Apr 08 14:23:22 2008 +0000
     3.2 +++ b/busybox/stuff/busybox-1.10.0-vcsa2txt.u	Tue Apr 08 14:42:37 2008 +0000
     3.3 @@ -11,7 +11,7 @@
     3.4  
     3.5  --- busybox-1.10.0/include/usage.h	Sat Mar 22 02:31:50 2008
     3.6  +++ busybox-1.10.0/include/usage.h	Sat Mar 22 02:31:50 2008
     3.7 -@@ -4313,6 +4313,13 @@
     3.8 +@@ -4314,6 +4314,13 @@
     3.9        "\n	set_ingress_map	[vlan-name] [skb_priority] [vlan_qos]" \
    3.10        "\n	set_name_type	[name-type]" \
    3.11   
     4.1 --- a/busybox/stuff/busybox-1.10.0.config	Tue Apr 08 14:23:22 2008 +0000
     4.2 +++ b/busybox/stuff/busybox-1.10.0.config	Tue Apr 08 14:42:37 2008 +0000
     4.3 @@ -1,4 +1,4 @@
     4.4 -# TODO: add RESET CLEAR RMMOD LSMOD, patch CPIO
     4.5 +# TODO: add RESET CLEAR RMMOD LSMOD
     4.6  #
     4.7  # Automatically generated make config: don't edit
     4.8  # Busybox version: 1.10.0
     4.9 @@ -100,7 +100,8 @@
    4.10  # CONFIG_FEATURE_AR_LONG_FILENAMES is not set
    4.11  CONFIG_BUNZIP2=y
    4.12  # CONFIG_BZIP2 is not set
    4.13 -# CONFIG_CPIO is not set
    4.14 +CONFIG_CPIO=y
    4.15 +CONFIG_FEATURE_CPIO_O=y
    4.16  CONFIG_DPKG=y
    4.17  CONFIG_DPKG_DEB=y
    4.18  CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY=y
    4.19 @@ -487,7 +488,7 @@
    4.20  CONFIG_FEATURE_USE_TERMIOS=y
    4.21  CONFIG_VOLUMEID=y
    4.22  CONFIG_FEATURE_VOLUMEID_EXT=y
    4.23 -# CONFIG_FEATURE_VOLUMEID_REISERFS is not set
    4.24 +CONFIG_FEATURE_VOLUMEID_REISERFS=y
    4.25  CONFIG_FEATURE_VOLUMEID_FAT=y
    4.26  # CONFIG_FEATURE_VOLUMEID_HFS is not set
    4.27  # CONFIG_FEATURE_VOLUMEID_JFS is not set
    4.28 @@ -730,11 +731,11 @@
    4.29  # CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set
    4.30  CONFIG_RENICE=y
    4.31  CONFIG_BB_SYSCTL=y
    4.32 -# CONFIG_TOP is not set
    4.33 -# CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE is not set
    4.34 -# CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS is not set
    4.35 +CONFIG_TOP=y
    4.36 +CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
    4.37 +CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
    4.38  # CONFIG_FEATURE_TOP_DECIMALS is not set
    4.39 -# CONFIG_FEATURE_TOPMEM is not set
    4.40 +CONFIG_FEATURE_TOPMEM=y
    4.41  CONFIG_UPTIME=y
    4.42  CONFIG_WATCH=y
    4.43