/* * Copyright (C) 2021 P. J. McDermott * * This file is part of @ * * @ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * @ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with @. If not, see . */ #include #include #include #include #include #include #include #include "datetime.h" static char * _concat_args(int argc, const char *argv[]) { int buf_l; int i; char *buf; int buf_i; int j; buf_l = 0; for (i = 0; i < argc; ++i) { buf_l += strlen(argv[i]) + 1; } buf = calloc(buf_l, sizeof(*buf)); if (buf == NULL) { fprintf(stderr, "Failed to allocate buffer: %s\n", strerror(errno)); return NULL; } buf_i = 0; for (i = 0; i < argc; ++i) { for (j = 0; argv[i][j] != '\0'; ++j) { buf[buf_i++] = argv[i][j]; } buf[buf_i++] = ' '; } buf[--buf_i] = '\0'; return buf; } int main(int argc, const char *argv[]) { char *buf; time_t arg; time_t now; time_t dif; buf = _concat_args(argc - 1, argv + 1); if (buf == NULL) { return -1; } if (datetime_parse(buf, &arg) < 0) { free(buf); return EXIT_FAILURE; } free(buf); time(&now); dif = arg - now; if (dif >= 1000 * 24 * 60 * 60) { fputs("Date too far in the future\n", stderr); return EXIT_FAILURE; } setvbuf(stdout, NULL, _IONBF, 0); while (arg > now) { printf("\r%03d:%02d:%02d:%02d", (int) dif / 60 / 60 / 24, (int) dif / 60 / 60 % 24, (int) dif / 60 % 60, (int) dif % 60); sleep(1); time(&now); dif = arg - now; } printf("\r000:00:00:00\n"); return EXIT_SUCCESS; }