diff --git a/mxq_reaper.c b/mxq_reaper.c index 19a878d..7bca9e1 100644 --- a/mxq_reaper.c +++ b/mxq_reaper.c @@ -73,38 +73,54 @@ int main(int argc, char **argv) { sleep(wait); } - char *tmpfilename; - if (asprintf(&tmpfilename, "%s.tmp", spoolfilename) == -1) - die("%m\n"); + while (1) { + // if anything fails, do not write to stderr, as this is the users + // stderr, just wait and retry. + + char *tmpfilename; + if (asprintf(&tmpfilename, "%s.tmp", spoolfilename) == -1) + goto retry_1; - FILE *out = fopen(tmpfilename,"w"); - if (out == NULL) - die("%s: %m\n", tmpfilename); - fprintf(out,"1 %d %d %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld\n", - getpid(), - user_status, - user_time.tv_sec, user_time.tv_usec, - user_rusage.ru_utime.tv_sec, user_rusage.ru_utime.tv_usec, - user_rusage.ru_stime.tv_sec, user_rusage.ru_stime.tv_usec, - user_rusage.ru_maxrss, - user_rusage.ru_ixrss, - user_rusage.ru_idrss, - user_rusage.ru_isrss, - user_rusage.ru_minflt, - user_rusage.ru_majflt, - user_rusage.ru_nswap, - user_rusage.ru_inblock, - user_rusage.ru_oublock, - user_rusage.ru_msgsnd, - user_rusage.ru_msgrcv, - user_rusage.ru_nsignals, - user_rusage.ru_nvcsw, - user_rusage.ru_nivcsw - ); - fflush(out); - fsync(fileno(out)); - fclose(out); - if (rename(tmpfilename, spoolfilename) == -1) - die("%s: %m\n", spoolfilename); + FILE *out = fopen(tmpfilename, "w"); + if (out == NULL) + goto retry_2; + if (fprintf(out,"1 %d %d %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld\n", + getpid(), + user_status, + user_time.tv_sec, user_time.tv_usec, + user_rusage.ru_utime.tv_sec, user_rusage.ru_utime.tv_usec, + user_rusage.ru_stime.tv_sec, user_rusage.ru_stime.tv_usec, + user_rusage.ru_maxrss, + user_rusage.ru_ixrss, + user_rusage.ru_idrss, + user_rusage.ru_isrss, + user_rusage.ru_minflt, + user_rusage.ru_majflt, + user_rusage.ru_nswap, + user_rusage.ru_inblock, + user_rusage.ru_oublock, + user_rusage.ru_msgsnd, + user_rusage.ru_msgrcv, + user_rusage.ru_nsignals, + user_rusage.ru_nvcsw, + user_rusage.ru_nivcsw) < 0) + goto retry_3; + if (fflush(out) == EOF) + goto retry_3; + if (fsync(fileno(out)) == -1) + goto retry_3; + if (fclose(out) == EOF) + goto retry_2; + if (rename(tmpfilename, spoolfilename) == -1) + goto retry_2; + break; + +retry_3: + fclose(out); +retry_2: + free(tmpfilename); +retry_1: + sleep(10); + } return 0; }