diff --git a/xorriso/lib_mgt.c b/xorriso/lib_mgt.c index 91a05a2b..a9ccc394 100644 --- a/xorriso/lib_mgt.c +++ b/xorriso/lib_mgt.c @@ -1107,3 +1107,20 @@ ex:; return(ret); } + +int Xorriso_check_rrip_tf_1900(struct XorrisO *xorriso, time_t t, int flag) +{ + if(xorriso->relax_compliance & isoburn_igopt_rrip_tf_year0 || + t >= -2208988800) + return(1); + sprintf(xorriso->info_text, "Time value %s", ctime(&t)); + /* Overwrite ctime's newline */ + strcpy(xorriso->info_text + strlen(xorriso->info_text) - 1, + " in local time is before 01 Jan 1900 00:00:00 UTC"); + strcpy(xorriso->info_text + strlen(xorriso->info_text), + " and -compliance rrip_tf_year0 is not set"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0); + return(0); +} + + diff --git a/xorriso/misc_funct.c b/xorriso/misc_funct.c index 96ce53c6..a81b787b 100644 --- a/xorriso/misc_funct.c +++ b/xorriso/misc_funct.c @@ -343,27 +343,36 @@ int Decode_date_year(char *text, int flag) for(i= 0; text[i]!=0; i++) if(!isdigit(text[i])) return(-1); - if(strlen(text)!=4) + if(strlen(text) < 1) return(-2); sscanf(text, "%d", &ret); - if(ret<0 || ret>3000) + if(ret<0 || ret>9999) return(-2); return(ret); } +/* @return: <=0 error + 1= timezone minutes found, 2= timezone name found, 3= UTC found +*/ int Decode_date_timezone(char *text, struct tm *erg, int flag) { int i; - static char tzs[][5]= {"GMT", "CET", "CEST", "0000", ""}; + static char utc_tzs[][6]= {"GMT", "UTC", "+0000", "-0000", ""}; + static char tzs[][6]= {"CET", "CEST", ""}; - for(i= 0; tzs[i][0]!=0; i++) + for(i= 0; utc_tzs[i][0]!=0; i++) { + if(strcmp(text, utc_tzs[i]) == 0) + return(3); + } + for(i= 0; tzs[i][0]!=0; i++) { if(strcmp(text,tzs[i])==0) { /* ??? >>> what to do with timezone info ? Add to ->tm_hour ? */ return(1); } + } if(text[0]=='+' || text[0]=='-') { for(i= 1; text[i]!=0; i++) if(!isdigit(text[i])) @@ -385,12 +394,15 @@ int Decode_date_timezone(char *text, struct tm *erg, int flag) } +/* @return: <=0 error, 1= local time, 2= UTC +*/ int Decode_date_output_format(struct tm *erg, char *text, int flag) /* Thu Nov 8 09:07:50 CET 2007 */ /* Sat, 03 Nov 2007 08:58:30 +0100 */ /* Nov 7 23:24 */ { int ret, i, argc= 0, seen_year= 0, seen_month= 0, seen_day= 0, seen_time= 0; + int utc= 0; char **argv= NULL; struct tm *now; time_t timep; @@ -428,18 +440,21 @@ int Decode_date_output_format(struct tm *erg, char *text, int flag) } if(!seen_year) { ret= Decode_date_year(argv[i], 0); - if(ret>0) { + if(ret >= 0) { erg->tm_year= ret-1900; seen_year= 1; continue; } } - /* ignorants have to stay at the end of the loop */ - ret= Decode_date_timezone(argv[i], erg, 0); + if(ret == 3) + utc= 1; if(ret>=0) continue; + + /* ignorants have to stay at the end of the loop */ + ret= Decode_date_weekday(argv[i], 0); if(ret>=0) continue; /* ignore weekdays */ @@ -454,7 +469,7 @@ int Decode_date_output_format(struct tm *erg, char *text, int flag) now= localtime(&timep); erg->tm_year= now->tm_year; } - ret= 1; + ret= 1 + utc; ex: Sfile_make_argv("", "", &argc, &argv, 2); /* release storage */ return(ret); @@ -485,8 +500,6 @@ int Decode_ecma119_format(struct tm *erg, char *text, int flag) num= 0; for(i= 0; i < 4; i++) num= num * 10 + text[i] - '0'; - if(num < 1970 || num > 3000) - return(0); erg->tm_year = num - 1900; erg->tm_mon= 10*(text[4]-'0')+text[5]-'0'-1; if(erg->tm_mon > 12) @@ -532,7 +545,7 @@ int Decode_xorriso_timestamp(struct tm *erg, char *code, int flag) return(0); buf[4]= 0; sscanf(buf, "%d", &year); - if(year<1900 || year>3000) + if(year < 0 || year > 9999) return(0); if(!(isdigit(buf[5]) && isdigit(buf[6]) && (buf[7] == '.' || buf[7] == '_'))) return(0); @@ -588,6 +601,30 @@ done:; } +/* For now only from local time +*/ +static int Tm_to_seconds(struct tm *result_tm, int utc, double *seconds, + int flag) +{ + *seconds= mktime(result_tm); + if(utc == 1) { + +#ifdef HAVE_TM_GMTOFF + *seconds+= result_tm->tm_gmtoff; +#else + if(result_tm->tm_isdst < 0) + result_tm->tm_isdst = 0; +#ifndef Libburnia_timezonE +#define Libburnia_timezonE timezone +#endif + *seconds-= Libburnia_timezonE - result_tm->tm_isdst * 3600; +#endif + + } + return(1); +} + + int Decode_timestring(char *code, time_t *date, int flag) { char scale_chr; @@ -638,32 +675,21 @@ int Decode_timestring(char *code, time_t *date, int flag) seconds= mktime(&result_tm); seconds_valid= 1; goto completed; - } else if(Decode_date_output_format(&result_tm, code, 0)>0) { + } else if((ret= Decode_date_output_format(&result_tm, code, 0)) > 0) { /* Thu Nov 8 09:07:50 CET 2007 */; /* Sat, 03 Nov 2007 08:58:30 +0100 */; + /* Sep 15 12:10:27 UTC 2025 */ /* Nov 7 23:24 */; - seconds= mktime(&result_tm); - seconds_valid= 1; + /* >>> enable not only local time and UTC, but also other zones */; + /* ret==2 means that the timestring is in UTC */ + seconds_valid= Tm_to_seconds(&result_tm, (ret == 2), &seconds, 0); + goto completed; } else if((ret= Decode_ecma119_format(&result_tm, code, 0)) > 0) { /* YYYYMMDDhhmmsscc[LOC] */ /* 2010040711405800LOC */ - seconds= mktime(&result_tm); - if(ret == 1) { - -#ifdef HAVE_TM_GMTOFF - seconds+= result_tm.tm_gmtoff; -#else - if(result_tm.tm_isdst < 0) - result_tm.tm_isdst = 0; -#ifndef Libburnia_timezonE -#define Libburnia_timezonE timezone -#endif - seconds-= Libburnia_timezonE - result_tm.tm_isdst * 3600; -#endif - - } - seconds_valid= 1; + /* ret==1 means that the timestring is in UTC, i.e. no suffix LOC */ + seconds_valid= Tm_to_seconds(&result_tm, (ret == 1), &seconds, 0); goto completed; } return(0); diff --git a/xorriso/opts_a_c.c b/xorriso/opts_a_c.c index 14acbc46..fdf89ab2 100644 --- a/xorriso/opts_a_c.c +++ b/xorriso/opts_a_c.c @@ -255,7 +255,7 @@ int Xorriso_option_alter_date(struct XorrisO *xorriso, if(ret<=0) goto ex; ret= Xorriso_convert_datestring(xorriso, "-alter_date", time_type, timestring, - &t_type, &t, 0); + &t_type, &t, 2); if(ret<=0) goto ex; for(i= 0; iinfo_text, 0, "SORRY", 0); return(0); } - sprintf(xorriso->info_text, "Understanding timestring '%s' as: %s", - timestring, ctime(t)); + sprintf(xorriso->info_text, + "Understanding timestring '%s' as: %s", timestring, ctime(t)); + /* Overwrite ctime's newline */ + strcpy(xorriso->info_text + strlen(xorriso->info_text) - 1, " local time"); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0); + if(flag & 2) + Xorriso_check_rrip_tf_1900(xorriso, *t, 0); return(1); } diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 57005a95..81c69f57 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2025.09.16.190953" +#define Xorriso_timestamP "2025.09.16.191504" diff --git a/xorriso/xorrisoburn.h b/xorriso/xorrisoburn.h index e8be810e..d0725d00 100644 --- a/xorriso/xorrisoburn.h +++ b/xorriso/xorrisoburn.h @@ -727,5 +727,7 @@ int Xorriso_tree_remove_isofs_var(struct XorrisO *xorriso, char *isofs_name, int Xorriso_set_local_chattr_ia(struct XorrisO *xorriso, char *disk_path, int flag); +int Xorriso_check_rrip_tf_1900(struct XorrisO *xorriso, time_t t, int flag); + #endif /* Xorrisoburn_includeD */