15 #include "built_in_parsers.h"
17 #include "plugin_manager.h"
26 int read_args(int argc, char *argv[], struct user_options *opts)
28 int option_index = 0, c;
29 static struct option long_options[] = {
30 { .val = 'j', .has_arg = 1, .name = "jobs", },
31 { .val = 'c', .has_arg = 1, .name = "config", },
32 { .val = 'l', .has_arg = 1, .name = "log-file", },
33 { .val = 'p', .has_arg = 1, .name = "pid-file", },
34 { .val = 'd', .name = "daemon", },
35 { .val = 'v', .name = "verbose", },
36 { .val = 'q', .name = "quiet", },
39 char short_options[] = "j:c:l:p:dvq";
42 c = getopt_long(argc, argv, short_options, long_options,
50 opts->max_jobs = atoi(optarg);
54 opts->config_file = optarg;
58 open_log_file(optarg);
74 opts->pid_file = optarg;
82 while (optind < argc) {
83 opts->config_file = argv[optind];
90 static int is_already_running(const char *pidfile)
93 char pidstr[16], procpath[256] = { 0 };
96 fd = open(pidfile, O_RDONLY);
98 /* No pid, no running instance */
102 ret = read(fd, pidstr, sizeof(pidstr) - 1);
104 pr_err("Failed to read pid file: %m\n");
113 ret = sscanf(pidstr, "%d", &pid);
115 /* Corrupted pid data? Maybe leftover from prev boot or something */
119 snprintf(procpath, sizeof(procpath) - 1, "/proc/%d/", pid);
121 ret = stat(procpath, &s);
124 pr_info("Ignoring stale pid %d from pid file %s\n",
130 pr_err("Process %d is already running as stated in pid file %s\n",
136 static int write_pidfile(const char *pidfile)
141 fd = open(pidfile, O_WRONLY | O_CREAT, 0644);
143 pr_err("Failed to open pidfile %s for writing: %m\n", pidfile);
147 ret = snprintf(pidstr, sizeof(pidstr), "%d", getpid());
148 ret = write(fd, pidstr, ret);
150 pr_err("Failed to write to pidfile %s: %m\n", pidfile);
157 int main(int argc, char *argv[])
159 struct user_options opts;
160 struct rrd_database *db, **db_list = NULL;
164 pr_info("%s Version %s starting\n", argv[0], RRDD_VERSION);
166 bzero(&opts, sizeof(opts));
168 if (read_args(argc, argv, &opts) < 0)
171 if (opts.daemonize) {
172 pr_info("Setting itself as a daemon\n");
175 pr_err("Failed to daemonize: %m\n");
181 if (is_already_running(opts.pid_file))
184 if (write_pidfile(opts.pid_file) < 0)
188 init_plugin_manager(argv[0]);
189 register_built_in_parsers();
191 if (!opts.config_file) {
192 pr_err("No database config file given. Nothing to do\n");
196 db_list = populate_database(opts.config_file);
201 if (rrdtool_create_missing_databases(db_list))
204 if (init_jobcontrol(opts.max_jobs))
213 * Update all databases parallel in one shot
215 while ((db = get_outdated_db(db_list)))
216 rrdtool_update_data(db);
218 sleeptime = get_next_update(db_list, &db_name);
220 t = time(0) + sleeptime;
221 strftime(timestr, sizeof(timestr), "%T", localtime(&t));
222 pr_info("Next scheduled event \"%s\" at %s, in %d seconds\n",
223 db_name, timestr, sleeptime);
225 poll_job_requests(sleeptime);