diff options
| author | Colin Cross <ccross@android.com> | 2010-04-19 17:10:24 -0700 |
|---|---|---|
| committer | Colin Cross <ccross@android.com> | 2010-04-21 19:43:35 -0700 |
| commit | cd0f173e2790ee068fd2a20bcfc6c20468e97e51 (patch) | |
| tree | c3f86859ecbb9018a74acde83125c891675f1fcd /init | |
| parent | ed8a7d84428ec945c48b6b53dc5a3a18fabaf683 (diff) | |
| download | system_core-cd0f173e2790ee068fd2a20bcfc6c20468e97e51.tar.gz system_core-cd0f173e2790ee068fd2a20bcfc6c20468e97e51.tar.bz2 system_core-cd0f173e2790ee068fd2a20bcfc6c20468e97e51.zip | |
init: Add wait command and mount wait flag
Change-Id: I6b4c10f8f246095a7fb7342388ec4f6ff97d5733
Diffstat (limited to 'init')
| -rw-r--r-- | init/builtins.c | 23 | ||||
| -rw-r--r-- | init/keywords.h | 2 | ||||
| -rw-r--r-- | init/parser.c | 1 | ||||
| -rw-r--r-- | init/util.c | 12 | ||||
| -rw-r--r-- | init/util.h | 1 |
5 files changed, 36 insertions, 3 deletions
diff --git a/init/builtins.c b/init/builtins.c index 1c839cd3..00eab832 100644 --- a/init/builtins.c +++ b/init/builtins.c @@ -277,6 +277,7 @@ int do_mount(int nargs, char **args) char *options = NULL; unsigned flags = 0; int n, i; + int wait = 0; for (n = 4; n < nargs; n++) { for (i = 0; mount_flags[i].name; i++) { @@ -286,9 +287,13 @@ int do_mount(int nargs, char **args) } } - /* if our last argument isn't a flag, wolf it up as an option string */ - if (n + 1 == nargs && !mount_flags[i].name) - options = args[n]; + if (!mount_flags[i].name) { + if (!strcmp(args[n], "wait")) + wait = 1; + /* if our last argument isn't a flag, wolf it up as an option string */ + else if (n + 1 == nargs) + options = args[n]; + } } system = args[1]; @@ -303,6 +308,8 @@ int do_mount(int nargs, char **args) sprintf(tmp, "/dev/block/mtdblock%d", n); + if (wait) + wait_for_file(tmp, COMMAND_RETRY_TIMEOUT); if (mount(tmp, target, system, flags, options) < 0) { return -1; } @@ -349,6 +356,8 @@ int do_mount(int nargs, char **args) ERROR("out of loopback devices"); return -1; } else { + if (wait) + wait_for_file(source, COMMAND_RETRY_TIMEOUT); if (mount(source, target, system, flags, options) < 0) { return -1; } @@ -574,3 +583,11 @@ int do_device(int nargs, char **args) { decode_uid(args[4]), prefix); return 0; } + +int do_wait(int nargs, char **args) +{ + if (nargs == 2) { + return wait_for_file(args[1], COMMAND_RETRY_TIMEOUT); + } + return -1; +} diff --git a/init/keywords.h b/init/keywords.h index 254c7855..1f4a77d0 100644 --- a/init/keywords.h +++ b/init/keywords.h @@ -28,6 +28,7 @@ int do_chown(int nargs, char **args); int do_chmod(int nargs, char **args); int do_loglevel(int nargs, char **args); int do_device(int nargs, char **args); +int do_wait(int nargs, char **args); #define __MAKE_KEYWORD_ENUM__ #define KEYWORD(symbol, flags, nargs, func) K_##symbol, enum { @@ -69,6 +70,7 @@ enum { KEYWORD(symlink, COMMAND, 1, do_symlink) KEYWORD(sysclktz, COMMAND, 1, do_sysclktz) KEYWORD(user, OPTION, 0, 0) + KEYWORD(wait, COMMAND, 1, do_wait) KEYWORD(write, COMMAND, 2, do_write) KEYWORD(copy, COMMAND, 2, do_copy) KEYWORD(chown, COMMAND, 2, do_chown) diff --git a/init/parser.c b/init/parser.c index b085da87..d5c044d9 100644 --- a/init/parser.c +++ b/init/parser.c @@ -204,6 +204,7 @@ int lookup_keyword(const char *s) break; case 'w': if (!strcmp(s, "rite")) return K_write; + if (!strcmp(s, "ait")) return K_wait; break; } return K_UNKNOWN; diff --git a/init/util.c b/init/util.c index b955e7e7..761c51b3 100644 --- a/init/util.c +++ b/init/util.c @@ -378,3 +378,15 @@ void remove_link(const char *oldpath, const char *newpath) if (!strcmp(path, oldpath)) unlink(newpath); } + +int wait_for_file(const char *filename, int timeout) +{ + struct stat info; + time_t timeout_time = gettime() + timeout; + int ret = -1; + + while (gettime() < timeout_time && ((ret = stat(filename, &info)) < 0)) + usleep(10000); + + return ret; +} diff --git a/init/util.h b/init/util.h index 3dadfb93..bf7928d3 100644 --- a/init/util.h +++ b/init/util.h @@ -28,4 +28,5 @@ int mkdir_recursive(const char *pathname, mode_t mode); void sanitize(char *p); void make_link(const char *oldpath, const char *newpath); void remove_link(const char *oldpath, const char *newpath); +int wait_for_file(const char *filename, int timeout); #endif |
