diff --git a/ChangeLog b/ChangeLog index 00c1c7cb..36f754f2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,11 @@ $Id$ v0.39.7 14-Jan-2004 + libcommon.a: + In execute and execsh on Linux systems sync() is called before + and after running the external program to make sure diskbuffers + are committed. + v0.39.6 11-Jan-2004 - 14-Jan-2004 diff --git a/lib/execute.c b/lib/execute.c index 16da49b3..96a3b817 100644 --- a/lib/execute.c +++ b/lib/execute.c @@ -4,7 +4,7 @@ * Purpose ...............: Execute subprogram * ***************************************************************************** - * Copyright (C) 1997-2003 + * Copyright (C) 1997-2004 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -42,7 +42,7 @@ int e_pid = 0; /* Execute child pid */ int execute(char *cmd, char *file, char *pkt, char *in, char *out, char *err) { - char buf[512]; + char buf[PATH_MAX]; char *vector[16]; int i, pid, status = 0, rc = 0; @@ -52,6 +52,13 @@ int execute(char *cmd, char *file, char *pkt, char *in, char *out, char *err) sprintf(buf, "%s %s %s", cmd, file, pkt); Syslog('+', "Execute: %s",buf); +#ifdef __linux__ + /* + * Linux has async diskwrites by default. + */ + sync(); +#endif + memset(vector, 0, sizeof(vector)); i = 0; vector[i++] = strtok(buf," \t\n"); @@ -103,6 +110,11 @@ int execute(char *cmd, char *file, char *pkt, char *in, char *out, char *err) } while (((rc > 0) && (rc != pid)) || ((rc == -1) && (errno == EINTR))); setpriority(PRIO_PROCESS, 0, 0); + +#ifdef __linux__ + sync(); +#endif + switch (rc) { case -1: WriteError("$Wait returned %d, status %d,%d", rc,status>>8,status&0xff); @@ -141,6 +153,10 @@ int execsh(char *cmd, char *in, char *out, char *err) fflush(stdout); fflush(stderr); +#ifdef __linux__ + sync(); +#endif + if ((pid = fork()) == 0) { if (in) { close(0); @@ -185,6 +201,10 @@ int execsh(char *cmd, char *in, char *out, char *err) return MBERR_EXEC_FAILED; } +#ifdef __linux__ + sync(); +#endif + return status; }