Changeset 3621 in MondoRescue for branches/3.3/mindi-busybox/applets
- Timestamp:
- Dec 20, 2016, 4:07:32 PM (9 years ago)
- Location:
- branches/3.3
- Files:
-
- 1 added
- 1 deleted
- 3 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/3.3/mindi-busybox/applets/applet_tables.c
r3232 r3621 15 15 #include <stdio.h> 16 16 #include <unistd.h> 17 #include <ctype.h> 17 18 18 19 #undef ARRAY_SIZE … … 41 42 enum { NUM_APPLETS = ARRAY_SIZE(applets) }; 42 43 43 static int offset[NUM_APPLETS];44 45 44 static int cmp_name(const void *a, const void *b) 46 45 { … … 50 49 } 51 50 51 static int str_isalnum_(const char *s) 52 { 53 while (*s) { 54 if (!isalnum(*s) && *s != '_') 55 return 0; 56 s++; 57 } 58 return 1; 59 } 60 52 61 int main(int argc, char **argv) 53 62 { 54 int i; 55 int ofs; 56 unsigned MAX_APPLET_NAME_LEN = 1; 63 int i, j; 64 65 // In find_applet_by_name(), before linear search, narrow it down 66 // by looking at N "equidistant" names. With ~350 applets: 67 // KNOWN_APPNAME_OFFSETS cycles 68 // 0 9057 69 // 2 4604 + ~100 bytes of code 70 // 4 2407 + 4 bytes 71 // 8 1342 + 8 bytes 72 // 16 908 + 16 bytes 73 // 32 884 + 32 bytes 74 // With 8, int16_t applet_nameofs[] table has 7 elements. 75 int KNOWN_APPNAME_OFFSETS = 8; 76 // With 128 applets we do two linear searches, with 1..7 strcmp's in the first one 77 // and 1..16 strcmp's in the second. With 256 apps, second search does 1..32 strcmp's. 78 if (NUM_APPLETS < 128) 79 KNOWN_APPNAME_OFFSETS = 4; 80 if (NUM_APPLETS < 32) 81 KNOWN_APPNAME_OFFSETS = 0; 57 82 58 83 qsort(applets, NUM_APPLETS, sizeof(applets[0]), cmp_name); 59 84 60 ofs = 0;61 for (i = 0; i < NUM_APPLETS; i++) {62 offset[i] = ofs;63 ofs += strlen(applets[i].name) + 1;64 }65 /* We reuse 4 high-order bits of offset array for other purposes,66 * so if they are indeed needed, refuse to proceed */67 if (ofs > 0xfff)68 return 1;69 85 if (!argv[1]) 70 86 return 1; 71 72 87 i = open(argv[1], O_WRONLY | O_TRUNC | O_CREAT, 0666); 73 88 if (i < 0) … … 84 99 printf("#define SINGLE_APPLET_MAIN %s_main\n", applets[0].main); 85 100 } 86 printf("\n"); 101 102 printf("#define KNOWN_APPNAME_OFFSETS %u\n\n", KNOWN_APPNAME_OFFSETS); 103 if (KNOWN_APPNAME_OFFSETS > 0) { 104 int ofs, offset[KNOWN_APPNAME_OFFSETS], index[KNOWN_APPNAME_OFFSETS]; 105 for (i = 0; i < KNOWN_APPNAME_OFFSETS; i++) 106 index[i] = i * NUM_APPLETS / KNOWN_APPNAME_OFFSETS; 107 ofs = 0; 108 for (i = 0; i < NUM_APPLETS; i++) { 109 for (j = 0; j < KNOWN_APPNAME_OFFSETS; j++) 110 if (i == index[j]) 111 offset[j] = ofs; 112 ofs += strlen(applets[i].name) + 1; 113 } 114 /* If the list of names is too long refuse to proceed */ 115 if (ofs > 0xffff) 116 return 1; 117 printf("const uint16_t applet_nameofs[] ALIGN2 = {\n"); 118 for (i = 1; i < KNOWN_APPNAME_OFFSETS; i++) 119 printf("%d,\n", offset[i]); 120 printf("};\n\n"); 121 } 87 122 88 123 //printf("#ifndef SKIP_definitions\n"); … … 90 125 for (i = 0; i < NUM_APPLETS; i++) { 91 126 printf("\"%s\" \"\\0\"\n", applets[i].name); 92 if (MAX_APPLET_NAME_LEN < strlen(applets[i].name))93 MAX_APPLET_NAME_LEN = strlen(applets[i].name);127 // if (MAX_APPLET_NAME_LEN < strlen(applets[i].name)) 128 // MAX_APPLET_NAME_LEN = strlen(applets[i].name); 94 129 } 95 130 printf(";\n\n"); 131 132 for (i = 0; i < NUM_APPLETS; i++) { 133 if (str_isalnum_(applets[i].name)) 134 printf("#define APPLET_NO_%s %d\n", applets[i].name, i); 135 } 136 printf("\n"); 96 137 97 138 printf("#ifndef SKIP_applet_main\n"); … … 103 144 printf("#endif\n\n"); 104 145 105 printf("const uint16_t applet_nameofs[] ALIGN2 = {\n");106 for (i = 0; i < NUM_APPLETS; i++) {107 printf("0x%04x,\n",108 offset[i]109 146 #if ENABLE_FEATURE_PREFER_APPLETS 110 + (applets[i].nofork << 12) 111 + (applets[i].noexec << 13) 147 printf("const uint8_t applet_flags[] ALIGN1 = {\n"); 148 i = 0; 149 while (i < NUM_APPLETS) { 150 int v = applets[i].nofork + (applets[i].noexec << 1); 151 if (++i < NUM_APPLETS) 152 v |= (applets[i].nofork + (applets[i].noexec << 1)) << 2; 153 if (++i < NUM_APPLETS) 154 v |= (applets[i].nofork + (applets[i].noexec << 1)) << 4; 155 if (++i < NUM_APPLETS) 156 v |= (applets[i].nofork + (applets[i].noexec << 1)) << 6; 157 printf("0x%02x,\n", v); 158 i++; 159 } 160 printf("};\n\n"); 112 161 #endif 162 113 163 #if ENABLE_FEATURE_SUID 114 + (applets[i].need_suid << 14) /* 2 bits */ 164 printf("const uint8_t applet_suid[] ALIGN1 = {\n"); 165 i = 0; 166 while (i < NUM_APPLETS) { 167 int v = applets[i].need_suid; /* 2 bits */ 168 if (++i < NUM_APPLETS) 169 v |= applets[i].need_suid << 2; 170 if (++i < NUM_APPLETS) 171 v |= applets[i].need_suid << 4; 172 if (++i < NUM_APPLETS) 173 v |= applets[i].need_suid << 6; 174 printf("0x%02x,\n", v); 175 i++; 176 } 177 printf("};\n\n"); 115 178 #endif 116 );117 }118 printf("};\n\n");119 179 120 180 #if ENABLE_FEATURE_INSTALLER … … 131 191 #endif 132 192 //printf("#endif /* SKIP_definitions */\n"); 133 printf("\n");134 printf("#define MAX_APPLET_NAME_LEN %u\n", MAX_APPLET_NAME_LEN);193 // printf("\n"); 194 // printf("#define MAX_APPLET_NAME_LEN %u\n", MAX_APPLET_NAME_LEN); 135 195 136 196 if (argv[2]) { -
branches/3.3/mindi-busybox/applets/install.sh
r3232 r3621 6 6 prefix=$1 7 7 if [ -z "$prefix" ]; then 8 echo "usage: applets/install.sh DESTINATION [--symlinks/--hardlinks/-- scriptwrapper]"8 echo "usage: applets/install.sh DESTINATION [--symlinks/--hardlinks/--binaries/--scriptwrapper]" 9 9 exit 1 10 10 fi 11 11 12 # Source the configuration 13 . ./.config 14 12 15 h=`sort busybox.links | uniq` 16 17 sharedlib_dir="0_lib" 13 18 14 19 linkopts="" 15 20 scriptwrapper="n" 21 binaries="n" 16 22 cleanup="0" 17 23 noclobber="0" … … 19 25 --hardlinks) linkopts="-f";; 20 26 --symlinks) linkopts="-fs";; 27 --binaries) binaries="y";; 21 28 --scriptwrapper) scriptwrapper="y";swrapall="y";; 22 29 --sw-sh-hard) scriptwrapper="y";linkopts="-f";; … … 41 48 rm -f "$prefix/$libdir/$i" || exit 1 42 49 if [ -f "$i" ]; then 50 echo " Installing $i to the target at $prefix/$libdir/" 43 51 cp -pPR "$i" "$prefix/$libdir/" || exit 1 44 chmod 0644 "$prefix/$libdir/ $i" || exit 152 chmod 0644 "$prefix/$libdir/`basename $i`" || exit 1 45 53 fi 46 54 done … … 69 77 for i in $h; do 70 78 appdir=`dirname "$i"` 79 app=`basename "$i"` 71 80 mkdir -p "$prefix/$appdir" || exit 1 72 81 if [ "$scriptwrapper" = "y" ]; then … … 79 88 fi 80 89 echo " $prefix/$i" 90 elif [ "$binaries" = "y" ]; then 91 # Copy the binary over rather 92 if [ -e $sharedlib_dir/$app ]; then 93 if [ "$noclobber" = "0" ] || [ ! -e "$prefix/$i" ]; then 94 echo " Copying $sharedlib_dir/$app to $prefix/$i" 95 cp -pPR $sharedlib_dir/$app $prefix/$i || exit 1 96 else 97 echo " $prefix/$i already exists" 98 fi 99 else 100 echo "Error: Could not find $sharedlib_dir/$app" 101 exit 1 102 fi 81 103 else 82 104 if [ "$2" = "--hardlinks" ]; then -
branches/3.3/mindi-busybox/applets/usage_compressed
r2725 r3621 11 11 12 12 # Some people were bitten by their system lacking a (proper) od 13 od -v - t x1</dev/null >/dev/null13 od -v -b </dev/null >/dev/null 14 14 if test $? != 0; then 15 echo 'od tool is not installed or cannot accept "-v - t x1" options'15 echo 'od tool is not installed or cannot accept "-v -b" options' 16 16 exit 1 17 17 fi … … 20 20 21 21 echo '#define UNPACKED_USAGE "" \' 22 "$loc/usage" | od -v -t x1 \ 22 "$loc/usage" | od -v -b \ 23 | grep -v '^ ' \ 23 24 | $SED -e 's/^[^ ]*//' \ 24 25 -e 's/ //g' \ 25 26 -e '/^$/d' \ 26 -e 's/\(.. \)/\\x\1/g' \27 -e 's/\(...\)/\\\1/g' \ 27 28 -e 's/^/"/' \ 28 29 -e 's/$/" \\/' 29 30 echo '' 31 # "grep -v '^ '" is for toybox's od bug: od -b prints some extra lines: 32 #0000000 010 000 010 000 133 055 144 146 135 040 133 055 143 040 103 117 33 # 000010 000010 026533 063144 020135 026533 020143 047503 34 #0000020 116 106 104 111 122 135 040 133 055 154 040 114 117 107 106 111 35 # 043116 044504 056522 055440 066055 046040 043517 044506 36 #0000040 114 105 135 040 133 055 141 040 101 103 124 111 117 116 106 111 37 # 042514 020135 026533 020141 041501 044524 047117 044506 30 38 31 39 echo '#define PACKED_USAGE \' … … 40 48 ## -e 's/\(..\)\(..\)/0x\2,0x\1,/g' 41 49 ## -e 's/$/ \\/' 42 "$loc/usage" | bzip2 -1 | $DD bs=2 skip=1 2>/dev/null | od -v -t x1 \ 50 "$loc/usage" | bzip2 -1 | $DD bs=2 skip=1 2>/dev/null | od -v -b \ 51 | grep -v '^ ' \ 43 52 | $SED -e 's/^[^ ]*//' \ 44 53 -e 's/ //g' \ 45 54 -e '/^$/d' \ 46 -e 's/\(.. \)/0x\1,/g' \55 -e 's/\(...\)/0\1,/g' \ 47 56 -e 's/$/ \\/' 48 57 echo ''
Note:
See TracChangeset
for help on using the changeset viewer.