File startpar-0.52.dif of Package sysvinit

--- makeboot.c
+++ makeboot.c	2009-03-13 13:38:12.989706914 +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;
@@ -95,6 +101,7 @@ static struct makelist *new_list(struct
 /*
  * check whether the given target would create an infinte loop
  */
+static int loop;
 static int check_loop(struct makenode *dep, struct makenode *src)
 {
 	struct makelist *s;
@@ -103,6 +110,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;
 	}
@@ -117,6 +126,7 @@ static void add_depend(struct makenode *
 	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,19 @@ 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);
+		close(i);
+	}
+#endif
 	/* mark all matching nodes */
 	for (i = 0; i < ndirs; i++) {
 		t = lookup_target(dirlist[i]->d_name + 3);
@@ -342,6 +386,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 +414,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);
 }
openSUSE Build Service is sponsored by