--- makeboot.c +++ makeboot.c 2008-08-13 16:34:52.985916688 +0200 @@ -13,6 +13,12 @@ #include #include #include "makeboot.h" +#if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 600 +# include +# include +# include +static int o_flags = O_RDONLY; +#endif int tree_entries = 0; @@ -158,11 +164,28 @@ void parse_makefile(const char *path) char *s, *strp, *p; struct makenode *node; - if ((fp = fopen(path, "r")) == NULL) { +#if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 600 + int fd; + + if (getuid() == (uid_t)0) + o_flags |= O_NOATIME; + if ((fd = open(path, o_flags)) < 0) { + fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno)); + exit(1); + } + (void)posix_fadvise(fd, 0, 0, POSIX_FADV_WILLNEED); + (void)posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); + (void)posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE); + + if ((fp = fdopen(fd, "r")) == NULL) +#else + if ((fp = fopen(path, "r")) == NULL) +#endif + { fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno)); exit(1); } - + while (fgets(buf, sizeof(buf), fp)) { for (s = buf; *s && isspace(*s); s++) ; @@ -198,6 +221,11 @@ void parse_makefile(const char *path) } } } + +#if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 600 + (void)posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED); +#endif + fclose(fp); for (node = tree_list; node; node = node->next) { @@ -234,7 +262,17 @@ static void filter_files(const char *dir filter_prefix = prefix; snprintf(path, sizeof(path), "/etc/init.d/%s.d", dir); +#if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 600 + if ((i = open(path, o_flags|O_DIRECTORY|O_LARGEFILE)) >= 0) { + (void)posix_fadvise(i, 0, 0, POSIX_FADV_SEQUENTIAL); + (void)posix_fadvise(i, 0, 0, POSIX_FADV_NOREUSE); + } +#endif ndirs = scandir(path, &dirlist, dirfilter, alphasort); +#if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 600 + if (i >= 0) + (void)posix_fadvise(i, 0, 0, POSIX_FADV_DONTNEED); +#endif /* mark all matching nodes */ for (i = 0; i < ndirs; i++) { t = lookup_target(dirlist[i]->d_name + 3); @@ -342,6 +380,17 @@ struct makenode *pickup_task(void) } } if (best) { +#if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 600 + char path[128]; + int fd; + snprintf(path, sizeof(path), "/etc/init.d/%s", best->name); + if ((fd = open(path, o_flags|O_DIRECT)) >= 0) { + (void)posix_fadvise(fd, 0, 0, POSIX_FADV_WILLNEED); + (void)posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); + (void)posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE); + close(fd); + } +#endif blogger("service %s", best->name); best->status = T_RUNNING; } @@ -359,6 +408,17 @@ void finish_task(struct makenode *node) return; for (n = node->select; n; n = n->next) n->node->num_deps--; +#if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 600 + { + char path[128]; + int fd; + snprintf(path, sizeof(path), "/etc/init.d/%s", node->name); + if ((fd = open(path, o_flags|O_DIRECT)) >= 0) { + (void)posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED); + close(fd); + } + } +#endif node->status = T_FINISHED; blogger("service %s done", node->name); }