=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/make/main.c,v retrieving revision 1.129 retrieving revision 1.130 diff -c -r1.129 -r1.130 *** src/usr.bin/make/main.c 2023/01/17 13:03:22 1.129 --- src/usr.bin/make/main.c 2023/05/30 04:42:21 1.130 *************** *** 1,4 **** ! /* $OpenBSD: main.c,v 1.129 2023/01/17 13:03:22 kn Exp $ */ /* $NetBSD: main.c,v 1.34 1997/03/24 20:56:36 gwr Exp $ */ /* --- 1,4 ---- ! /* $OpenBSD: main.c,v 1.130 2023/05/30 04:42:21 espie Exp $ */ /* $NetBSD: main.c,v 1.34 1997/03/24 20:56:36 gwr Exp $ */ /* *************** *** 87,92 **** --- 87,94 ---- bool beSilent; /* -s flag */ bool dumpData; /* -p flag */ + static LIST unreadable; + struct dirs { char *current; char *object; *************** *** 826,831 **** --- 828,875 ---- return 0; } + struct unreadable { + char *fname; + int errcode; + }; + + void + dump_unreadable(void) + { + struct unreadable *u; + + if (Lst_IsEmpty(&unreadable)) + return; + + fprintf(stderr, "Makefile(s) that couldn't be read:\n"); + + while ((u = Lst_Pop(&unreadable))) { + fprintf(stderr, "\t%s: %s\n", u->fname, strerror(u->errcode)); + free(u->fname); + free(u); + } + } + + static FILE * + open_makefile(const char *fname) + { + FILE *stream; + struct unreadable *u; + + stream = fopen(fname, "r"); + if (stream != NULL) + return stream; + + if (errno != ENOENT) { + u = emalloc(sizeof *u); + u->fname = estrdup(fname); + u->errcode = errno; + Lst_AtEnd(&unreadable, u); + } + + return NULL; + } + /*- * ReadMakefile -- * Open and parse the given makefile. *************** *** 848,861 **** Var_Set("MAKEFILE", ""); Parse_File(estrdup("(stdin)"), stdin); } else { ! if ((stream = fopen(fname, "r")) != NULL) goto found; /* if we've chdir'd, rebuild the path name */ if (d->current != d->object && *fname != '/') { char *path; path = Str_concat(d->current, fname, '/'); ! if ((stream = fopen(path, "r")) == NULL) free(path); else { fname = path; --- 892,905 ---- Var_Set("MAKEFILE", ""); Parse_File(estrdup("(stdin)"), stdin); } else { ! if ((stream = open_makefile(fname)) != NULL) goto found; /* if we've chdir'd, rebuild the path name */ if (d->current != d->object && *fname != '/') { char *path; path = Str_concat(d->current, fname, '/'); ! if ((stream = open_makefile(path)) == NULL) free(path); else { fname = path; *************** *** 866,872 **** name = Dir_FindFile(fname, userIncludePath); if (!name) name = Dir_FindFile(fname, systemIncludePath); ! if (!name || !(stream = fopen(name, "r"))) return false; fname = name; /* --- 910,923 ---- name = Dir_FindFile(fname, userIncludePath); if (!name) name = Dir_FindFile(fname, systemIncludePath); ! if (!name) ! return false; ! /* do not try to open a file we already have, so that ! * dump_unreadable() yields non-confusing results. ! */ ! if (strcmp(name, fname) == 0) ! return false; ! if ((stream = open_makefile(name)) == NULL) return false; fname = name; /*