|  | @@ -333,6 +333,48 @@ struct tm *tor_localtime_r(const time_t *timep, struct tm *result);
 | 
	
		
			
				|  |  |  struct tm *tor_gmtime_r(const time_t *timep, struct tm *result);
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#ifndef timeradd
 | 
	
		
			
				|  |  | +/** Replacement for timeradd on platforms that do not have it: sets tvout to
 | 
	
		
			
				|  |  | + * the sum of tv1 and tv2. */
 | 
	
		
			
				|  |  | +#define timeradd(tv1,tv2,tvout) \
 | 
	
		
			
				|  |  | +  do {                                                  \
 | 
	
		
			
				|  |  | +    (tvout)->tv_sec = (tv1)->tv_sec + (tv2)->tv_sec;    \
 | 
	
		
			
				|  |  | +    (tvout)->tv_usec = (tv2)->tv_usec + (tv2)->tv_usec; \
 | 
	
		
			
				|  |  | +    if ((tvout)->tv_usec >= 1000000) {                  \
 | 
	
		
			
				|  |  | +      (tvout)->tv_usec -= 1000000;                      \
 | 
	
		
			
				|  |  | +      (tvout)->tv_sec++;                                \
 | 
	
		
			
				|  |  | +    }                                                   \
 | 
	
		
			
				|  |  | +  } while (0)
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#ifndef timersub
 | 
	
		
			
				|  |  | +/** Replacement for timersub on platforms that do not have it: sets tvout to
 | 
	
		
			
				|  |  | + * tv1 minus tv2. */
 | 
	
		
			
				|  |  | +#define timersub(tv1,tv2,tvout) \
 | 
	
		
			
				|  |  | +  do {                                                  \
 | 
	
		
			
				|  |  | +    (tvout)->tv_sec = (tv1)->tv_sec - (tv2)->tv_sec;    \
 | 
	
		
			
				|  |  | +    (tvout)->tv_usec = (tv2)->tv_usec - (tv2)->tv_usec; \
 | 
	
		
			
				|  |  | +    if ((tvout)->tv_usec < 0) {                         \
 | 
	
		
			
				|  |  | +      (tvout)->tv_usec += 1000000;                      \
 | 
	
		
			
				|  |  | +      (tvout)->tv_sec--;                                \
 | 
	
		
			
				|  |  | +    }                                                   \
 | 
	
		
			
				|  |  | +  } while (0)
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#ifndef timercmp
 | 
	
		
			
				|  |  | +/** Replacement for timersub on platforms that do not have it: returns true
 | 
	
		
			
				|  |  | + * iff the relational operator "op" makes the expression tv1 op tv2 true.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Note that while this definition should work for all boolean opeators, some
 | 
	
		
			
				|  |  | + * platforms' native timercmp definitions do not support >=, <=, or ==.  So
 | 
	
		
			
				|  |  | + * don't use those.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +#define timercmp(tv1,tv2,op)                    \
 | 
	
		
			
				|  |  | +  (((tv1)->tv_sec == (tv2)->tv_sec) ?           \
 | 
	
		
			
				|  |  | +   ((tv1)->tv_usec op (tv2)->tv_usec) :         \
 | 
	
		
			
				|  |  | +   ((tv1)->tv_sec op (tv2)->tv_sec))
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /* ===== File compatibility */
 | 
	
		
			
				|  |  |  int replace_file(const char *from, const char *to);
 | 
	
		
			
				|  |  |  int touch_file(const char *fname);
 |