1/* vi: set sw=4 ts=4: */
2/*
3 * Mini update implementation for busybox; much pasted from update-2.11
4 *
5 *
6 * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>.
7 * Copyright (c) 1996, 1997, 1999 Torsten Poulin.
8 * Copyright (c) 2000 by Karl M. Hegbloom <karlheg@debian.org>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 *
24 */
25
26/*
27 * Note: This program is only necessary if you are running a 2.0.x (or
28 * earlier) kernel. 2.2.x and higher flush filesystem buffers automatically.
29 */
30
31#include <sys/param.h>
32#include <sys/syslog.h>
33#include <unistd.h> /* for getopt() */
34#include <stdlib.h>
35
36#if __GNU_LIBRARY__ > 5
37	#include <sys/kdaemon.h>
38#else
39	extern int bdflush (int func, long int data);
40#endif
41
42#include "busybox.h"
43
44static unsigned int sync_duration = 30;
45static unsigned int flush_duration = 5;
46static int use_sync = 0;
47
48extern int update_main(int argc, char **argv)
49{
50	int pid;
51	int opt;
52
53	while ((opt = getopt(argc, argv, "Ss:f:")) > 0) {
54		switch (opt) {
55			case 'S':
56				use_sync = 1;
57				break;
58			case 's':
59				sync_duration = atoi(optarg);
60				break;
61			case 'f':
62				flush_duration = atoi(optarg);
63				break;
64			default:
65				show_usage();
66		}
67	}
68
69	if (daemon(0, 1) < 0)
70		perror_msg_and_die("daemon");
71
72#ifdef OPEN_MAX
73	for (pid = 0; pid < OPEN_MAX; pid++) close(pid);
74#else
75	/* glibc 2.1.92 requires using sysconf(_SC_OPEN_MAX) */
76	for (pid = 0; pid < sysconf(_SC_OPEN_MAX); pid++) close(pid);
77#endif
78
79	/* This is no longer necessary since 1.3.5x, but it will harmlessly
80	 * exit if that is the case.
81	 */
82
83	/* set the program name that will show up in a 'ps' listing */
84	argv[0] = "bdflush (update)";
85	argv[1] = NULL;
86	argv[2] = NULL;
87	for (;;) {
88		if (use_sync) {
89			sleep(sync_duration);
90			sync();
91		} else {
92			sleep(flush_duration);
93			if (bdflush(1, 0) < 0) {
94				openlog("update", LOG_CONS, LOG_DAEMON);
95				syslog(LOG_INFO,
96						"This kernel does not need update(8). Exiting.");
97				closelog();
98				return EXIT_SUCCESS;
99			}
100		}
101	}
102
103	return EXIT_SUCCESS;
104}
105
106/*
107Local Variables:
108c-file-style: "linux"
109c-basic-offset: 4
110tab-width: 4
111End:
112*/
113