本文整理汇总了C++中G_LOCK函数的典型用法代码示例。如果您正苦于以下问题:C++ G_LOCK函数的具体用法?C++ G_LOCK怎么用?C++ G_LOCK使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了G_LOCK函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: g_cancellable_connect
/**
* g_cancellable_connect:
* @cancellable: A #GCancellable.
* @callback: The #GCallback to connect.
* @data: Data to pass to @callback.
* @data_destroy_func: Free function for @data or %NULL.
*
* Convenience function to connect to the #GCancellable::cancelled
* signal. Also handles the race condition that may happen
* if the cancellable is cancelled right before connecting.
*
* @callback is called at most once, either directly at the
* time of the connect if @cancellable is already cancelled,
* or when @cancellable is cancelled in some thread.
*
* @data_destroy_func will be called when the handler is
* disconnected, or immediately if the cancellable is already
* cancelled.
*
* See #GCancellable::cancelled for details on how to use this.
*
* Returns: The id of the signal handler or 0 if @cancellable has already
* been cancelled.
*
* Since: 2.22
*/
gulong
g_cancellable_connect (GCancellable *cancellable,
GCallback callback,
gpointer data,
GDestroyNotify data_destroy_func)
{
gulong id;
g_return_val_if_fail (G_IS_CANCELLABLE (cancellable), 0);
G_LOCK (cancellable);
if (cancellable->priv->cancelled)
{
void (*_callback) (GCancellable *cancellable,
gpointer user_data);
_callback = (void *)callback;
id = 0;
_callback (cancellable, data);
if (data_destroy_func)
data_destroy_func (data);
}
else
{
id = g_signal_connect_data (cancellable, "cancelled",
callback, data,
(GClosureNotify) data_destroy_func,
0);
}
G_UNLOCK (cancellable);
return id;
}
开发者ID:Andais,项目名称:glib,代码行数:62,代码来源:gcancellable.c
示例2: g_slist_free
void
g_slist_free (GSList *list)
{
if (list)
{
GSList *last_node = list;
#ifdef ENABLE_GC_FRIENDLY
while (last_node->next)
{
last_node->data = NULL;
last_node = last_node->next;
}
last_node->data = NULL;
#else /* !ENABLE_GC_FRIENDLY */
list->data = list->next;
#endif /* ENABLE_GC_FRIENDLY */
G_LOCK (current_allocator);
last_node->next = current_allocator->free_lists;
current_allocator->free_lists = list;
G_UNLOCK (current_allocator);
}
}
开发者ID:weimingtom,项目名称:tinygtk,代码行数:24,代码来源:gslist.c
示例3: g_hash_node_destroy
static void
g_hash_node_destroy (GHashNode *hash_node,
GDestroyNotify key_destroy_func,
GDestroyNotify value_destroy_func)
{
if (key_destroy_func)
key_destroy_func (hash_node->key);
if (value_destroy_func)
value_destroy_func (hash_node->value);
#ifdef ENABLE_GC_FRIENDLY
hash_node->key = NULL;
hash_node->value = NULL;
#endif /* ENABLE_GC_FRIENDLY */
#ifdef DISABLE_MEM_POOLS
g_free (hash_node);
#else
G_LOCK (g_hash_global);
hash_node->next = node_free_list;
node_free_list = hash_node;
G_UNLOCK (g_hash_global);
#endif
}
开发者ID:cpady,项目名称:ndas4linux,代码行数:24,代码来源:xhash.c
示例4: balde_app_add_url_rule
BALDE_API void
balde_app_add_url_rule(balde_app_t *app, const gchar *endpoint, const gchar *rule,
const balde_http_method_t method, balde_view_func_t view_func)
{
BALDE_APP_READ_ONLY(app);
GError *tmp_error = NULL;
balde_view_t *view = g_new(balde_view_t, 1);
view->url_rule = g_new(balde_url_rule_t, 1);
view->url_rule->endpoint = endpoint;
view->url_rule->rule = rule;
view->url_rule->match = balde_parse_url_rule(view->url_rule->rule, &tmp_error);
if (tmp_error != NULL) {
g_propagate_error(&(app->error), tmp_error);
balde_app_free_views(view);
return;
}
view->url_rule->method = method | BALDE_HTTP_OPTIONS;
if (view->url_rule->method & BALDE_HTTP_GET)
view->url_rule->method |= BALDE_HTTP_HEAD;
view->view_func = view_func;
G_LOCK(views);
app->priv->views = g_slist_append(app->priv->views, view);
G_UNLOCK(views);
}
开发者ID:GnLWeB,项目名称:balde,代码行数:24,代码来源:app.c
示例5: g_io_scheduler_cancel_all_jobs
/**
* g_io_scheduler_cancel_all_jobs:
*
* Cancels all cancellable I/O jobs.
*
* A job is cancellable if a #GCancellable was passed into
* g_io_scheduler_push_job().
**/
void
g_io_scheduler_cancel_all_jobs (void)
{
GSList *cancellable_list, *l;
G_LOCK (active_jobs);
cancellable_list = NULL;
for (l = active_jobs; l != NULL; l = l->next)
{
GIOSchedulerJob *job = l->data;
if (job->cancellable)
cancellable_list = g_slist_prepend (cancellable_list,
g_object_ref (job->cancellable));
}
G_UNLOCK (active_jobs);
for (l = cancellable_list; l != NULL; l = l->next)
{
GCancellable *c = l->data;
g_cancellable_cancel (c);
g_object_unref (c);
}
g_slist_free (cancellable_list);
}
开发者ID:BreakawayConsulting,项目名称:glib,代码行数:32,代码来源:gioscheduler.c
示例6: g_io_scheduler_push_job
/**
* g_io_scheduler_push_job:
* @job_func: a #GIOSchedulerJobFunc.
* @user_data: data to pass to @job_func
* @notify: (allow-none): a #GDestroyNotify for @user_data, or %NULL
* @io_priority: the [I/O priority][io-priority]
* of the request.
* @cancellable: optional #GCancellable object, %NULL to ignore.
*
* Schedules the I/O job to run in another thread.
*
* @notify will be called on @user_data after @job_func has returned,
* regardless whether the job was cancelled or has run to completion.
*
* If @cancellable is not %NULL, it can be used to cancel the I/O job
* by calling g_cancellable_cancel() or by calling
* g_io_scheduler_cancel_all_jobs().
*
* Deprecated: use #GThreadPool or g_task_run_in_thread()
**/
void
g_io_scheduler_push_job (GIOSchedulerJobFunc job_func,
gpointer user_data,
GDestroyNotify notify,
gint io_priority,
GCancellable *cancellable)
{
GIOSchedulerJob *job;
GTask *task;
g_return_if_fail (job_func != NULL);
job = g_slice_new0 (GIOSchedulerJob);
job->job_func = job_func;
job->data = user_data;
job->destroy_notify = notify;
if (cancellable)
job->cancellable = g_object_ref (cancellable);
job->context = g_main_context_ref_thread_default ();
G_LOCK (active_jobs);
active_jobs = g_list_prepend (active_jobs, job);
job->active_link = active_jobs;
G_UNLOCK (active_jobs);
task = g_task_new (NULL, cancellable, NULL, NULL);
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
g_task_set_source_tag (task, g_io_scheduler_push_job);
G_GNUC_END_IGNORE_DEPRECATIONS
g_task_set_task_data (task, job, (GDestroyNotify)g_io_job_free);
g_task_set_priority (task, io_priority);
g_task_run_in_thread (task, io_job_thread);
g_object_unref (task);
}
开发者ID:Leon555,项目名称:glib,代码行数:56,代码来源:gioscheduler.c
示例7: gst_object_set_name_default
static gboolean
gst_object_set_name_default (GstObject * object)
{
const gchar *type_name;
gint count;
gchar *name, *tmp;
gboolean result;
GQuark q;
/* to ensure guaranteed uniqueness across threads, only one thread
* may ever assign a name */
G_LOCK (object_name_mutex);
if (!object_name_counts) {
g_datalist_init (&object_name_counts);
}
q = g_type_qname (G_OBJECT_TYPE (object));
count = GPOINTER_TO_INT (g_datalist_id_get_data (&object_name_counts, q));
g_datalist_id_set_data (&object_name_counts, q, GINT_TO_POINTER (count + 1));
G_UNLOCK (object_name_mutex);
/* GstFooSink -> foosinkN */
type_name = g_quark_to_string (q);
if (strncmp (type_name, "Gst", 3) == 0)
type_name += 3;
tmp = g_strdup_printf ("%s%d", type_name, count);
name = g_ascii_strdown (tmp, -1);
g_free (tmp);
result = gst_object_set_name (object, name);
g_free (name);
return result;
}
开发者ID:WangCrystal,项目名称:gstreamer,代码行数:36,代码来源:gstobject.c
示例8: context_rule_removed
static void
context_rule_removed (ERuleContext *ctx,
EFilterRule *rule)
{
gpointer key, folder = NULL;
d(printf("rule removed; %s\n", rule->name));
/* TODO: remove from folder info cache? */
G_LOCK (vfolder);
if (g_hash_table_lookup_extended (vfolder_hash, rule->name, &key, &folder)) {
g_hash_table_remove (vfolder_hash, key);
g_free (key);
}
G_UNLOCK (vfolder);
/* FIXME Not passing a GCancellable or GError. */
camel_store_delete_folder_sync (
vfolder_store, rule->name, NULL, NULL);
/* this must be unref'd after its deleted */
if (folder)
g_object_unref ((CamelFolder *) folder);
}
开发者ID:jdapena,项目名称:evolution,代码行数:24,代码来源:mail-vfolder.c
示例9: sendrecv_answerer_fakesink_hand_off
static void
sendrecv_answerer_fakesink_hand_off (GstElement * fakesink, GstBuffer * buf,
GstPad * pad, gpointer data)
{
HandOffData *hod = (HandOffData *) data;
GstElement *pipeline;
check_caps (pad, hod);
pipeline = GST_ELEMENT (gst_element_get_parent (fakesink));
G_LOCK (check_receive_lock);
if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (pipeline),
OFFERER_RECEIVES_AUDIO))) {
g_object_set (G_OBJECT (fakesink), "signal-handoffs", FALSE, NULL);
g_idle_add (quit_main_loop_idle, hod->loop);
} else {
g_object_set_data (G_OBJECT (pipeline), ANSWERER_RECEIVES_AUDIO,
GINT_TO_POINTER (TRUE));
}
G_UNLOCK (check_receive_lock);
g_object_unref (pipeline);
}
开发者ID:TribeMedia,项目名称:kms-elements,代码行数:24,代码来源:rtpendpoint_audio.c
示例10: g_datalist_id_set_data_full
/**
* g_datalist_remove_data:
* @dl: a datalist.
* @k: the string identifying the data element.
*
* Removes an element using its string identifier. The data element's
* destroy function is called if it has been set.
**/
void
g_datalist_id_set_data_full (GData **datalist,
GQuark key_id,
gpointer data,
GDestroyNotify destroy_func)
{
g_return_if_fail (datalist != NULL);
if (!data)
g_return_if_fail (destroy_func == NULL);
if (!key_id)
{
if (data)
g_return_if_fail (key_id > 0);
else
return;
}
G_LOCK (g_dataset_global);
if (!g_dataset_location_ht)
g_data_initialize ();
g_data_set_internal (datalist, key_id, data, destroy_func, NULL);
G_UNLOCK (g_dataset_global);
}
开发者ID:Tkkg1994,项目名称:Platfrom-kccat6,代码行数:32,代码来源:gdataset.c
示例11: fen_init
/**
* fen_init:
*
* FEN subsystem initializing.
*/
gboolean
fen_init ()
{
static gboolean initialized = FALSE;
static gboolean result = FALSE;
G_LOCK (fen_lock);
if (initialized) {
G_UNLOCK (fen_lock);
return result;
}
result = node_class_init();
if (!result) {
G_UNLOCK (fen_lock);
return result;
}
initialized = TRUE;
G_UNLOCK (fen_lock);
return result;
}
开发者ID:nikolatesla,项目名称:BitchXMPP,代码行数:29,代码来源:fen-helper.c
示例12: remove_client
static void
remove_client (Client * client)
{
g_print ("Removing connection %s\n", client->name);
g_free (client->name);
if (client->isource) {
g_source_destroy (client->isource);
g_source_unref (client->isource);
}
if (client->tosource) {
g_source_destroy (client->tosource);
g_source_unref (client->tosource);
}
g_object_unref (client->connection);
g_byte_array_unref (client->current_message);
G_LOCK (clients);
clients = g_list_remove (clients, client);
G_UNLOCK (clients);
g_slice_free (Client, client);
}
开发者ID:fithisux,项目名称:ipromotion-remote-renderer,代码行数:24,代码来源:RendStreamer.cpp
示例13: pka_manager_find_plugin
/**
* pka_manager_find_plugin:
* @context: A #PkaContext.
* @plugin_id: The plugin identifier.
* @plugin: A location for a #PkaPlugin.
* @error: A location for a #GError, or %NULL.
*
* Finds the plugin matching the requested @plugin_id. If the context
* does not have permissions, this operation will fail.
*
* If successful, the plugin instance is stored in @plugin. The caller
* owns a reference to this plugin and should free it with g_object_unref().
*
* Returns: %TRUE if successful; otherwise %FALSE.
* Side effects: None.
*/
gboolean
pka_manager_find_plugin (PkaContext *context, /* IN */
const gchar *plugin_id, /* IN */
PkaPlugin **plugin, /* OUT */
GError **error) /* OUT */
{
PkaPlugin *iter;
gint i;
g_return_val_if_fail(context != NULL, FALSE);
g_return_val_if_fail(plugin != NULL, FALSE);
ENTRY;
*plugin = NULL;
if (!plugin_id) {
GOTO(failed);
}
G_LOCK(plugins);
for (i = 0; i < manager.plugins->len; i++) {
iter = g_ptr_array_index(manager.plugins, i);
if (g_str_equal(pka_plugin_get_id(iter), plugin_id)) {
/*
* TODO: Verify permissions.
*/
*plugin = g_object_ref(iter);
BREAK;
}
}
G_UNLOCK(plugins);
failed:
if (!*plugin) {
g_set_error(error, PKA_PLUGIN_ERROR, PKA_PLUGIN_ERROR_INVALID_TYPE,
"The specified plugin could not be found.");
}
RETURN(*plugin != NULL);
}
开发者ID:stieg,项目名称:perfkit,代码行数:52,代码来源:pka-manager.c
示例14: pad_added_cb
static void
pad_added_cb (GstElement * element, GstPad * pad, gpointer data)
{
GstElement *pipeline = GST_ELEMENT (data);
GstElement *wavenc, *sink;
GstPadLinkReturn ret;
GstPad *sinkpad;
gchar *msg;
if (gst_pad_get_direction (pad) != GST_PAD_SRC)
return;
wavenc = gst_element_factory_make ("wavenc", NULL);
#ifdef MANUAL_CHECK
{
gchar *filename;
G_LOCK (mutex);
filename = g_strdup_printf ("file_%u.wv", id++);
GST_DEBUG ("Creating file %s", filename);
G_UNLOCK (mutex);
sink = gst_element_factory_make ("filesink", NULL);
g_object_set (G_OBJECT (sink), "location", filename, NULL);
g_free (filename);
}
#else
{
sink = gst_element_factory_make ("fakesink", NULL);
}
#endif
g_object_set (G_OBJECT (sink), "sync", FALSE, "async", FALSE, NULL);
gst_bin_add_many (GST_BIN (pipeline), wavenc, sink, NULL);
sinkpad = gst_element_get_static_pad (wavenc, "sink");
if ((ret = gst_pad_link (pad, sinkpad)) != GST_PAD_LINK_OK) {
msg = g_strdup_printf ("Can not link pads (%d)", ret);
gst_object_unref (sinkpad);
goto failed;
}
gst_object_unref (sinkpad);
if (!gst_element_link (wavenc, sink)) {
msg = g_strdup_printf ("Can not link elements");
goto failed;
}
sinkpad = gst_element_get_static_pad (sink, "sink");
gst_pad_add_probe (sinkpad, GST_PAD_PROBE_TYPE_BUFFER, buffer_probe_cb, NULL,
NULL);
gst_object_unref (sinkpad);
gst_element_sync_state_with_parent (wavenc);
gst_element_sync_state_with_parent (sink);
G_LOCK (hash_mutex);
g_hash_table_insert (hash, GST_OBJECT_NAME (pad), wavenc);
G_UNLOCK (hash_mutex);
return;
failed:
gst_element_set_state (wavenc, GST_STATE_NULL);
gst_element_set_state (sink, GST_STATE_NULL);
gst_bin_remove_many (GST_BIN (pipeline), wavenc, sink, NULL);
GST_ERROR ("Error %s", msg);
fail (msg);
g_free (msg);
g_idle_add ((GSourceFunc) quit_main_loop, NULL);
}
开发者ID:rveejay,项目名称:kms-core,代码行数:77,代码来源:audiomixer.c
示例15: g_data_set_internal
/* HOLDS: g_dataset_global_lock */
static inline gpointer
g_data_set_internal (GData **datalist,
GQuark key_id,
gpointer data,
GDestroyNotify destroy_func,
GDataset *dataset)
{
register GData *list;
list = G_DATALIST_GET_POINTER (datalist);
if (!data)
{
register GData *prev;
prev = NULL;
while (list)
{
if (list->id == key_id)
{
gpointer ret_data = NULL;
if (prev)
prev->next = list->next;
else
{
G_DATALIST_SET_POINTER (datalist, list->next);
/* the dataset destruction *must* be done
* prior to invocation of the data destroy function
*/
if (!list->next && dataset)
g_dataset_destroy_internal (dataset);
}
/* the GData struct *must* already be unlinked
* when invoking the destroy function.
* we use (data==NULL && destroy_func!=NULL) as
* a special hint combination to "steal"
* data without destroy notification
*/
if (list->destroy_func && !destroy_func)
{
G_UNLOCK (g_dataset_global);
list->destroy_func (list->data);
G_LOCK (g_dataset_global);
}
else
ret_data = list->data;
g_slice_free (GData, list);
return ret_data;
}
prev = list;
list = list->next;
}
}
else
{
while (list)
{
if (list->id == key_id)
{
if (!list->destroy_func)
{
list->data = data;
list->destroy_func = destroy_func;
}
else
{
register GDestroyNotify dfunc;
register gpointer ddata;
dfunc = list->destroy_func;
ddata = list->data;
list->data = data;
list->destroy_func = destroy_func;
/* we need to have updated all structures prior to
* invocation of the destroy function
*/
G_UNLOCK (g_dataset_global);
dfunc (ddata);
G_LOCK (g_dataset_global);
}
return NULL;
}
list = list->next;
}
list = g_slice_new (GData);
list->next = G_DATALIST_GET_POINTER (datalist);
list->id = key_id;
list->data = data;
list->destroy_func = destroy_func;
G_DATALIST_SET_POINTER (datalist, list);
//.........这里部分代码省略.........
开发者ID:0xmono,项目名称:miranda-ng,代码行数:101,代码来源:gdataset.c
示例16: mate_vfs_resolve
//.........这里部分代码省略.........
if (retry && restart_resolve ()) {
retry = FALSE;
goto restart;
} else {
return mate_vfs_result_from_h_errno_val (h_errnop);
}
}
ret = resolvehandle_from_hostent (result, handle);
g_free (buf);
#elif HAVE_GETHOSTBYNAME_R_SOLARIS
size_t buflen;
char *buf;
int h_errnop;
restart:
buf = NULL;
buflen = INIT_BUFSIZE;
h_errnop = 0;
do {
buf = g_renew (char, buf, buflen);
result = gethostbyname_r (hostname,
&resbuf,
buf,
buflen,
&h_errnop);
buflen *= 2;
} while (h_errnop == ERANGE);
if (result == NULL) {
g_free (buf);
if (retry && restart_resolve ()) {
retry = FALSE;
goto restart;
} else {
return mate_vfs_result_from_h_errno_val (h_errnop);
}
}
ret = resolvehandle_from_hostent (result, handle);
g_free (buf);
#elif HAVE_GETHOSTBYNAME_R_HPUX
struct hostent_data buf;
restart:
res = gethostbyname_r (hostname, result, &buf);
if (res != 0) {
if (retry && restart_resolve ()) {
retry = FALSE;
goto restart;
} else {
return mate_vfs_result_from_h_errno_val (h_errnop);
}
}
ret = resolvehandle_from_hostent (result, handle);
#else /* !HAVE_GETHOSTBYNAME_R_GLIBC && !HAVE_GETHOSTBYNAME_R_SOLARIS && !HAVE_GETHOSTBYNAME_R_HPUX */
res = 0;/* only set to avoid unused variable error */
G_LOCK (dns_lock);
restart:
result = gethostbyname (hostname);
if (result == NULL) {
if (retry && restart_resolve ()) {
retry = FALSE;
goto restart;
} else {
#ifndef G_OS_WIN32
ret = mate_vfs_result_from_h_errno ();
#else
switch (WSAGetLastError ()) {
case WSAHOST_NOT_FOUND:
ret = MATE_VFS_ERROR_HOST_NOT_FOUND;
break;
case WSANO_DATA:
ret = MATE_VFS_ERROR_HOST_HAS_NO_ADDRESS;
break;
case WSATRY_AGAIN:
case WSANO_RECOVERY:
ret = MATE_VFS_ERROR_NAMESERVER;
default:
ret = MATE_VFS_ERROR_GENERIC;
}
#endif
}
} else {
ret = resolvehandle_from_hostent (result, handle);
}
G_UNLOCK (dns_lock);
#endif /* !HAVE_GETHOSTBYNAME_R_GLIBC && !HAVE_GETHOSTBYNAME_R_SOLARIS && !HAVE_GETHOSTBYNAME_R_HPUX */
return ret;
#endif /* HAVE_GETADDRINFO */
}
开发者ID:fatman2021,项目名称:mate-vfs,代码行数:101,代码来源:mate-vfs-resolve.c
示例17: resolve_sockaddr
void
resolve_sockaddr(gchar *result, gsize *result_len, GSockAddr *saddr, gboolean usedns, gboolean usefqdn, gboolean use_dns_cache, gboolean normalize_hostnames)
{
gchar *hname;
gboolean positive;
gchar *p, buf[256];
if (saddr && saddr->sa.sa_family != AF_UNIX)
{
if (saddr->sa.sa_family == AF_INET
#if ENABLE_IPV6
|| saddr->sa.sa_family == AF_INET6
#endif
)
{
void *addr;
socklen_t addr_len G_GNUC_UNUSED;
if (saddr->sa.sa_family == AF_INET)
{
addr = &((struct sockaddr_in *) &saddr->sa)->sin_addr;
addr_len = sizeof(struct in_addr);
}
#if ENABLE_IPV6
else
{
addr = &((struct sockaddr_in6 *) &saddr->sa)->sin6_addr;
addr_len = sizeof(struct in6_addr);
}
#endif
hname = NULL;
if (usedns)
{
if ((!use_dns_cache || !dns_cache_lookup(saddr->sa.sa_family, addr, (const gchar **) &hname, &positive)) && usedns != 2)
{
#ifdef HAVE_GETNAMEINFO
if (getnameinfo(&saddr->sa, saddr->salen, buf, sizeof(buf), NULL, 0, 0) == 0)
hname = buf;
#else
struct hostent *hp;
G_LOCK(resolv_lock);
hp = gethostbyaddr(addr, addr_len, saddr->sa.sa_family);
G_UNLOCK(resolv_lock);
hname = (hp && hp->h_name) ? hp->h_name : NULL;
#endif
if (hname)
positive = TRUE;
if (use_dns_cache && hname)
{
/* resolution success, store this as a positive match in the cache */
dns_cache_store(FALSE, saddr->sa.sa_family, addr, hname, TRUE);
}
}
}
if (!hname)
{
inet_ntop(saddr->sa.sa_family, addr, buf, sizeof(buf));
hname = buf;
if (use_dns_cache)
dns_cache_store(FALSE, saddr->sa.sa_family, addr, hname, FALSE);
}
else
{
if (!usefqdn && positive)
{
/* we only truncate hostnames if they were positive
* matches (e.g. real hostnames and not IP
* addresses) */
p = strchr(hname, '.');
if (p)
{
if (p - hname > sizeof(buf))
p = &hname[sizeof(buf)] - 1;
memcpy(buf, hname, p - hname);
buf[p - hname] = 0;
hname = buf;
}
}
}
}
else
{
g_assert_not_reached();
}
}
else
{
if (!local_hostname_fqdn[0])
reset_cached_hostname();
if (usefqdn)
{
/* avoid copy */
hname = local_hostname_fqdn;
//.........这里部分代码省略.........
开发者ID:balabit,项目名称:syslog-ng-3.3,代码行数:101,代码来源:misc.c
示例18: resolve_hostname
gboolean
resolve_hostname(GSockAddr **addr, gchar *name)
{
if (addr)
{
#if HAVE_GETADDRINFO
struct addrinfo hints;
struct addrinfo *res;
memset(&hints, 0, sizeof(hints));
hints.ai_family = (*addr)->sa.sa_family;
hints.ai_socktype = 0;
hints.ai_protocol = 0;
if (getaddrinfo(name, NULL, &hints, &res) == 0)
{
/* we only use the first entry in the returned list */
switch ((*addr)->sa.sa_family)
{
case AF_INET:
g_sockaddr_inet_set_address((*addr), ((struct sockaddr_in *) res->ai_addr)->sin_addr);
break;
#if ENABLE_IPV6
case AF_INET6:
{
guint16 port;
/* we need to copy the whole sockaddr_in6 structure as it
* might contain scope and other required data */
port = g_sockaddr_inet6_get_port(*addr);
*g_sockaddr_inet6_get_sa(*addr) = *((struct sockaddr_in6 *) res->ai_addr);
/* we need to restore the port number as it is zeroed out by the previous assignment */
g_sockaddr_inet6_set_port(*addr, port);
break;
}
#endif
default:
g_assert_not_reached();
break;
}
freeaddrinfo(res);
}
else
{
msg_error("Error resolving hostname", evt_tag_str("host", name), NULL);
return FALSE;
}
#else
struct hostent *he;
G_LOCK(resolv_lock);
he = gethostbyname(name);
if (he)
{
switch ((*addr)->sa.sa_family)
{
case AF_INET:
g_sockaddr_inet_set_address((*addr), *(struct in_addr *) he->h_addr);
break;
default:
g_assert_not_reached();
break;
}
G_UNLOCK(resolv_lock);
}
else
{
G_UNLOCK(resolv_lock);
msg_error("Error resolving hostname", evt_tag_str("host", name), NULL);
return FALSE;
}
#endif
}
return TRUE;
}
开发者ID:balabit,项目名称:syslog-ng-3.3,代码行数:76,代码来源:misc.c
示例19: camel_gethostbyaddr_r
static int
camel_gethostbyaddr_r (const char *addr, int addrlen, int type, struct hostent *host,
char *buf, size_t buflen, int *herr)
{
#ifdef ENABLE_IPv6
int retval, len;
if ((retval = getnameinfo (addr, addrlen, buf, buflen, NULL, 0, NI_NAMEREQD)) != 0) {
*herr = ai_to_herr (retval);
return -1;
}
len = ALIGN (strlen (buf) + 1);
if (buflen < IPv6_BUFLEN_MIN + len + addrlen + sizeof (char *))
return ERANGE;
/* h_name */
host->h_name = buf;
buf += len;
/* h_aliases */
((char **) buf)[0] = NULL;
host->h_aliases = (char **) buf;
buf += sizeof (char *);
/* h_addrtype and h_length */
host->h_length = addrlen;
host->h_addrtype = type;
memcpy (buf, addr, host->h_length);
addr = buf;
buf += ALIGN (host->h_length);
/* h_addr_list */
((char **) buf)[0] = addr;
((char **) buf)[1] = NULL;
host->h_addr_list = (char **) buf;
return 0;
#else /* No support for IPv6 addresses */
#ifdef HAVE_GETHOSTBYADDR_R
#ifdef GETHOSTBYADDR_R_SEVEN_ARGS
if (gethostbyaddr_r (addr, addrlen, type, host, buf, buflen, herr))
return 0;
else
return errno;
#else
struct hostent *hp;
int retval;
retval = gethostbyaddr_r (addr, addrlen, type, host, buf, buflen, &hp, herr);
if (hp != NULL) {
*herr = 0;
retval = 0;
} else if (retval == 0) {
/* glibc 2.3.2 workaround - it seems that
* gethostbyaddr_r will sometimes return 0 on fail and
* fill @host with garbage strings from /etc/hosts
* (failure to parse the file? who knows). Luckily, it
* seems that we can rely on @hp being NULL on
* fail.
*/
retval = -1;
}
return retval;
#endif
#else /* No support for gethostbyaddr_r */
struct hostent *h;
G_LOCK (gethost_mutex);
h = gethostbyaddr (addr, addrlen, type);
if (!h) {
*herr = h_errno;
G_UNLOCK (gethost_mutex);
return -1;
}
GETHOST_PROCESS (h, host, buf, buflen, herr);
G_UNLOCK (gethost_mutex);
return 0;
#endif /* HAVE_GETHOSTBYADDR_R */
#endif /* ENABLE_IPv6 */
}
开发者ID:nobled,项目名称:evolution-data-server.svn-import,代码行数:88,代码来源:camel-net-utils.c
示例20: camel_gethostbyname_r
static int
camel_gethostbyname_r (const char *name, struct hostent *host,
char *buf, size_t buflen, int *herr)
{
#ifdef ENABLE_IPv6
struct addrinfo hints, *res;
int retval, len;
char *addr;
memset (&hints, 0, sizeof (struct addrinfo));
#ifdef HAVE_AI_ADDRCONFIG
hints.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
#else
hints.ai_flags = AI_CANONNAME;
#endif
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
if ((retval = getaddrinfo (name, NULL, &hints, &res)) != 0) {
*herr = ai_to_herr (retval);
return -1;
}
len = ALIGN (strlen (res->ai_canonname) + 1);
if (buflen < IPv6_BUFLEN_MIN + len + res->ai_addrlen + sizeof (char *))
return ERANGE;
/* h_name */
strcpy (buf, res->ai_canonname);
host->h_name = buf;
buf += len;
/* h_aliases */
((char **) buf)[0] = NULL;
host->h_aliases = (char **) buf;
buf += sizeof (char *);
/* h_addrtype and h_length */
host->h_length = res->ai_addrlen;
if (res->ai_family == PF_INET6) {
host->h_addrtype = AF_INET6;
addr = (char *) &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr;
} else {
host->h_addrtype = AF_INET;
addr = (char *) &((struct sockaddr_in *) res->ai_addr)->sin_addr;
}
memcpy (buf, addr, host->h_length);
addr = buf;
buf += ALIGN (host->h_length);
/* h_addr_list */
((char **) buf)[0] = addr;
((char **) buf)[1] = NULL;
host->h_addr_list = (char **) buf;
freeaddrinfo (res);
return 0;
#else /* No support for IPv6 addresses */
#ifdef HAVE_GETHOSTBYNAME_R
#ifdef GETHOSTBYNAME_R_FIVE_ARGS
if (gethostbyname_r (name, host, buf, buflen, herr))
return 0;
else
return errno;
#else
struct hostent *hp;
int retval;
retval = gethostbyname_r (name, host, buf, buflen, &hp, herr);
if (hp != NULL) {
*herr = 0;
} else if (retval == 0) {
/* glibc 2.3.2 workaround - it seems that
* gethostbyname_r will sometimes return 0 on fail and
* not set the hostent values (hence the crash in bug
* #56337). Hopefully we can depend on @hp being NULL
* in this error case like we do with
* gethostbyaddr_r().
*/
retval = -1;
}
return retval;
#endif
#else /* No support for gethostbyname_r */
struct hostent *h;
G_LOCK (gethost_mutex);
h = gethostbyname (name);
if (!h) {
*herr = h_errno;
G_UNLOCK (gethost_mutex);
return -1;
//.........这里部分代码省略.........
开发者ID:nobled,项目名称:evolution-data-server.svn-import,代码行数:101,代码来源:camel-net-utils.c
注:本文中的G_LOCK函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论