Changeset 3621 in MondoRescue for branches/3.3/mindi-busybox/applets/applet_tables.c
- Timestamp:
- Dec 20, 2016, 4:07:32 PM (7 years ago)
- Location:
- branches/3.3
- Files:
-
- 1 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]) {
Note:
See TracChangeset
for help on using the changeset viewer.