*
*/
-#include "internal.h"
-#include <linux/unistd.h>
+/*
+ * Note: This program is only necessary if you are running a 2.0.x (or
+ * earlier) kernel. 2.2.x and higher flush filesystem buffers automatically.
+ */
+
+#include "busybox.h"
#include <sys/param.h>
#include <sys/syslog.h>
+#include <unistd.h> /* for getopt() */
+#include <stdlib.h>
#if defined(__GLIBC__)
#include <sys/kdaemon.h>
#else
+#include <sys/syscall.h>
+#include <linux/unistd.h>
static _syscall2(int, bdflush, int, func, int, data);
-#endif /* __GLIBC__ */
-
-
-static char update_usage[] =
- "update [options]\n"
-#ifndef BB_FEATURE_TRIVIAL_HELP
- "\nPeriodically flushes filesystem buffers.\n\n"
- "Options:\n"
- "\t-S\tforce use of sync(2) instead of flushing\n"
- "\t-s SECS\tcall sync this often (default 30)\n"
- "\t-f SECS\tflush some buffers this often (default 5)\n"
-#endif
- ;
+#endif /* __GLIBC__ */
static unsigned int sync_duration = 30;
static unsigned int flush_duration = 5;
extern int update_main(int argc, char **argv)
{
int pid;
+ int opt;
- argc--;
- argv++;
- while (argc>0 && **argv == '-') {
- while (*++(*argv)) {
- switch (**argv) {
+ while ((opt = getopt(argc, argv, "Ss:f:")) > 0) {
+ switch (opt) {
case 'S':
use_sync = 1;
break;
case 's':
- if (--argc < 1) usage(update_usage);
- sync_duration = atoi(*(++argv));
+ sync_duration = atoi(optarg);
break;
case 'f':
- if (--argc < 1) usage(update_usage);
- flush_duration = atoi(*(++argv));
+ flush_duration = atoi(optarg);
break;
default:
usage(update_usage);
- }
}
- argc--;
- argv++;
}
pid = fork();
if (pid < 0)
- exit(FALSE);
+ return EXIT_FAILURE;
else if (pid == 0) {
/* Become a proper daemon */
setsid();
chdir("/");
+#ifdef OPEN_MAX
for (pid = 0; pid < OPEN_MAX; pid++) close(pid);
+#else
+ /* glibc 2.1.92 requires using sysconf(_SC_OPEN_MAX) */
+ for (pid = 0; pid < sysconf(_SC_OPEN_MAX); pid++) close(pid);
+#endif
/*
* This is no longer necessary since 1.3.5x, but it will harmlessly
* exit if that is the case.
*/
+
+ /* set the program name that will show up in a 'ps' listing */
argv[0] = "bdflush (update)";
argv[1] = NULL;
argv[2] = NULL;
syslog(LOG_INFO,
"This kernel does not need update(8). Exiting.");
closelog();
- exit(TRUE);
+ return EXIT_SUCCESS;
}
}
}
}
- return( TRUE);
+ return EXIT_SUCCESS;
}
/*