aboutsummaryrefslogtreecommitdiff
path: root/lib/xwrap.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2013-07-17 17:22:46 -0500
committerRob Landley <rob@landley.net>2013-07-17 17:22:46 -0500
commit72756670274dac9562b869761c50c59ed57b7295 (patch)
tree71fee36e35134086c91adfced91da837fa4002b8 /lib/xwrap.c
parentd390493d76c4cda76c1c6d21897b0f246857e588 (diff)
downloadtoybox-72756670274dac9562b869761c50c59ed57b7295.tar.gz
Add timeout, factoring out common code from sleep.
Diffstat (limited to 'lib/xwrap.c')
-rw-r--r--lib/xwrap.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/xwrap.c b/lib/xwrap.c
index b0029eef..a0f64fd2 100644
--- a/lib/xwrap.c
+++ b/lib/xwrap.c
@@ -112,6 +112,17 @@ void xflush(void)
if (fflush(stdout)) perror_exit("write");;
}
+// Call xexec with a chunk of optargs, starting at skip. (You can't just
+// call xexec() directly because toy_init() frees optargs.)
+void xexec_optargs(int skip)
+{
+ char **s = toys.optargs;
+
+ toys.optargs = 0;
+ xexec(s+skip);
+}
+
+
// Die unless we can exec argv[] (or run builtin command). Note that anything
// with a path isn't a builtin, so /bin/sh won't match the builtin sh.
void xexec(char **argv)
@@ -468,3 +479,29 @@ void xsendfile(int in, int out)
xwrite(out, buf, len);
}
}
+
+// parse fractional seconds with optional s/m/h/d suffix
+long xparsetime(char *arg, long units, long *fraction)
+{
+ double d;
+ long l;
+
+ if (CFG_TOYBOX_FLOAT) d = strtod(arg, &arg);
+ else l = strtoul(arg, &arg, 10);
+
+ // Parse suffix
+ if (*arg) {
+ int ismhd[]={1,60,3600,86400}, i = stridx("smhd", *arg);
+
+ if (i == -1) error_exit("Unknown suffix '%c'", *arg);
+ if (CFG_TOYBOX_FLOAT) d *= ismhd[i];
+ else l *= ismhd[i];
+ }
+
+ if (CFG_TOYBOX_FLOAT) {
+ l = (long)d;
+ if (fraction) *fraction = units*(d-l);
+ } else if (fraction) *fraction = 0;
+
+ return l;
+}