Add the ewaitfile function so init scripts can wait until sockts are created, Gentoo #175783.
This commit is contained in:
parent
f2ea7ca514
commit
587051ec67
@ -22,7 +22,7 @@
|
|||||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
.\" SUCH DAMAGE.
|
.\" SUCH DAMAGE.
|
||||||
.\"
|
.\"
|
||||||
.Dd Mar 19, 2008
|
.Dd Jun 03, 2008
|
||||||
.Dt RUNSCRIPT 8 SMM
|
.Dt RUNSCRIPT 8 SMM
|
||||||
.Os OpenRC
|
.Os OpenRC
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -173,8 +173,9 @@ If
|
|||||||
does not equal 0 then output the string using
|
does not equal 0 then output the string using
|
||||||
.Ic eerror
|
.Ic eerror
|
||||||
and !! in square brackets
|
and !! in square brackets
|
||||||
at the end of the line. Otherwise output ok in square brackets at the end of
|
at the end of the line.
|
||||||
the line. The value of
|
Otherwise output ok in square brackets at the end of the line.
|
||||||
|
The value of
|
||||||
.Ar retval
|
.Ar retval
|
||||||
is returned.
|
is returned.
|
||||||
.It Ic ewend Ar retval Op Ar string
|
.It Ic ewend Ar retval Op Ar string
|
||||||
@ -193,6 +194,14 @@ output when the environment variable
|
|||||||
.Va EINFO_VERBOSE
|
.Va EINFO_VERBOSE
|
||||||
is true.
|
is true.
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
|
.It Ic ewaitfile Ar timeout Ar file1 Ar file2 ...
|
||||||
|
Wait for
|
||||||
|
.Ar timeout
|
||||||
|
seconds until all files exist.
|
||||||
|
Returns 0 if all files exist, otherwise non zero.
|
||||||
|
If
|
||||||
|
.Ar timeout
|
||||||
|
is less then 1 then we wait indefinitely.
|
||||||
.It Ic is_newer_than Ar file1 Ar file2 ...
|
.It Ic is_newer_than Ar file1 Ar file2 ...
|
||||||
If
|
If
|
||||||
.Ar file1
|
.Ar file1
|
||||||
|
@ -13,7 +13,7 @@ LINKDIR= ${PREFIX}/${LIBNAME}/${PROG}
|
|||||||
BINLINKS= rc-status
|
BINLINKS= rc-status
|
||||||
SBINLINKS= rc-service rc-update runscript start-stop-daemon
|
SBINLINKS= rc-service rc-update runscript start-stop-daemon
|
||||||
RC_BINLINKS= einfon einfo ewarnn ewarn eerrorn eerror ebegin eend ewend \
|
RC_BINLINKS= einfon einfo ewarnn ewarn eerrorn eerror ebegin eend ewend \
|
||||||
eindent eoutdent esyslog eval_ecolors \
|
eindent eoutdent esyslog eval_ecolors ewaitfile \
|
||||||
veinfo vewarn vebegin veend vewend veindent veoutdent \
|
veinfo vewarn vebegin veend vewend veindent veoutdent \
|
||||||
service_starting service_started \
|
service_starting service_started \
|
||||||
service_stopping service_stopped \
|
service_stopping service_stopped \
|
||||||
|
@ -51,6 +51,10 @@
|
|||||||
#include "einfo.h"
|
#include "einfo.h"
|
||||||
#include "rc-misc.h"
|
#include "rc-misc.h"
|
||||||
|
|
||||||
|
/* usecs to wait while we poll the file existance */
|
||||||
|
#define WAIT_INTERVAL 20000000
|
||||||
|
#define ONE_SECOND 690000000
|
||||||
|
|
||||||
/* Applet is first parsed in rc.c - no point in doing it again */
|
/* Applet is first parsed in rc.c - no point in doing it again */
|
||||||
extern const char *applet;
|
extern const char *applet;
|
||||||
|
|
||||||
@ -77,6 +81,8 @@ static int do_e(int argc, char **argv)
|
|||||||
char *p;
|
char *p;
|
||||||
int level = 0;
|
int level = 0;
|
||||||
const char *fmt = "%s";
|
const char *fmt = "%s";
|
||||||
|
struct timespec ts;
|
||||||
|
struct timeval stop, now;
|
||||||
|
|
||||||
/* Punt applet */
|
/* Punt applet */
|
||||||
argc--;
|
argc--;
|
||||||
@ -97,11 +103,14 @@ static int do_e(int argc, char **argv)
|
|||||||
if (strcmp(applet, "eend") == 0 ||
|
if (strcmp(applet, "eend") == 0 ||
|
||||||
strcmp(applet, "ewend") == 0 ||
|
strcmp(applet, "ewend") == 0 ||
|
||||||
strcmp(applet, "veend") == 0 ||
|
strcmp(applet, "veend") == 0 ||
|
||||||
strcmp(applet, "vweend") == 0)
|
strcmp(applet, "vweend") == 0 ||
|
||||||
|
strcmp(applet, "ewaitfile") == 0)
|
||||||
{
|
{
|
||||||
errno = 0;
|
errno = 0;
|
||||||
retval = (int) strtoimax(argv[0], NULL, 0);
|
retval = (int)strtoimax(argv[0], &p, 0);
|
||||||
if (errno != 0)
|
if (!p || *p != '\0')
|
||||||
|
errno = EINVAL;
|
||||||
|
if (errno)
|
||||||
retval = EXIT_FAILURE;
|
retval = EXIT_FAILURE;
|
||||||
else {
|
else {
|
||||||
argc--;
|
argc--;
|
||||||
@ -124,6 +133,38 @@ static int do_e(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strcmp(applet, "ewaitfile") == 0) {
|
||||||
|
if (errno)
|
||||||
|
eerrorx("%s: invalid timeout", applet);
|
||||||
|
if (argc == 0)
|
||||||
|
eerrorx("%s: not enough arguments", applet);
|
||||||
|
|
||||||
|
gettimeofday(&stop, NULL);
|
||||||
|
/* retval stores the timeout */
|
||||||
|
stop.tv_sec += retval;
|
||||||
|
ts.tv_sec = 0;
|
||||||
|
ts.tv_nsec = WAIT_INTERVAL;
|
||||||
|
for (i = 0; i < argc; i++) {
|
||||||
|
ebeginv("Waiting for %s", argv[i]);
|
||||||
|
for (;;){
|
||||||
|
if (exists(argv[i]))
|
||||||
|
break;
|
||||||
|
if (nanosleep(&ts, NULL) == -1)
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
gettimeofday(&now, NULL);
|
||||||
|
if (retval <= 0)
|
||||||
|
continue;
|
||||||
|
if (timercmp(&now, &stop, <))
|
||||||
|
continue;
|
||||||
|
eendv(EXIT_FAILURE,
|
||||||
|
"timed out waiting for %s", argv[i]);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
eendv(EXIT_SUCCESS, NULL);
|
||||||
|
}
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
if (argc > 0) {
|
if (argc > 0) {
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
l += strlen(argv[i]) + 1;
|
l += strlen(argv[i]) + 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user