File startpar-0.52.dif of Package sysvinit

--- makeboot.c
+++ makeboot.c	2008-08-13 16:34:52.985916688 +0200
@@ -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;
@@ -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);
 }
openSUSE Build Service is sponsored by