Add lttng-error.h containing every API err. code
[lttng-tools.git] / src / bin / lttng-sessiond / context.c
index 0144f78248ee8c908077be0ec3b2f9aa66add057..1bf3c67680ed9d1f568c5d8b2b6455fa9d33edff 100644 (file)
@@ -1,18 +1,18 @@
 /*
  * Copyright (C)  2011 - David Goulet <david.goulet@polymtl.ca>
  *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; only version 2 of the License.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2 only,
+ * as published by the Free Software Foundation.
  *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
- * Place - Suite 330, Boston, MA  02111-1307, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #define _GNU_SOURCE
@@ -78,13 +78,13 @@ static int add_kctx_all_channels(struct ltt_kernel_session *ksession,
                if (no_event) {
                        ret = kernel_add_channel_context(kchan, kctx);
                        if (ret < 0) {
-                               ret = LTTCOMM_KERN_CONTEXT_FAIL;
+                               ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
                                goto error;
                        }
                } else {
                        ret = add_kctx_to_event(kctx, kchan, event_name);
                        if (ret < 0) {
-                               ret = LTTCOMM_KERN_CONTEXT_FAIL;
+                               ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
                                goto error;
                        } else if (ret == 1) {
                                /* Event found and context added */
@@ -95,11 +95,11 @@ static int add_kctx_all_channels(struct ltt_kernel_session *ksession,
        }
 
        if (!found && !no_event) {
-               ret = LTTCOMM_NO_EVENT;
+               ret = LTTNG_ERR_NO_EVENT;
                goto error;
        }
 
-       ret = LTTCOMM_OK;
+       ret = LTTNG_OK;
 
 error:
        return ret;
@@ -125,13 +125,13 @@ static int add_kctx_to_channel(struct lttng_kernel_context *kctx,
        if (no_event) {
                ret = kernel_add_channel_context(kchan, kctx);
                if (ret < 0) {
-                       ret = LTTCOMM_KERN_CONTEXT_FAIL;
+                       ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
                        goto error;
                }
        } else {
                ret = add_kctx_to_event(kctx, kchan, event_name);
                if (ret < 0) {
-                       ret = LTTCOMM_KERN_CONTEXT_FAIL;
+                       ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
                        goto error;
                } else if (ret == 1) {
                        /* Event found and context added */
@@ -140,11 +140,11 @@ static int add_kctx_to_channel(struct lttng_kernel_context *kctx,
        }
 
        if (!found && !no_event) {
-               ret = LTTCOMM_NO_EVENT;
+               ret = LTTNG_ERR_NO_EVENT;
                goto error;
        }
 
-       ret = LTTCOMM_OK;
+       ret = LTTNG_OK;
 
 error:
        return ret;
@@ -158,11 +158,13 @@ static int add_uctx_to_channel(struct ltt_ust_session *usess, int domain,
 {
        int ret;
        struct ltt_ust_context *uctx;
+       struct lttng_ht_iter iter;
+       struct lttng_ht_node_ulong *uctx_node;
 
        /* Create ltt UST context */
        uctx = trace_ust_create_context(ctx);
        if (uctx == NULL) {
-               ret = LTTCOMM_FATAL;
+               ret = -EINVAL;
                goto error;
        }
 
@@ -174,14 +176,24 @@ static int add_uctx_to_channel(struct ltt_ust_session *usess, int domain,
                }
                break;
        default:
-               ret = LTTCOMM_NOT_IMPLEMENTED;
+               ret = -ENOSYS;
+               goto error;
+       }
+
+       /* Lookup context before adding it */
+       lttng_ht_lookup(uchan->ctx, (void *)((unsigned long)uctx->ctx.ctx), &iter);
+       uctx_node = lttng_ht_iter_get_node_ulong(&iter);
+       if (uctx_node != NULL) {
+               ret = -EEXIST;
                goto error;
        }
 
        /* Add ltt UST context node to ltt UST channel */
        lttng_ht_add_unique_ulong(uchan->ctx, &uctx->node);
 
-       return LTTCOMM_OK;
+       DBG("Context UST %d added to channel %s", uctx->ctx.ctx, uchan->name);
+
+       return 0;
 
 error:
        free(uctx);
@@ -197,11 +209,14 @@ static int add_uctx_to_event(struct ltt_ust_session *usess, int domain,
 {
        int ret;
        struct ltt_ust_context *uctx;
+       struct lttng_ht_iter iter;
+       struct lttng_ht_node_ulong *uctx_node;
 
        /* Create ltt UST context */
        uctx = trace_ust_create_context(ctx);
        if (uctx == NULL) {
-               ret = LTTCOMM_FATAL;
+               /* Context values are invalid. */
+               ret = -EINVAL;
                goto error;
        }
 
@@ -213,14 +228,24 @@ static int add_uctx_to_event(struct ltt_ust_session *usess, int domain,
                }
                break;
        default:
-               ret = LTTCOMM_NOT_IMPLEMENTED;
+               ret = -ENOSYS;
+               goto error;
+       }
+
+       /* Lookup context before adding it */
+       lttng_ht_lookup(uevent->ctx, (void *)((unsigned long)uctx->ctx.ctx), &iter);
+       uctx_node = lttng_ht_iter_get_node_ulong(&iter);
+       if (uctx_node != NULL) {
+               ret = -EEXIST;
                goto error;
        }
 
        /* Add ltt UST context node to ltt UST event */
        lttng_ht_add_unique_ulong(uevent->ctx, &uctx->node);
 
-       return LTTCOMM_OK;
+       DBG("Context UST %d added to event %s", uctx->ctx.ctx, uevent->attr.name);
+
+       return 0;
 
 error:
        free(uctx);
@@ -239,7 +264,44 @@ int context_kernel_add(struct ltt_kernel_session *ksession,
        struct lttng_kernel_context kctx;
 
        /* Setup kernel context structure */
-       kctx.ctx = ctx->ctx;
+       switch (ctx->ctx) {
+       case LTTNG_EVENT_CONTEXT_PID:
+               kctx.ctx = LTTNG_KERNEL_CONTEXT_PID;
+               break;
+       case LTTNG_EVENT_CONTEXT_PERF_COUNTER:
+               kctx.ctx = LTTNG_KERNEL_CONTEXT_PERF_COUNTER;
+               break;
+       case LTTNG_EVENT_CONTEXT_PROCNAME:
+               kctx.ctx = LTTNG_KERNEL_CONTEXT_PROCNAME;
+               break;
+       case LTTNG_EVENT_CONTEXT_PRIO:
+               kctx.ctx = LTTNG_KERNEL_CONTEXT_PRIO;
+               break;
+       case LTTNG_EVENT_CONTEXT_NICE:
+               kctx.ctx = LTTNG_KERNEL_CONTEXT_NICE;
+               break;
+       case LTTNG_EVENT_CONTEXT_VPID:
+               kctx.ctx = LTTNG_KERNEL_CONTEXT_VPID;
+               break;
+       case LTTNG_EVENT_CONTEXT_TID:
+               kctx.ctx = LTTNG_KERNEL_CONTEXT_TID;
+               break;
+       case LTTNG_EVENT_CONTEXT_VTID:
+               kctx.ctx = LTTNG_KERNEL_CONTEXT_VTID;
+               break;
+       case LTTNG_EVENT_CONTEXT_PPID:
+               kctx.ctx = LTTNG_KERNEL_CONTEXT_PPID;
+               break;
+       case LTTNG_EVENT_CONTEXT_VPPID:
+               kctx.ctx = LTTNG_KERNEL_CONTEXT_VPPID;
+               break;
+       case LTTNG_EVENT_CONTEXT_HOSTNAME:
+               kctx.ctx = LTTNG_KERNEL_CONTEXT_HOSTNAME;
+               break;
+       default:
+               return LTTNG_ERR_KERN_CONTEXT_FAIL;
+       }
+
        kctx.u.perf_counter.type = ctx->u.perf_counter.type;
        kctx.u.perf_counter.config = ctx->u.perf_counter.config;
        strncpy(kctx.u.perf_counter.name, ctx->u.perf_counter.name,
@@ -248,24 +310,24 @@ int context_kernel_add(struct ltt_kernel_session *ksession,
 
        if (strlen(channel_name) == 0) {
                ret = add_kctx_all_channels(ksession, &kctx, event_name);
-               if (ret != LTTCOMM_OK) {
+               if (ret != LTTNG_OK) {
                        goto error;
                }
        } else {
                /* Get kernel channel */
                kchan = trace_kernel_get_channel_by_name(channel_name, ksession);
                if (kchan == NULL) {
-                       ret = LTTCOMM_KERN_CHAN_NOT_FOUND;
+                       ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND;
                        goto error;
                }
 
                ret = add_kctx_to_channel(&kctx, kchan, event_name);
-               if (ret != LTTCOMM_OK) {
+               if (ret != LTTNG_OK) {
                        goto error;
                }
        }
 
-       ret = LTTCOMM_OK;
+       ret = LTTNG_OK;
 
 error:
        return ret;
@@ -278,8 +340,8 @@ int context_ust_add(struct ltt_ust_session *usess, int domain,
                struct lttng_event_context *ctx, char *event_name,
                char *channel_name)
 {
-       int ret = LTTCOMM_OK, have_event = 0;
-       struct lttng_ht_iter iter, uiter;
+       int ret = LTTNG_OK, have_event = 0;
+       struct lttng_ht_iter iter;
        struct lttng_ht *chan_ht;
        struct ltt_ust_channel *uchan = NULL;
        struct ltt_ust_event *uevent = NULL;
@@ -292,11 +354,13 @@ int context_ust_add(struct ltt_ust_session *usess, int domain,
        case LTTNG_DOMAIN_UST:
                chan_ht = usess->domain_global.channels;
                break;
+#if 0
        case LTTNG_DOMAIN_UST_EXEC_NAME:
        case LTTNG_DOMAIN_UST_PID:
        case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
+#endif
        default:
-               ret = LTTCOMM_NOT_IMPLEMENTED;
+               ret = LTTNG_ERR_UND;
                goto error;
        }
 
@@ -309,7 +373,7 @@ int context_ust_add(struct ltt_ust_session *usess, int domain,
        if (strlen(channel_name) != 0) {
                uchan = trace_ust_find_channel_by_name(chan_ht, channel_name);
                if (uchan == NULL) {
-                       ret = LTTCOMM_UST_CHAN_NOT_FOUND;
+                       ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
                        goto error;
                }
        }
@@ -318,7 +382,7 @@ int context_ust_add(struct ltt_ust_session *usess, int domain,
        if (uchan && have_event) {
                uevent = trace_ust_find_event_by_name(uchan->events, event_name);
                if (uevent == NULL) {
-                       ret = LTTCOMM_UST_EVENT_NOT_FOUND;
+                       ret = LTTNG_ERR_UST_EVENT_NOT_FOUND;
                        goto error;
                }
        }
@@ -343,42 +407,38 @@ int context_ust_add(struct ltt_ust_session *usess, int domain,
                                goto end;
                        }
                }
-               ret = LTTCOMM_UST_EVENT_NOT_FOUND;
+               ret = LTTNG_ERR_UST_EVENT_NOT_FOUND;
                goto error;
        } else if (!uchan && !have_event) {     /* Add ctx all events, all channels */
                /* For all channels */
                cds_lfht_for_each_entry(chan_ht->ht, &iter.iter, uchan, node.node) {
                        ret = add_uctx_to_channel(usess, domain, uchan, ctx);
                        if (ret < 0) {
-                               ERR("Context added to channel %s failed", uchan->name);
+                               ERR("Context failed for channel %s", uchan->name);
                                continue;
                        }
-
-                       /* For all events in channel */
-                       cds_lfht_for_each_entry(uchan->events->ht, &uiter.iter, uevent,
-                                       node.node) {
-                               ret = add_uctx_to_event(usess, domain, uchan, uevent, ctx);
-                               if (ret < 0) {
-                                       ERR("Context add to event %s in channel %s failed",
-                                                       uevent->attr.name, uchan->name);
-                                       continue;
-                               }
-                       }
                }
        }
 
 end:
        switch (ret) {
        case -EEXIST:
-               ret = LTTCOMM_UST_CONTEXT_EXIST;
-               goto error;
+               ret = LTTNG_ERR_UST_CONTEXT_EXIST;
+               break;
        case -ENOMEM:
-               ret = LTTCOMM_FATAL;
-               goto error;
+               ret = LTTNG_ERR_FATAL;
+               break;
+       case -EINVAL:
+               ret = LTTNG_ERR_UST_CONTEXT_INVAL;
+               break;
+       case -ENOSYS:
+               ret = LTTNG_ERR_UNKNOWN_DOMAIN;
+               break;
+       default:
+               ret = LTTNG_OK;
+               break;
        }
 
-       return LTTCOMM_OK;
-
 error:
        return ret;
 }
This page took 0.029031 seconds and 4 git commands to generate.