sysvinit/startpar-0.52.dif

136 lines
3.7 KiB
Plaintext

--- makeboot.c
+++ makeboot.c 2009-01-27 16:56:43.184201291 +0100
@@ -13,6 +13,12 @@
#include <errno.h>
#include <limits.h>
#include "makeboot.h"
+#if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 600
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <fcntl.h>
+static int o_flags = O_RDONLY;
+#endif
int tree_entries = 0;
@@ -103,6 +109,8 @@ static int check_loop(struct makenode *d
fprintf(stderr, "loop exists %s in %s!\n", dep->name, src->name);
return 1;
}
+ if (loop++ > 999)
+ return 1;
if (check_loop(s->node, src))
return 1;
}
@@ -112,11 +120,13 @@ static int check_loop(struct makenode *d
/*
* add to the dependecy and selection lists
*/
+static int loop;
static void add_depend(struct makenode *node, const char *dst)
{
struct makenode *dep;
dep = add_target(dst);
+ loop = 0;
if (check_loop(dep, node))
return;
dep->select = new_list(node, dep->select);
@@ -158,11 +168,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 +225,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 +266,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 +384,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 +412,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);
}