Changeset 3621 in MondoRescue for branches/3.3/mindi-busybox/util-linux/mdev.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/util-linux/mdev.c
r3232 r3621 98 98 99 99 #include "libbb.h" 100 #include "common_bufsiz.h" 100 101 #include "xregex.h" 101 102 … … 284 285 #endif 285 286 struct rule cur_rule; 286 char timestr[sizeof(" 60.123456")];287 char timestr[sizeof("HH:MM:SS.123456")]; 287 288 } FIX_ALIASING; 288 #define G (*(struct globals*) &bb_common_bufsiz1)289 #define G (*(struct globals*)bb_common_bufsiz1) 289 290 #define INIT_G() do { \ 291 setup_common_bufsiz(); \ 290 292 IF_NOT_FEATURE_MDEV_CONF(G.cur_rule.maj = -1;) \ 291 293 IF_NOT_FEATURE_MDEV_CONF(G.cur_rule.mode = 0660;) \ … … 324 326 } 325 327 make_default_cur_rule(); 326 }327 328 /* In later versions, endofname is in libbb */329 #define endofname mdev_endofname330 static331 const char* FAST_FUNC332 endofname(const char *name)333 {334 #define is_name(c) ((c) == '_' || isalpha((unsigned char)(c)))335 #define is_in_name(c) ((c) == '_' || isalnum((unsigned char)(c)))336 if (!is_name(*name))337 return name;338 while (*++name) {339 if (!is_in_name(*name))340 break;341 }342 return name;343 328 } 344 329 … … 418 403 419 404 /* 2nd field: uid:gid - device ownership */ 420 if (get_uidgid(&G.cur_rule.ugid, tokens[1] , /*allow_numeric:*/ 1) == 0) {405 if (get_uidgid(&G.cur_rule.ugid, tokens[1]) == 0) { 421 406 bb_error_msg("unknown user/group '%s' on line %d", tokens[1], G.parser->lineno); 422 407 goto next_rule; … … 424 409 425 410 /* 3rd field: mode - device permissions */ 426 bb_parse_mode(tokens[2], &G.cur_rule.mode);411 G.cur_rule.mode = bb_parse_mode(tokens[2], G.cur_rule.mode); 427 412 428 413 /* 4th field (opt): ">|=alias" or "!" to not create the node */ … … 489 474 parse_next_rule(); 490 475 if (G.rule_vec) { /* mdev -s */ 491 rule = memcpy(xmalloc(sizeof(G.cur_rule)),&G.cur_rule, sizeof(G.cur_rule));476 rule = xmemdup(&G.cur_rule, sizeof(G.cur_rule)); 492 477 G.rule_vec = xrealloc_vector(G.rule_vec, 4, G.rule_idx); 493 478 G.rule_vec[G.rule_idx++] = rule; … … 628 613 */ 629 614 type = S_IFCHR; 630 if (strstr(path, "/block/") || (G.subsystem && strncmp(G.subsystem, "block", 5) == 0))615 if (strstr(path, "/block/") || (G.subsystem && is_prefixed_with(G.subsystem, "block"))) 631 616 type = S_IFBLK; 632 617 … … 941 926 struct timeval tv; 942 927 gettimeofday(&tv, NULL); 943 sprintf(G.timestr, "%u.%06u", (unsigned)tv.tv_sec % 60, (unsigned)tv.tv_usec); 928 sprintf( 929 strftime_HHMMSS(G.timestr, sizeof(G.timestr), &tv.tv_sec), 930 ".%06u", 931 (unsigned)tv.tv_usec 932 ); 944 933 return G.timestr; 945 934 } … … 961 950 */ 962 951 static int 963 wait_for_seqfile( const char *seq)952 wait_for_seqfile(unsigned expected_seq) 964 953 { 965 954 /* We time out after 2 sec */ … … 976 965 for (;;) { 977 966 int seqlen; 978 char seqbuf[sizeof(int)*3 + 2]; 967 char seqbuf[sizeof(long)*3 + 2]; 968 unsigned seqbufnum; 979 969 980 970 if (seq_fd < 0) { … … 982 972 if (seq_fd < 0) 983 973 break; 974 close_on_exec_on(seq_fd); 984 975 } 985 976 seqlen = pread(seq_fd, seqbuf, sizeof(seqbuf) - 1, 0); … … 990 981 } 991 982 seqbuf[seqlen] = '\0'; 992 if (seqbuf[0] == '\n' ) {983 if (seqbuf[0] == '\n' || seqbuf[0] == '\0') { 993 984 /* seed file: write out seq ASAP */ 994 xwrite_str(seq_fd, seq);985 xwrite_str(seq_fd, utoa(expected_seq)); 995 986 xlseek(seq_fd, 0, SEEK_SET); 996 987 dbg2("first seq written"); 997 988 break; 998 989 } 999 if (strcmp(seq, seqbuf) == 0) { 990 seqbufnum = atoll(seqbuf); 991 if (seqbufnum == expected_seq) { 1000 992 /* correct idx */ 1001 993 break; 1002 994 } 995 if (seqbufnum > expected_seq) { 996 /* a later mdev runs already (this was seen by users to happen) */ 997 /* do not overwrite seqfile on exit */ 998 close(seq_fd); 999 seq_fd = -1; 1000 break; 1001 } 1003 1002 if (do_once) { 1004 dbg2("%s waiting for '%s'", curtime(), seqbuf);1003 dbg2("%s mdev.seq='%s', need '%u'", curtime(), seqbuf, expected_seq); 1005 1004 do_once = 0; 1006 1005 } … … 1010 1009 } 1011 1010 if (--timeout == 0) { 1012 dbg1("%s waiting for'%s'", "timed out", seqbuf);1011 dbg1("%s mdev.seq='%s'", "timed out", seqbuf); 1013 1012 break; 1014 1013 } … … 1093 1092 char *env_devpath; 1094 1093 unsigned my_pid; 1094 unsigned seqnum = seqnum; /* for compiler */ 1095 1095 int seq_fd; 1096 1096 smalluint op; … … 1101 1101 * DEVPATH is like "/block/sda" or "/class/input/mice" 1102 1102 */ 1103 env_devname = getenv("DEVNAME"); /* can be NULL */ 1104 G.subsystem = getenv("SUBSYSTEM"); 1103 1105 action = getenv("ACTION"); 1104 op = index_in_strings(keywords, action);1105 env_devname = getenv("DEVNAME"); /* can be NULL */1106 1106 env_devpath = getenv("DEVPATH"); 1107 G.subsystem = getenv("SUBSYSTEM");1108 1107 if (!action || !env_devpath /*|| !G.subsystem*/) 1109 1108 bb_show_usage(); 1110 1109 fw = getenv("FIRMWARE"); 1111 1110 seq = getenv("SEQNUM"); 1111 op = index_in_strings(keywords, action); 1112 1112 1113 1113 my_pid = getpid(); 1114 1114 open_mdev_log(seq, my_pid); 1115 1115 1116 seq_fd = seq ? wait_for_seqfile(seq) : -1; 1116 seq_fd = -1; 1117 if (seq) { 1118 seqnum = atoll(seq); 1119 seq_fd = wait_for_seqfile(seqnum); 1120 } 1117 1121 1118 1122 dbg1("%s " … … 1142 1146 dbg1("%s exiting", curtime()); 1143 1147 if (seq_fd >= 0) { 1144 xwrite_str(seq_fd, utoa( xatou(seq)+ 1));1148 xwrite_str(seq_fd, utoa(seqnum + 1)); 1145 1149 signal_mdevs(my_pid); 1146 1150 }
Note:
See TracChangeset
for help on using the changeset viewer.