Files
unixtime/unixtime.c
heinzel ca123fb724 Some minor fixes and improvments:
1. Fixed compiler warnings about incompatible usage of time_t in
   snprintf and fprintf format strings (Line 85 and 102).
2. Fixed usage of wronge time variable in failsafe error message
   (Line 102).
3. Clearified error message about wrong timestamp format. It now
   says integer instead of numeric (Line 87).
2012-10-09 10:34:47 +02:00

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.1"
/* 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;
}