+ result = xstrdup(tmpbuf);
+
+ return result;
+}
+
+static char *tzoffset(time_t *now)
+/* calculate timezone offset */
+{
+ static char offset_string[6];
+ struct tm gmt, *lt;
+ int off;
+ char sign = '+';
+
+ gmt = *gmtime(now);
+ lt = localtime(now);
+ off = (lt->tm_hour - gmt.tm_hour) * 60 + lt->tm_min - gmt.tm_min;
+ if (lt->tm_year < gmt.tm_year)
+ off -= 24 * 60;
+ else if (lt->tm_year > gmt.tm_year)
+ off += 24 * 60;
+ else if (lt->tm_yday < gmt.tm_yday)
+ off -= 24 * 60;
+ else if (lt->tm_yday > gmt.tm_yday)
+ off += 24 * 60;
+ if (off < 0) {
+ sign = '-';
+ off = -off;
+ }
+ if (off >= 24 * 60) /* should be impossible */
+ off = 23 * 60 + 59; /* if not, insert silly value */
+ snprintf(offset_string, sizeof(offset_string),
+ "%c%02d%02d", sign, off / 60, off % 60);
+ return (offset_string);