diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-15 22:33:13 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-15 22:33:13 +0000 |
commit | 018bee6afb0a7b9e09616a52f2f24f65fcf07322 (patch) | |
tree | 8c86e74a094c12686adac6bb4cec56ba52347bda /util-linux | |
parent | 97faf531c81be075ecafb2ac83b17eae78cd2afb (diff) | |
download | busybox-w32-018bee6afb0a7b9e09616a52f2f24f65fcf07322.tar.gz busybox-w32-018bee6afb0a7b9e09616a52f2f24f65fcf07322.tar.bz2 busybox-w32-018bee6afb0a7b9e09616a52f2f24f65fcf07322.zip |
mdev: support for serializing hotplug
function old new delta
mdev_main 503 647 +144
Diffstat (limited to 'util-linux')
-rw-r--r-- | util-linux/mdev.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/util-linux/mdev.c b/util-linux/mdev.c index c61521cbb..8968e45f8 100644 --- a/util-linux/mdev.c +++ b/util-linux/mdev.c | |||
@@ -374,8 +374,6 @@ static void load_firmware(const char *const firmware, const char *const sysfs_pa | |||
374 | int mdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 374 | int mdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
375 | int mdev_main(int argc UNUSED_PARAM, char **argv) | 375 | int mdev_main(int argc UNUSED_PARAM, char **argv) |
376 | { | 376 | { |
377 | char *action; | ||
378 | char *env_path; | ||
379 | RESERVE_CONFIG_BUFFER(temp, PATH_MAX + SCRATCH_SIZE); | 377 | RESERVE_CONFIG_BUFFER(temp, PATH_MAX + SCRATCH_SIZE); |
380 | 378 | ||
381 | /* We can be called as hotplug helper */ | 379 | /* We can be called as hotplug helper */ |
@@ -417,8 +415,14 @@ int mdev_main(int argc UNUSED_PARAM, char **argv) | |||
417 | ACTION_RECURSE | ACTION_FOLLOWLINKS, | 415 | ACTION_RECURSE | ACTION_FOLLOWLINKS, |
418 | fileAction, dirAction, temp, 0); | 416 | fileAction, dirAction, temp, 0); |
419 | } else { | 417 | } else { |
418 | char *seq; | ||
419 | char *action; | ||
420 | char *env_path; | ||
421 | char seqbuf[sizeof(int)*3 + 2]; | ||
422 | int seqlen = seqlen; /* for compiler */ | ||
423 | |||
420 | /* Hotplug: | 424 | /* Hotplug: |
421 | * env ACTION=... DEVPATH=... mdev | 425 | * env ACTION=... DEVPATH=... [SEQNUM=...] mdev |
422 | * ACTION can be "add" or "remove" | 426 | * ACTION can be "add" or "remove" |
423 | * DEVPATH is like "/block/sda" or "/class/input/mice" | 427 | * DEVPATH is like "/block/sda" or "/class/input/mice" |
424 | */ | 428 | */ |
@@ -427,6 +431,23 @@ int mdev_main(int argc UNUSED_PARAM, char **argv) | |||
427 | if (!action || !env_path) | 431 | if (!action || !env_path) |
428 | bb_show_usage(); | 432 | bb_show_usage(); |
429 | 433 | ||
434 | seq = getenv("SEQNUM"); | ||
435 | if (seq) { | ||
436 | int timeout = 2000 / 32; | ||
437 | do { | ||
438 | seqlen = open_read_close("mdev.seq", seqbuf, sizeof(seqbuf-1)); | ||
439 | if (seqlen < 0) | ||
440 | break; | ||
441 | seqbuf[seqlen] = '\0'; | ||
442 | if (seqbuf[0] == '\n' /* seed file? */ | ||
443 | || strcmp(seq, seqbuf) == 0 /* correct idx? */ | ||
444 | ) { | ||
445 | break; | ||
446 | } | ||
447 | usleep(32*1000); | ||
448 | } while (--timeout); | ||
449 | } | ||
450 | |||
430 | snprintf(temp, PATH_MAX, "/sys%s", env_path); | 451 | snprintf(temp, PATH_MAX, "/sys%s", env_path); |
431 | if (!strcmp(action, "remove")) | 452 | if (!strcmp(action, "remove")) |
432 | make_device(temp, 1); | 453 | make_device(temp, 1); |
@@ -439,6 +460,10 @@ int mdev_main(int argc UNUSED_PARAM, char **argv) | |||
439 | load_firmware(fw, temp); | 460 | load_firmware(fw, temp); |
440 | } | 461 | } |
441 | } | 462 | } |
463 | |||
464 | if (seq && seqlen >= 0) { | ||
465 | xopen_xwrite_close("mdev.seq", utoa(xatou(seq) + 1)); | ||
466 | } | ||
442 | } | 467 | } |
443 | 468 | ||
444 | if (ENABLE_FEATURE_CLEAN_UP) | 469 | if (ENABLE_FEATURE_CLEAN_UP) |