Cope with negative C library timestamps
While perhaps not strictly valid, negative timestamps can potentially be returned by the C library and passed in to iso8601_from_ts() etc. This commit adds a check for such timestamps and copes with the gracefully, whereas previously invalid ISO8601 timestamps would have been generated.
This commit is contained in:
		
							parent
							
								
									0d56edd890
								
							
						
					
					
						commit
						944331702f
					
				| 
						 | 
					@ -22,7 +22,8 @@ iso8601_now(struct iso8601_date* date, struct iso8601_details* details)
 | 
				
			||||||
    if(use_gettimeofday || clock_gettime(CLOCK_REALTIME, &ts)) {
 | 
					    if(use_gettimeofday || clock_gettime(CLOCK_REALTIME, &ts)) {
 | 
				
			||||||
        use_gettimeofday = 1;
 | 
					        use_gettimeofday = 1;
 | 
				
			||||||
        gettimeofday(&tv, 0);
 | 
					        gettimeofday(&tv, 0);
 | 
				
			||||||
        ts.tv_sec = tv.tv_sec;
 | 
					        if(tv.tv_sec < 0) ts.tv_sec = 0;
 | 
				
			||||||
 | 
					        else ts.tv_sec = tv.tv_sec;
 | 
				
			||||||
        ts.tv_nsec = tv.tv_usec * 1000L;
 | 
					        ts.tv_nsec = tv.tv_usec * 1000L;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,6 +80,10 @@ iso8601_from_ts(struct iso8601_date* date, const struct timespec* ts)
 | 
				
			||||||
    ldiv_t qr;
 | 
					    ldiv_t qr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qr = ldiv(ts->tv_sec, 86400);
 | 
					    qr = ldiv(ts->tv_sec, 86400);
 | 
				
			||||||
 | 
					    if(ts->tv_sec < 0) {
 | 
				
			||||||
 | 
					        --qr.quot;
 | 
				
			||||||
 | 
					        qr.rem += 86400;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    date->day = EPOCH_GDAY + qr.quot;
 | 
					    date->day = EPOCH_GDAY + qr.quot;
 | 
				
			||||||
    date->sec = qr.rem;
 | 
					    date->sec = qr.rem;
 | 
				
			||||||
    date->nsec = ts->tv_nsec;
 | 
					    date->nsec = ts->tv_nsec;
 | 
				
			||||||
| 
						 | 
					@ -101,6 +106,10 @@ iso8601_from_tv(struct iso8601_date* date, const struct timeval* tv)
 | 
				
			||||||
    ldiv_t qr;
 | 
					    ldiv_t qr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qr = ldiv(tv->tv_sec, 86400);
 | 
					    qr = ldiv(tv->tv_sec, 86400);
 | 
				
			||||||
 | 
					    if(tv->tv_sec < 0) {
 | 
				
			||||||
 | 
					        --qr.quot;
 | 
				
			||||||
 | 
					        qr.rem += 86400;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    date->day = EPOCH_GDAY + qr.quot;
 | 
					    date->day = EPOCH_GDAY + qr.quot;
 | 
				
			||||||
    date->sec = qr.rem;
 | 
					    date->sec = qr.rem;
 | 
				
			||||||
    date->nsec = tv->tv_usec * 1000;
 | 
					    date->nsec = tv->tv_usec * 1000;
 | 
				
			||||||
| 
						 | 
					@ -123,6 +132,10 @@ iso8601_from_time_t(struct iso8601_date* date, const time_t* t)
 | 
				
			||||||
    ldiv_t qr;
 | 
					    ldiv_t qr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qr = ldiv(*t, 86400);
 | 
					    qr = ldiv(*t, 86400);
 | 
				
			||||||
 | 
					    if(*t < 0) {
 | 
				
			||||||
 | 
					        --qr.quot;
 | 
				
			||||||
 | 
					        qr.rem += 86400;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    date->day = EPOCH_GDAY + qr.quot;
 | 
					    date->day = EPOCH_GDAY + qr.quot;
 | 
				
			||||||
    date->sec = qr.rem;
 | 
					    date->sec = qr.rem;
 | 
				
			||||||
    date->nsec = 0;
 | 
					    date->nsec = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue