I am trying to add a week repeatedly to an event struct, which contains date information. I am doing this in order to create a multiple instances of an event up until a certain time. I'm getting a seg fault on my mktime function where full_time = mktime(&caltime); and I have no clue why.
void multiple(icalevent event, int is_location){
icalevent temp;
int rrule_bound = atoi(event.rrule);
int rtime_bound = atoi(event.rtime);
int start_bound = atoi(event.start);
int stime_bound = atoi(event.stime);
char buffer[9];
struct tm caltime;
time_t full_time;
char time_str[15];
temp = cpystruct(event, is_location);
while((start_bound <= rrule_bound) && (stime_bound <= rtime_bound)){
memset(&caltime, 0, sizeof(struct tm));
strncpy(time_str, temp.start, 9);
strncat(time_str, temp.stime, 6);
strptime(time_str, "%Y%m%d%H%M%S", &caltime);
caltime.tm_mday += 7;
full_time = mktime(&caltime);
if(caltime.tm_isdst == 1){
caltime.tm_hour -= 1;
}
full_time = mktime(&caltime);
strftime(buffer, 9, "%Y%m%d", &caltime);
start_bound = atoi(buffer);
strncpy(temp.end, buffer, 8);
strncpy(temp.start, buffer, 8);
if((start_bound <= rrule_bound) && (stime_bound <= rtime_bound)){
/*create a sort string*/
calendar[percent_full] = cpystruct(temp, is_location);
printst(calendar[percent_full]);
percent_full++;
}
else{
break;
}
}
return;
}
The icalevent
structure:
typedef struct{
char start[9]; /*"YYYYMMDD*/
char stime[7]; /*"HHMMSS"*/
char end[9]; /*"YYYYMMDD"*/
char etime[7]; /*"HHMMSS"*/
char rrule[9]; /*"YYYYMMDD"*/
char rtime[7]; /*"HHMMSS"*/
char *location; /*"2343 fake street"*/
char *summary; /*"Halloween party"*/
char *sort_str; /*"YYYYMMDDHHMMSSHalloween party*/
} icalevent
Edit:
icalevent cpystruct(icalevent temp, int is_location) {
icalevent perm;
strncpy(perm.start, temp.start, 9);
strncpy(perm.stime, temp.stime, 7);
strncpy(perm.end, temp.end, 9);
strncpy(perm.etime, temp.etime, 7);
strncpy(perm.rrule, temp.rrule, 9);
strncpy(perm.rtime, temp.rtime, 7);
if(is_location) {
perm.location = strdup(temp.location);
} else {
perm.location = NULL;
}
perm.summary = strdup(temp.summary);
perm.sort_str = strdup(temp.sort_str);
return perm;
}
cpystruct
defined?icalevent cpystruct(icalevent temp, int is_location){ icalevent perm; strncpy(perm.start, temp.start, 9); strncpy(perm.stime, temp.stime, 7); strncpy(perm.end, temp.end, 9); strncpy(perm.etime, temp.etime, 7); strncpy(perm.rrule, temp.rrule, 9); strncpy(perm.rtime, temp.rtime, 7); if(is_location){ perm.location = strdup(temp.location); }else{ perm.location = NULL; } perm.summary = strdup(temp.summary); perm.sort_str = strdup(temp.sort_str); return perm; }
cpystruct
to your question. It's easier to read there. You can easily do that yourself. Just use the small "edit" link below the question.cpystruct
code by usingsizeof(temp.start)
instead of9
, etc. You could also usememmove()
ormemcpy()
instead ofstrncpy()
. But it isn't obvious that there's a problem in that function. You don't check the return value fromstrptime()
; if that fails, you've got a seriously misinitialized variable that you're passing tomktime()
.