Index: gnokii/gnokii.c =================================================================== RCS file: /cvsroot/gnokii/gnokii/gnokii/gnokii.c,v retrieving revision 1.411 diff -u -r1.411 gnokii.c --- gnokii/gnokii.c 31 Oct 2004 15:05:52 -0000 1.411 +++ gnokii/gnokii.c 31 Oct 2004 19:45:01 -0000 @@ -894,6 +894,10 @@ sms.smsc_time.minute = atoi(tmp); strncpy(tmp, optarg+10, 2); sms.smsc_time.second = atoi(tmp); + if (!gn_timestamp_isvalid(sms.smsc_time)) { + fprintf(stderr, _("Invalid datetime: %s.\n"), optarg); + return -1; + } break; default: usage(stderr, -1); Index: common/misc.c =================================================================== RCS file: /cvsroot/gnokii/gnokii/common/misc.c,v retrieving revision 1.87 diff -u -r1.87 misc.c --- common/misc.c 11 Oct 2004 07:42:04 -0000 1.87 +++ common/misc.c 31 Oct 2004 19:45:01 -0000 @@ -547,3 +547,39 @@ } free(str_array); } + +/* + * check if the timestamp in dt has valid date and time + */ +API int gn_timestamp_isvalid(gn_timestamp dt) +{ +#define BETWEEN(a, x, y) ((a >= x) && (a <= y)) + int daynum; + + /* assume that year is OK */ + switch (dt.month) { + case 2: + if (((dt.year % 4) == 0) && + (((dt.year % 100) != 0) || + ((dt.year % 1000) == 0))) + daynum = 29; + else + daynum = 28; + break; + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + daynum = 31; + break; + default: + daynum = 30; + break; + } + return (BETWEEN(dt.month, 1, 12) && BETWEEN(dt.day, 1, daynum) && + BETWEEN(dt.hour, 0, 24) && BETWEEN(dt.minute, 0, 59) && + BETWEEN(dt.second, 0, 59)); +} Index: include/gnokii.h =================================================================== RCS file: /cvsroot/gnokii/gnokii/include/gnokii.h,v retrieving revision 1.73 diff -u -r1.73 gnokii.h --- include/gnokii.h 7 Sep 2004 11:37:28 -0000 1.73 +++ include/gnokii.h 31 Oct 2004 19:45:01 -0000 @@ -97,6 +97,7 @@ extern API gn_error (*gn_gsm_f)(gn_operation op, gn_data *data, struct gn_statemachine *state); API gn_error gn_gsm_initialise(struct gn_statemachine *sm); +API int gn_timestamp_isvalid(gn_timestamp dt); /* Config file */ API char *gn_cfg_get(struct gn_cfg_header *cfg, const char *section, const char *key);