rsync 2.5.5, HPUX, getting unexplained error at main.c(578)
Paul Haas
paulh at hamjudo.com
Thu May 30 08:57:29 EST 2002
On Wed, 29 May 2002, Allen D. Winter wrote:
> I finally found that in the wait_process() function in main.c, the status
> value returned from WEXITSTATUS() was apparently returning
> the pid of the child instead of the exit status of the child... or something
> like that.
Or something not like that, since the manpage for waitpid() says the
value of status is undefined if waitpd() returns (pid_t)-1.
Here's the current version of the function, note how it isn't checking for
-1:
void wait_process(pid_t pid, int *status)
{
while (waitpid(pid, status, WNOHANG) == 0) {
msleep(20);
io_flush();
}
/* TODO: If the child exited on a signal, then log an
* appropriate error message. Perhaps we should also accept a
* message describing the purpose of the child. Also indicate
* this to the caller so that thhey know something went
* wrong. */
*status = WEXITSTATUS(*status);
}
Elsewhere in the HP UX manpage for waitpid() it says that
WEXITSTATUS(*status) is only valid if WIFEXITED(*status) is nonzero.
So an HP-UX user could try the following code and see what lands in
standard error.
void wait_process(pid_t pid, int *status)
{
int notdone = 1;
int waitPidRet;
while ( notdone ) {
waitPidRet = waitpid(pid, status, WNOHANG);
if ( waitPidRet == 0 ||
( waitPidRet == (pid_t)-1 && errno == EINTR ) ) {
msleep(20);
io_flush();
if ( waitPidRet == (pid_t)-1 ) {
fprintf(stderr,
"A mysterious failure averted.\n");
}
} else if ( waitPidRet == (pid_t) -1 ) {
perror("waitpid() did something I don't understand.");
exit(1);
}
if ( WIFEXITED(*status) ){
*status = WEXITSTATUS(*status);
notdone = 0;
} else {
fprintf(stderr,"Now what should I do?\n");
exit(2);
}
}
}
The EINTR case doesn't make sense with WNOHANG, but HP-UX doesn't always
do things that make sense. If you get the "Now what should I do?"
message, then add code to check WIFSIGNALED(), WIFSTOPPED() and
WIFCONTINUED() and do something appropriate. If you reach the perror(),
hopefully the text there will offer some clues.
I don't have an HP-UX 11.11 system, I'm looking at the manpages on
an HP-UX 11.00 system.
--
Paul Haas
Just because I sometimes use HP-UX, doesn't mean I like it.
More information about the rsync
mailing list