Files
unixtime/unixtime.c

140 lines
3.1 KiB
C

/*
* unixtime.c
*/
#include <libgen.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <time.h>
/* symbols */
#define TRUE 1
#define FALSE 0
#define VERSION "0.2"
/* prototypes */
int print_version(void);
int print_help(void);
/* definition of extern objects */
char *progname;
const char *version = VERSION;
/*
* main
*/
int main(int argc, char** argv) {
int i;
int j;
char c;
char *p;
size_t l;
time_t t = 0;
struct tm *tm;
/* Store program name without path
* (will be used in e.g. error messages) */
if( (progname = strdup(basename(argv[0]))) == NULL ) {
fprintf(stderr, "%s: ", basename(argv[0]));
perror(NULL);
exit(EX_OSERR);
}
/* Parse command line options */
for( i = 1 ; i < argc ; i++ ) {
if(!strncmp("--", argv[i], 2)) {
/* Current argument is a GNU long option */
if(!strcmp( "--help", argv[i])) {
print_help();
exit(EX_OK);
} else if(!strcmp("--version", argv[i])) {
print_version();
exit(EX_OK);
} else {
fprintf(stderr, "%s: invalid option: %s\n", progname, argv[i]);
fprintf(stderr, "Try '%s -h' for help.\n", progname);
exit(EX_USAGE);
}
} else if(!strncmp("-", argv[i], 1)) {
/* Current argument is one or more short options */
p = argv[i];
for( j = 1 ; (c = p[j]) != '\0' ; j++) {
switch(c) {
case 'h':
print_help();
exit(EX_OK);
break;
case 'V':
print_version();
exit(EX_OK);
break;
default:
fprintf(stderr, "%s: invalid option: %c\n", progname, c);
fprintf(stderr, "Try '%s -h' for help.\n", progname);
exit(EX_USAGE);
}
}
} else {
/* This is the first argument, that is not an option.
* It will be taken as timestamp. */
t = atol(argv[i]);
l = strlen(argv[i]);
if((p = malloc(l + 1)) != NULL) {
snprintf(p, l + 1, "%ld", t);
if(strcmp(argv[i], p)) {
fprintf(stderr, "%s: not integer: %s\n", progname,
argv[i]);
exit(EX_DATAERR);
}
free(p);
} else {
fprintf(stderr, "%s: Warning: cannot allocate memory"
" to do integer test on input.\n", progname);
}
break;
}
}
p = ctime((& t));
if(p == NULL) {
fprintf(stderr, "%s: unrecognized date '%ld'.\n", progname, t);
exit(EX_DATAERR);
}
fputs(p, stdout);
exit(EX_OK);
}
int print_version( void ) {
printf("%s Version %s\n",progname, version);
return TRUE;
}
int print_help( void ) {
time_t t = 0;
char *p;
char *p2;
printf("\n");
printf("%s converts a unix timestamp into a human readable date.\n",
progname);
printf("\n");
printf("Usage: unixtime [<timestamp>]\n"
" [-h, --help] [-V, --version]\n");
printf("\n");
printf("Where <timestamp> is the number of seconds since the Epoch\n");
if((p = strdup(ctime(& t))) != NULL) {
/* ctime() return the date as string with an appended new line.
* Since we do not want the new line to be printed, we terminate
* the string at the position of the new line. */
if((p2 = strstr(p, "\n")) != NULL)
strcpy(p2, "\0");
printf("(i.e. %s).\n", p);
free(p);
}
printf("\n");
return TRUE;
}