strncpy_nt(p.interface, cfg.iface, 32);
ic.current = time(NULL);
+ parseargs(&p, &ic, argc, argv);
+ validateinput(&p);
+ handlecaching(&p, &ic);
+ handledatabase(&p, &ic);
+ openoutput(&p);
+
+ if (debug)
+ printf("Qmode: %d\n", cfg.qmode);
+
+ drawimage(&ic);
+ db_close();
+ writeoutput(&p, &ic);
+
+ if (debug)
+ printf("all done\n");
+
+ return 0;
+}
+
+void initiparams(IPARAMS *p)
+{
+ db = NULL;
+ noexit = 0; /* allow functions to exit in case of error */
+ debug = 0; /* debug disabled by default */
+ disableprints = 0; /* let prints be visible */
+
+ p->interface[0] = '\0';
+ p->filename[0] = '\0';
+ p->cfgfile[0] = '\0';
+ p->cache = 0;
+ p->help = 0;
+}
+
+void showihelp(IPARAMS *p)
+{
+ printf("vnStat image output %s by Teemu Toivola <tst at iki dot fi>\n\n", getversion());
+
+ printf(" -5, --fiveminutes [count] output 5 minutes\n");
+ printf(" -h, --hours [count] output hours\n");
+ printf(" -hg, --hoursgraph output hours graph\n");
+ printf(" -d, --days [count] output days\n");
+ printf(" -m, --months [count] output months\n");
+ printf(" -y, --years [count] output years\n");
+ printf(" -t, --top [count] output top days\n");
+ printf(" -s, --summary output summary\n");
+ printf(" -hs, --hsummary output horizontal summary with hours\n");
+ printf(" -vs, --vsummary output vertical summary with hours\n");
+ printf(" -nh, --noheader remove header from output\n");
+ printf(" -ne, --noedge remove edge from output\n");
+ printf(" -nl, --nolegend remove legend from output\n");
+ printf(" -ru, --rateunit [mode] swap configured rate unit\n");
+ printf(" -o, --output <file> select output filename\n");
+ printf(" -c, --cache <minutes> update output only when too old\n");
+ printf(" -i, --iface <interface> select interface");
+ if (strlen(p->interface)) {
+ printf(" (default: %s)", p->interface);
+ }
+ printf("\n");
+ printf(" -b, --begin <date> set list begin date\n");
+ printf(" -e, --end <date> set list end date\n");
+ printf(" -?, --help this help\n");
+ printf(" -D, --debug show some additional debug information\n");
+ printf(" -v, --version show version\n");
+ printf(" --dbdir <directory> select database directory\n");
+ printf(" --style <mode> select output style (0-3)\n");
+ printf(" --locale <locale> set locale\n");
+ printf(" --config <config file> select config file\n");
+ printf(" --altdate use alternative date location\n");
+ printf(" --headertext <text> specify header text string\n");
+ printf(" --transparent [enabled] toggle background transparency\n\n");
+
+ printf("See also \"man vnstati\".\n");
+}
+
+void parseargs(IPARAMS *p, IMAGECONTENT *ic, int argc, char **argv)
+{
+ int currentarg;
+
/* parse parameters */
for (currentarg = 1; currentarg < argc; currentarg++) {
if (debug)
printf("arg %d: \"%s\"\n", currentarg, argv[currentarg]);
if ((strcmp(argv[currentarg], "-?") == 0) || (strcmp(argv[currentarg], "--help")) == 0) {
- p.help = 1;
+ p->help = 1;
} else if ((strcmp(argv[currentarg], "-i") == 0) || (strcmp(argv[currentarg], "--iface")) == 0) {
if (currentarg + 1 < argc) {
if (strlen(argv[currentarg + 1]) > 31) {
printf("Error: Interface name is limited to 31 characters.\n");
- return 1;
+ exit(EXIT_FAILURE);
}
- strncpy_nt(p.interface, argv[currentarg + 1], 32);
+ strncpy_nt(p->interface, argv[currentarg + 1], 32);
if (debug)
- printf("Used interface: \"%s\"\n", p.interface);
+ printf("Used interface: \"%s\"\n", p->interface);
currentarg++;
continue;
} else {
printf("Error: Interface for -i missing.\n");
- return 1;
+ exit(EXIT_FAILURE);
}
} else if ((strcmp(argv[currentarg], "-o") == 0) || (strcmp(argv[currentarg], "--output")) == 0) {
if (currentarg + 1 < argc) {
- strncpy_nt(p.filename, argv[currentarg + 1], 512);
+ strncpy_nt(p->filename, argv[currentarg + 1], 512);
if (debug)
- printf("Output file: \"%s\"\n", p.filename);
+ printf("Output file: \"%s\"\n", p->filename);
currentarg++;
continue;
} else {
printf("Error: Filename for -o missing.\n");
- return 1;
+ exit(EXIT_FAILURE);
}
} else if ((strcmp(argv[currentarg], "-c") == 0) || (strcmp(argv[currentarg], "--cache")) == 0) {
if (currentarg + 1 < argc && isdigit(argv[currentarg + 1][0])) {
- p.cache = atoi(argv[currentarg + 1]);
+ p->cache = atoi(argv[currentarg + 1]);
if (debug)
- printf("Cache time: %d minutes\n", p.cache);
+ printf("Cache time: %d minutes\n", p->cache);
currentarg++;
continue;
} else {
printf("Error: Parameter for -c missing or invalid.\n");
- return 1;
+ exit(EXIT_FAILURE);
}
} else if ((strcmp(argv[currentarg], "--style")) == 0) {
if (currentarg + 1 < argc && isdigit(argv[currentarg + 1][0])) {
cfg.ostyle = atoi(argv[currentarg + 1]);
if (cfg.ostyle > 3 || cfg.ostyle < 0) {
printf("Error: Invalid style parameter \"%d\" for --style.\n", cfg.ostyle);
- return 1;
+ exit(EXIT_FAILURE);
}
if (debug)
printf("Style changed: %d\n", cfg.ostyle);
continue;
} else {
printf("Error: Style parameter for --style missing.\n");
- return 1;
+ exit(EXIT_FAILURE);
}
} else if ((strcmp(argv[currentarg], "--transparent")) == 0) {
if (currentarg + 1 < argc && isdigit(argv[currentarg + 1][0])) {
cfg.transbg = atoi(argv[currentarg + 1]);
if (cfg.transbg > 1 || cfg.transbg < 0) {
printf("Error: Invalid parameter \"%d\" for --transparent.\n", cfg.transbg);
- return 1;
+ exit(EXIT_FAILURE);
}
if (debug)
printf("Transparency changed: %d\n", cfg.transbg);
continue;
} else {
printf("Error: Directory for --dbdir missing.\n");
- return 1;
+ exit(EXIT_FAILURE);
}
} else if ((strcmp(argv[currentarg], "--locale")) == 0) {
if (currentarg + 1 < argc) {
continue;
} else {
printf("Error: Locale for --locale missing.\n");
- return 1;
+ exit(EXIT_FAILURE);
}
} else if (strcmp(argv[currentarg], "--config") == 0) {
/* config has already been parsed earlier so nothing to do here */
continue;
} else if ((strcmp(argv[currentarg], "--headertext")) == 0) {
if (currentarg + 1 < argc) {
- strncpy_nt(ic.headertext, argv[currentarg + 1], 65);
+ strncpy_nt(ic->headertext, argv[currentarg + 1], 65);
if (debug)
- printf("Header text: \"%s\"\n", ic.headertext);
+ printf("Header text: \"%s\"\n", ic->headertext);
currentarg++;
continue;
} else {
printf("Error: Text string parameter for --headertext missing.\n");
- return 1;
+ exit(EXIT_FAILURE);
}
} else if (strcmp(argv[currentarg], "--altdate") == 0) {
- ic.altdate = 1;
+ ic->altdate = 1;
} else if ((strcmp(argv[currentarg], "-D") == 0) || (strcmp(argv[currentarg], "--debug")) == 0) {
debug = 1;
} else if ((strcmp(argv[currentarg], "-d") == 0) || (strcmp(argv[currentarg], "--days")) == 0) {
cfg.listdays = atoi(argv[currentarg + 1]);
if (cfg.listdays < 0) {
printf("Error: Invalid limit parameter \"%s\" for %s. Only a zero and positive numbers are allowed.\n", argv[currentarg + 1], argv[currentarg]);
- return 1;
+ exit(EXIT_FAILURE);
}
currentarg++;
}
cfg.listmonths = atoi(argv[currentarg + 1]);
if (cfg.listmonths < 0) {
printf("Error: Invalid limit parameter \"%s\" for %s. Only a zero and positive numbers are allowed.\n", argv[currentarg + 1], argv[currentarg]);
- return 1;
+ exit(EXIT_FAILURE);
}
currentarg++;
}
cfg.listtop = atoi(argv[currentarg + 1]);
if (cfg.listtop < 0) {
printf("Error: Invalid limit parameter \"%s\" for %s. Only a zero and positive numbers are allowed.\n", argv[currentarg + 1], argv[currentarg]);
- return 1;
+ exit(EXIT_FAILURE);
}
currentarg++;
}
cfg.listyears = atoi(argv[currentarg + 1]);
if (cfg.listyears < 0) {
printf("Error: Invalid limit parameter \"%s\" for %s. Only a zero and positive numbers are allowed.\n", argv[currentarg + 1], argv[currentarg]);
- return 1;
+ exit(EXIT_FAILURE);
}
currentarg++;
}
cfg.listhours = atoi(argv[currentarg + 1]);
if (cfg.listhours < 0) {
printf("Error: Invalid limit parameter \"%s\" for %s. Only a zero and positive numbers are allowed.\n", argv[currentarg + 1], argv[currentarg]);
- return 1;
+ exit(EXIT_FAILURE);
}
currentarg++;
}
cfg.listfivemins = atoi(argv[currentarg + 1]);
if (cfg.listfivemins < 0) {
printf("Error: Invalid limit parameter \"%s\" for %s. Only a zero and positive numbers are allowed.\n", argv[currentarg + 1], argv[currentarg]);
- return 1;
+ exit(EXIT_FAILURE);
}
currentarg++;
}
} else if ((strcmp(argv[currentarg], "-vs") == 0) || (strcmp(argv[currentarg], "--vsummary")) == 0) {
cfg.qmode = 52;
} else if ((strcmp(argv[currentarg], "-nh") == 0) || (strcmp(argv[currentarg], "--noheader")) == 0) {
- ic.showheader = 0;
+ ic->showheader = 0;
} else if ((strcmp(argv[currentarg], "-ne") == 0) || (strcmp(argv[currentarg], "--noedge")) == 0) {
- ic.showedge = 0;
+ ic->showedge = 0;
} else if ((strcmp(argv[currentarg], "-nl") == 0) || (strcmp(argv[currentarg], "--nolegend")) == 0) {
- ic.showlegend = 0;
+ ic->showlegend = 0;
} else if ((strcmp(argv[currentarg], "-ru") == 0) || (strcmp(argv[currentarg], "--rateunit")) == 0) {
if (currentarg + 1 < argc && isdigit(argv[currentarg + 1][0])) {
cfg.rateunit = atoi(argv[currentarg + 1]);
printf(" Valid parameters:\n");
printf(" 0 - bytes\n");
printf(" 1 - bits\n");
- return 1;
+ exit(EXIT_FAILURE);
}
if (debug)
printf("Rateunit changed: %d\n", cfg.rateunit);
if (currentarg + 1 < argc) {
if (!validatedatetime(argv[currentarg + 1])) {
printf("Error: Invalid date format, expected YYYY-MM-DD HH:MM or YYYY-MM-DD.\n");
- return 1;
+ exit(EXIT_FAILURE);
}
- strncpy_nt(ic.databegin, argv[currentarg + 1], 18);
+ strncpy_nt(ic->databegin, argv[currentarg + 1], 18);
currentarg++;
} else {
printf("Error: Date of format YYYY-MM-DD HH:MM or YYYY-MM-DD for %s missing.\n", argv[currentarg]);
- return 1;
+ exit(EXIT_FAILURE);
}
} else if ((strcmp(argv[currentarg], "-e") == 0) || (strcmp(argv[currentarg], "--end") == 0)) {
if (currentarg + 1 < argc) {
if (!validatedatetime(argv[currentarg + 1])) {
printf("Error: Invalid date format, expected YYYY-MM-DD HH:MM or YYYY-MM-DD.\n");
- return 1;
+ exit(EXIT_FAILURE);
}
- strncpy_nt(ic.dataend, argv[currentarg + 1], 18);
+ strncpy_nt(ic->dataend, argv[currentarg + 1], 18);
currentarg++;
} else {
printf("Error: Date of format YYYY-MM-DD HH:MM or YYYY-MM-DD for %s missing.\n", argv[currentarg]);
- return 1;
+ exit(EXIT_FAILURE);
}
} else if ((strcmp(argv[currentarg], "-v") == 0) || (strcmp(argv[currentarg], "--version")) == 0) {
printf("vnStat image output %s by Teemu Toivola <tst at iki dot fi>\n", getversion());
- return 0;
+ exit(EXIT_SUCCESS);
} else {
printf("Unknown arg \"%s\". Use --help for help.\n", argv[currentarg]);
- return 1;
+ exit(EXIT_FAILURE);
}
}
- if (p.help || argc == 1) {
- showihelp(&p);
- return 0;
+ if (p->help || argc == 1) {
+ showihelp(p);
+ exit(EXIT_SUCCESS);
}
-
- validateinput(&p);
- handlecaching(&p, &ic);
- handledatabase(&p, &ic);
- openoutput(&p);
-
- if (debug)
- printf("Qmode: %d\n", cfg.qmode);
-
- drawimage(&ic);
- db_close();
- writeoutput(&p, &ic);
-
- if (debug)
- printf("all done\n");
-
- return 0;
-}
-
-void initiparams(IPARAMS *p)
-{
- db = NULL;
- noexit = 0; /* allow functions to exit in case of error */
- debug = 0; /* debug disabled by default */
- disableprints = 0; /* let prints be visible */
-
- p->interface[0] = '\0';
- p->filename[0] = '\0';
- p->cfgfile[0] = '\0';
- p->cache = 0;
- p->help = 0;
-}
-
-void showihelp(IPARAMS *p)
-{
- printf("vnStat image output %s by Teemu Toivola <tst at iki dot fi>\n\n", getversion());
-
- printf(" -5, --fiveminutes [count] output 5 minutes\n");
- printf(" -h, --hours [count] output hours\n");
- printf(" -hg, --hoursgraph output hours graph\n");
- printf(" -d, --days [count] output days\n");
- printf(" -m, --months [count] output months\n");
- printf(" -y, --years [count] output years\n");
- printf(" -t, --top [count] output top days\n");
- printf(" -s, --summary output summary\n");
- printf(" -hs, --hsummary output horizontal summary with hours\n");
- printf(" -vs, --vsummary output vertical summary with hours\n");
- printf(" -nh, --noheader remove header from output\n");
- printf(" -ne, --noedge remove edge from output\n");
- printf(" -nl, --nolegend remove legend from output\n");
- printf(" -ru, --rateunit [mode] swap configured rate unit\n");
- printf(" -o, --output <file> select output filename\n");
- printf(" -c, --cache <minutes> update output only when too old\n");
- printf(" -i, --iface <interface> select interface");
- if (strlen(p->interface)) {
- printf(" (default: %s)", p->interface);
- }
- printf("\n");
- printf(" -b, --begin <date> set list begin date\n");
- printf(" -e, --end <date> set list end date\n");
- printf(" -?, --help this help\n");
- printf(" -D, --debug show some additional debug information\n");
- printf(" -v, --version show version\n");
- printf(" --dbdir <directory> select database directory\n");
- printf(" --style <mode> select output style (0-3)\n");
- printf(" --locale <locale> set locale\n");
- printf(" --config <config file> select config file\n");
- printf(" --altdate use alternative date location\n");
- printf(" --headertext <text> specify header text string\n");
- printf(" --transparent [enabled] toggle background transparency\n\n");
-
- printf("See also \"man vnstati\".\n");
}
void validateinput(IPARAMS *p)