FILE *master_fopen(const char *name, const char *mode) { FILE *f = am_master() ? fopen(name, mode) : 0; /* other processes need to know if fopen returned zero, in order to abort if fopen failed. If fopen was successfully, just return a random non-zero pointer (which is never used except to compare to zero) on non-master processes */ if (broadcast(0, bool(f != 0)) && !am_master()) f = (FILE *) name; return f; }
static bool is_ok_dir(const char *dirname) { DIR *dir; bool direxists = 0; if (am_master()) { direxists = (dir = opendir(dirname)) != NULL; if (direxists) closedir(dir); else mkdir(dirname, 00777); } direxists = broadcast(0, direxists); return !direxists; }
void master_fclose(FILE *f) { if (am_master()) fclose(f); }
void master_fprintf(FILE *f, const char *fmt, ...) { va_list ap; va_start(ap, fmt); if (am_master()) { vfprintf(f, fmt, ap); fflush(f); } va_end(ap); }
void trash_output_directory(const char *dirname) { if (am_master()) mkdir(dirname, 00777); }