diff --git a/README.md b/README.md index eb86e58..cf59c4b 100644 --- a/README.md +++ b/README.md @@ -14,13 +14,15 @@ If you still want to, `make install` will install this utility to ## Usage ``` -Usage: bin/n [options] +Usage: n [options] Options: - -h HOST, --host=HOST NTP server to use + -h HOST, --host=HOST NTP server to use defaults to 'europe.pool.ntp.org' - -p PORT, --port=PORT NTP server port to use (must be numerical) + -p PORT, --port=PORT NTP server port to use (must be numerical) defaults to '123' - --help Display this message and exit + -f FORMAT, --format=FORMAT Date format string (passed to strftime) + defaults to standard of ctime + --help Display this message and exit ```
diff --git a/main.c b/main.c index 13e9f03..0c44efb 100644 --- a/main.c +++ b/main.c @@ -45,23 +45,37 @@ typedef struct { typedef struct { const char* host; int port; + const char* format; } ntp_info; -ntp_info NDEFAULT = {.host="europe.pool.ntp.org", .port = 123}; +ntp_info NDEFAULT = {.host="europe.pool.ntp.org", .port = 123, .format = NULL}; -void err(char* msg) { +char* nstrftime(const char* fmt, const struct tm* t) { + int size = 40; + char* res = malloc(size); + int n; + do { + n = strftime(res, size-1, fmt, t); + size *= 2; + } while (!n); + return res; +} + +void err(const char* msg) { fprintf(stderr, "Error %s.\n", msg); exit(1); } -void usage(char* program, int code) { +void usage(const char* program, int code) { fprintf(stderr, "Usage: %s [options]\n", program); fputs("Options:\n", stderr); - fputs(" -h HOST, --host=HOST NTP server to use\n", stderr); + fputs(" -h HOST, --host=HOST NTP server to use\n", stderr); fputs(" defaults to 'europe.pool.ntp.org'\n", stderr); - fputs(" -p PORT, --port=PORT NTP server port to use (must be numerical)\n", stderr); + fputs(" -p PORT, --port=PORT NTP server port to use (must be numerical)\n", stderr); fputs(" defaults to '123'\n", stderr); - fputs(" --help Display this message and exit\n", stderr); + fputs(" -f FORMAT, --format=FORMAT Date format string (passed to strftime)\n", stderr); + fputs(" defaults to standard of ctime\n", stderr); + fputs(" --help Display this message and exit\n", stderr); exit(code); } @@ -71,12 +85,14 @@ ntp_info args(int argc, char** argv) { static struct option long_options[] = { {"host", required_argument, 0, 'h'}, {"port", required_argument, 0, 'p'}, + {"format", required_argument, 0, 'f'}, {"help", no_argument, 0, 'u'}, {NULL, 0, NULL, 0} }; - while ((c = getopt_long(argc, argv, "t:a:", long_options, 0)) != -1) { + while ((c = getopt_long(argc, argv, "t:a:f:", long_options, 0)) != -1) { switch (c) { case 'h': res.host = optarg; break; + case 'f': res.format = optarg; break; case 'p': { char* end; res.port = strtol(optarg, &end, 10); @@ -123,7 +139,13 @@ int main(int argc, char** argv) { time_t tm = n.ttms - EPOCH; - fputs(ctime(&tm), stdout); + if (!i.format) { + fputs(ctime(&tm), stdout); + } else { + char* fmt = nstrftime(i.format, localtime(&tm)); + puts(fmt); + free(fmt); + } return 0; }