void aclParseExternal(void *dataptr) { external_acl_data **datap = dataptr; external_acl_data *data; char *token; if (*datap) self_destruct(); CBDATA_INIT_TYPE_FREECB(external_acl_data, free_external_acl_data); data = cbdataAlloc(external_acl_data); token = strtok(NULL, w_space); if (!token) self_destruct(); data->def = find_externalAclHelper(token); cbdataLock(data->def); if (!data->def) self_destruct(); while ((token = strtokFile())) { wordlistAdd(&data->arguments, token); } *datap = data; }
static void shofixti_postprocess (PELEMENT ElementPtr) { STARSHIPPTR StarShipPtr; GetElementStarShip (ElementPtr, &StarShipPtr); if ((StarShipPtr->cur_status_flags ^ StarShipPtr->old_status_flags) & SPECIAL) { StarShipPtr->RaceDescPtr->ship_data.captain_control.special = IncFrameIndex (StarShipPtr->RaceDescPtr->ship_data.captain_control.special); if (GetFrameCount (StarShipPtr->RaceDescPtr->ship_data.captain_control.special) - GetFrameIndex (StarShipPtr->RaceDescPtr->ship_data.captain_control.special) == 3) self_destruct (ElementPtr); } }
static void timer_callback (GkmTimer *timer, gpointer user_data) { GkmObject *self = user_data; glong after, idle, offset; GkmObjectTransient *transient; GTimeVal tv; g_return_if_fail (GKM_IS_OBJECT (self)); g_object_ref (self); g_return_if_fail (self->pv->transient); transient = self->pv->transient; g_return_if_fail (timer == transient->timer); transient->timer = NULL; g_get_current_time (&tv); idle = after = G_MAXLONG; /* Are we supposed to be destroyed after a certain time? */ if (transient->timed_after) { g_return_if_fail (transient->stamp_created); after = (transient->stamp_created + transient->timed_after) - tv.tv_sec; } /* Are we supposed to be destroyed after an idle time? */ if (transient->timed_idle) { g_return_if_fail (transient->stamp_used); idle = (transient->stamp_used + transient->timed_idle) - tv.tv_sec; } /* Okay, time to destroy? */ offset = MIN (after, idle); if (offset <= 0) self_destruct (self); /* Setup the next timer */ else transient->timer = gkm_timer_start (self->pv->module, offset, timer_callback, self); g_object_unref (self); }
void gkm_object_mark_used (GkmObject *self) { GkmObjectTransient *transient; GTimeVal tv; g_return_if_fail (GKM_IS_OBJECT (self)); transient = self->pv->transient; if (transient) { if (transient->timed_idle) { g_get_current_time (&tv); transient->stamp_used = tv.tv_sec; } if (transient->uses_remaining) { --(transient->uses_remaining); if (transient->uses_remaining == 0) self_destruct (self); } } }
void parse_externalAclHelper(external_acl ** list) { external_acl *a; char *token; external_acl_format **p; CBDATA_INIT_TYPE_FREECB(external_acl, free_external_acl); CBDATA_INIT_TYPE_FREECB(external_acl_format, free_external_acl_format); a = cbdataAlloc(external_acl); a->ttl = DEFAULT_EXTERNAL_ACL_TTL; a->negative_ttl = -1; a->children = DEFAULT_EXTERNAL_ACL_CONCURRENCY; token = strtok(NULL, w_space); if (!token) self_destruct(); a->name = xstrdup(token); token = strtok(NULL, w_space); /* Parse options */ while (token) { if (strncmp(token, "ttl=", 4) == 0) { a->ttl = atoi(token + 4); } else if (strncmp(token, "negative_ttl=", 13) == 0) { a->negative_ttl = atoi(token + 13); } else if (strncmp(token, "children=", 9) == 0) { a->children = atoi(token + 9); } else if (strncmp(token, "concurrency=", 12) == 0) { a->children = atoi(token + 12); } else if (strncmp(token, "cache=", 6) == 0) { a->cache_size = atoi(token + 6); } else { break; } token = strtok(NULL, w_space); } if (a->negative_ttl == -1) a->negative_ttl = a->ttl; /* Parse format */ p = &a->format; while (token) { external_acl_format *format; /* stop on first non-format token found */ if (*token != '%') break; format = cbdataAlloc(external_acl_format); if (strncmp(token, "%{", 2) == 0) { /* header format */ char *header, *member, *end; header = token + 2; end = strchr(header, '}'); /* cut away the terminating } */ if (end && strlen(end) == 1) *end = '\0'; else self_destruct(); member = strchr(header, ':'); if (member) { /* Split in header and member */ *member++ = '\0'; if (!isalnum(*member)) format->separator = *member++; else format->separator = ','; format->member = xstrdup(member); format->type = EXT_ACL_HEADER_MEMBER; } else { format->type = EXT_ACL_HEADER; } format->header = xstrdup(header); format->header_id = httpHeaderIdByNameDef(header, strlen(header)); if (format->header_id != -1) { if (member) format->type = EXT_ACL_HEADER_ID_MEMBER; else format->type = EXT_ACL_HEADER_ID; } } else if (strcmp(token, "%LOGIN") == 0) { format->type = EXT_ACL_LOGIN; a->require_auth = 1; } #if USE_IDENT else if (strcmp(token, "%IDENT") == 0) format->type = EXT_ACL_IDENT; #endif else if (strcmp(token, "%SRC") == 0) format->type = EXT_ACL_SRC; else if (strcmp(token, "%DST") == 0) format->type = EXT_ACL_DST; else if (strcmp(token, "%PROTO") == 0) format->type = EXT_ACL_PROTO; else if (strcmp(token, "%PORT") == 0) format->type = EXT_ACL_PORT; else if (strcmp(token, "%METHOD") == 0) format->type = EXT_ACL_METHOD; else { self_destruct(); } *p = format; p = &format->next; token = strtok(NULL, w_space); } /* There must be at least one format token */ if (!a->format) self_destruct(); /* helper */ if (!token) self_destruct(); wordlistAdd(&a->cmdline, token); /* arguments */ parse_wordlist(&a->cmdline); while (*list) list = &(*list)->next; *list = a; }
void parse_refreshCheckHelper(refresh_check_helper ** ptr) { refresh_check_helper *a; char *token; refresh_check_format **p; if (*ptr) self_destruct(); CBDATA_INIT_TYPE_FREECB(refresh_check_helper, free_refresh_check_helper); CBDATA_INIT_TYPE_FREECB(refresh_check_format, free_refresh_check_format); a = cbdataAlloc(refresh_check_helper); a->children = DEFAULT_REFRESH_CHECK_CHILDREN; /* Parse options */ while ((token = strtok(NULL, w_space)) != NULL) { if (strncmp(token, "children=", 9) == 0) { a->children = atoi(token + 9); } else if (strncmp(token, "concurrency=", 12) == 0) { a->concurrency = atoi(token + 12); } else { break; } } /* Parse format */ p = &a->format; while (token) { refresh_check_format *format; /* stop on first non-format token found */ if (*token != '%') break; format = cbdataAlloc(refresh_check_format); if (strncmp(token, "%RES{", 5) == 0) { /* header format */ char *header, *member, *end; header = token + 5; end = strchr(header, '}'); /* cut away the terminating } */ if (end && strlen(end) == 1) *end = '\0'; else self_destruct(); member = strchr(header, ':'); if (member) { /* Split in header and member */ *member++ = '\0'; if (!xisalnum(*member)) format->separator = *member++; else format->separator = ','; format->member = xstrdup(member); format->type = REFRESH_CHECK_RESP_HEADER_MEMBER; } else { format->type = REFRESH_CHECK_RESP_HEADER; } format->header = xstrdup(header); format->header_id = httpHeaderIdByNameDef(header, strlen(header)); if (format->header_id != -1) { if (member) format->type = REFRESH_CHECK_RESP_HEADER_ID_MEMBER; else format->type = REFRESH_CHECK_RESP_HEADER_ID; } } else if (strcmp(token, "%URI") == 0) format->type = REFRESH_CHECK_URI; else if (strcmp(token, "%URL") == 0) format->type = REFRESH_CHECK_URI; else if (strcmp(token, "%CACHE_URI") == 0) format->type = REFRESH_CHECK_URI; else if (strcmp(token, "%AGE") == 0) format->type = REFRESH_CHECK_AGE; else { self_destruct(); } *p = format; p = &format->next; token = strtok(NULL, w_space); } /* There must be at least one format token */ if (!a->format) self_destruct(); /* helper */ if (!token) self_destruct(); wordlistAdd(&a->cmdline, token); /* arguments */ parse_wordlist(&a->cmdline); *ptr = a; }