+#include "rrd_is_thread_safe.h"
+
+unsigned long FnvHash(
+ const char *str);
+int create_hw_contingent_rras(
+ rrd_t *rrd,
+ unsigned short period,
+ unsigned long hashed_name);
+void parseGENERIC_DS(
+ const char *def,
+ rrd_t *rrd,
+ int ds_idx);
+long int rra_random_row(
+ rra_def_t *);
+
+int rrd_create(
+ int argc,
+ char **argv)
+{
+ struct option long_options[] = {
+ {"start", required_argument, 0, 'b'},
+ {"step", required_argument, 0, 's'},
+ {0, 0, 0, 0}
+ };
+ int option_index = 0;
+ int opt;
+ time_t last_up = time(NULL) - 10;
+ unsigned long pdp_step = 300;
+ struct rrd_time_value last_up_tv;
+ char *parsetime_error = NULL;
+ long long_tmp;
+ int rc;
+
+ optind = 0;
+ opterr = 0; /* initialize getopt */
+
+ while (1) {
+ opt = getopt_long(argc, argv, "b:s:", long_options, &option_index);
+
+ if (opt == EOF)
+ break;
+
+ switch (opt) {
+ case 'b':
+ if ((parsetime_error = parsetime(optarg, &last_up_tv))) {
+ rrd_set_error("start time: %s", parsetime_error);
+ return (-1);
+ }
+ if (last_up_tv.type == RELATIVE_TO_END_TIME ||
+ last_up_tv.type == RELATIVE_TO_START_TIME) {
+ rrd_set_error("specifying time relative to the 'start' "
+ "or 'end' makes no sense here");
+ return (-1);
+ }
+
+ last_up = mktime(&last_up_tv.tm) +last_up_tv.offset;
+
+ if (last_up < 3600 * 24 * 365 * 10) {
+ rrd_set_error
+ ("the first entry to the RRD should be after 1980");
+ return (-1);
+ }
+ break;
+
+ case 's':
+ long_tmp = atol(optarg);
+ if (long_tmp < 1) {
+ rrd_set_error("step size should be no less than one second");
+ return (-1);
+ }
+ pdp_step = long_tmp;
+ break;
+
+ case '?':
+ if (optopt != 0)
+ rrd_set_error("unknown option '%c'", optopt);
+ else
+ rrd_set_error("unknown option '%s'", argv[optind - 1]);
+ return (-1);
+ }
+ }
+ if (optind == argc) {
+ rrd_set_error("need name of an rrd file to create");
+ return -1;
+ }
+ rc = rrd_create_r(argv[optind],
+ pdp_step, last_up,
+ argc - optind - 1, (const char **) (argv + optind + 1));
+
+ return rc;
+}