Rewritten by Manuel Novoa III.
[oweals/busybox.git] / update.c
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
44 static unsigned int sync_duration = 30;
45 static unsigned int flush_duration = 5;
46 static int use_sync = 0;
47
48 extern 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 /*
107 Local Variables:
108 c-file-style: "linux"
109 c-basic-offset: 4
110 tab-width: 4
111 End:
112 */