static int vec_contact_cmp(struct ast_sip_contact *left, struct ast_sip_contact *right) { struct ast_sip_contact *left_contact = left; struct ast_sip_contact *right_contact = right; /* Sort from soonest to expire to last to expire */ return ast_tvcmp(left_contact->expiration_time, right_contact->expiration_time); }
struct ast_channel *ast_pickup_find_by_group(struct ast_channel *chan) { struct ao2_container *candidates;/*!< Candidate channels found to pickup. */ struct ast_channel *target;/*!< Potential pickup target */ candidates = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_NOLOCK, 1, NULL, NULL); if (!candidates) { return NULL; } /* Find all candidate targets by group. */ ast_channel_callback(find_channel_by_group, chan, candidates, 0); /* Find the oldest pickup target candidate */ target = NULL; for (;;) { struct ast_channel *candidate;/*!< Potential new older target */ struct ao2_iterator iter; iter = ao2_iterator_init(candidates, 0); while ((candidate = ao2_iterator_next(&iter))) { if (!target) { /* First target. */ target = candidate; continue; } if (ast_tvcmp(ast_channel_creationtime(candidate), ast_channel_creationtime(target)) < 0) { /* We have a new target. */ ast_channel_unref(target); target = candidate; continue; } ast_channel_unref(candidate); } ao2_iterator_destroy(&iter); if (!target) { /* No candidates found. */ break; } /* The found channel must be locked and ref'd. */ ast_channel_lock(target); /* Recheck pickup ability */ if (ast_can_pickup(target)) { /* This is the channel to pickup. */ break; } /* Someone else picked it up or the call went away. */ ast_channel_unlock(target); ao2_unlink(candidates, target); target = ast_channel_unref(target); } ao2_ref(candidates, -1); return target; }
/* * given the last event *tv and the offset in milliseconds 'when', * computes the next value, */ static int sched_settime(struct timeval *tv, int when) { struct timeval now = ast_tvnow(); /*ast_log(LOG_DEBUG, "TV -> %lu,%lu\n", tv->tv_sec, tv->tv_usec);*/ if (ast_tvzero(*tv)) /* not supplied, default to now */ *tv = now; *tv = ast_tvadd(*tv, ast_samp2tv(when, 1000)); if (ast_tvcmp(*tv, now) < 0) { ast_log(LOG_DEBUG, "Request to schedule in the past?!?!\n"); *tv = now; } return 0; }
/*! \internal * \brief Return whether or not the item has expired */ static int bucket_file_expired(struct ast_bucket_file *bucket_file) { RAII_VAR(struct ast_bucket_metadata *, metadata, ast_bucket_file_metadata_get(bucket_file, "__actual_expires"), ao2_cleanup); struct timeval current_time = ast_tvnow(); struct timeval expires = { .tv_sec = 0, .tv_usec = 0 }; if (!metadata) { return 1; } if (sscanf(metadata->value, "%lu", &expires.tv_sec) != 1) { return 1; } return ast_tvcmp(current_time, expires) == -1 ? 0 : 1; } /*! * \internal \brief Obtain a CURL handle with common setup options */ static CURL *get_curl_instance(struct curl_bucket_file_data *cb_data) { CURL *curl; curl = curl_easy_init(); if (!curl) { return NULL; } curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 180); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, curl_header_callback); curl_easy_setopt(curl, CURLOPT_USERAGENT, GLOBAL_USERAGENT); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); curl_easy_setopt(curl, CURLOPT_URL, ast_sorcery_object_get_id(cb_data->bucket_file)); curl_easy_setopt(curl, CURLOPT_HEADERDATA, cb_data); return curl; }