I'm not sure what effect all of those other functions have on the date value, but I tried the following and got the correct output both times regardless of the value of tm_isdst:
struct tm now;
now.tm_sec = 0; /* seconds after the minute - [0,59] */
now.tm_min = 0; /* minutes after the hour - [0,59] */
now.tm_hour = 15; /* hours since midnight - [0,23] */
now.tm_mday = 1; /* day of the month - [1,31] */
now.tm_mon = 5; /* months since January - [0,11] */
now.tm_year = 106; /* years since 1900 */
now.tm_wday = 5; /* days since Sunday - [0,6] */
now.tm_isdst = 1;
printf("%s", asctime(&now));
time_t t2 = mktime(&now);
printf("%s", ctime(&t2));
I guess I'm just not understanding your problem well enough.
"Money talks. When my money starts to talk, I get a bill to shut it up." - Frank
"Judge not by the eye but by the heart." - Native American Proverb