+/*
+ * parse_kprobe_addr
+ *
+ * Parse kprobe options.
+ */
+static int parse_kprobe_opts(struct lttng_event *ev, char *opt)
+{
+ int ret;
+ uint64_t hex;
+ char name[LTTNG_SYMBOL_NAME_LEN];
+
+ if (opt == NULL) {
+ ret = -1;
+ goto error;
+ }
+
+ /* Check for symbol+offset */
+ ret = sscanf(opt, "%[^'+']+%li", name, &hex);
+ if (ret == 2) {
+ strncpy(ev->attr.probe.symbol_name, name, LTTNG_SYMBOL_NAME_LEN);
+ DBG("kprobe symbol %s", ev->attr.probe.symbol_name);
+ if (hex == 0) {
+ ERR("Invalid kprobe offset %lu", hex);
+ ret = -1;
+ goto error;
+ }
+ ev->attr.probe.offset = hex;
+ DBG("kprobe offset %lu", ev->attr.probe.offset);
+ goto error;
+ }
+
+ /* Check for address */
+ ret = sscanf(opt, "%li", &hex);
+ if (ret > 0) {
+ if (hex == 0) {
+ ERR("Invalid kprobe address %lu", hex);
+ ret = -1;
+ goto error;
+ }
+ ev->attr.probe.addr = hex;
+ DBG("kprobe addr %lu", ev->attr.probe.addr);
+ goto error;
+ }
+
+ /* No match */
+ ret = -1;
+
+error:
+ return ret;
+}
+