- char *argv[MAX_PROBE_ARGS + 2]; /* Event + probe + args */
- int argc, i;
- struct probe_point *pp = &session.probes[session.nr_probe];
-
- pr_debug("probe-definition(%d): %s\n", session.nr_probe, str);
- if (++session.nr_probe == MAX_PROBES)
- semantic_error("Too many probes");
-
- /* Separate arguments, similar to argv_split */
- argc = 0;
- do {
- /* Skip separators */
- while (isspace(*str))
- str++;
-
- /* Add an argument */
- if (*str != '\0') {
- const char *s = str;
-
- /* Skip the argument */
- while (!isspace(*str) && *str != '\0')
- str++;
-
- /* Duplicate the argument */
- argv[argc] = strndup(s, str - s);
- if (argv[argc] == NULL)
- die("strndup");
- if (++argc == MAX_PROBE_ARGS)
- semantic_error("Too many arguments");
- pr_debug("argv[%d]=%s\n", argc, argv[argc - 1]);
- }
- } while (*str != '\0');
- if (!argc)
- semantic_error("An empty argument.");
-
- /* Parse probe point */
- parse_probe_point(argv[0], pp);
- free(argv[0]);
- if (pp->file || pp->line)
- session.need_dwarf = 1;
-
- /* Copy arguments */
- pp->nr_args = argc - 1;
- if (pp->nr_args > 0) {
- pp->args = (char **)malloc(sizeof(char *) * pp->nr_args);
- if (!pp->args)
- die("malloc");
- memcpy(pp->args, &argv[1], sizeof(char *) * pp->nr_args);
- }
-
- /* Ensure return probe has no C argument */
- for (i = 0; i < pp->nr_args; i++)
- if (is_c_varname(pp->args[i])) {
- if (pp->retprobe)
- semantic_error("You can't specify local"
- " variable for kretprobe");
- session.need_dwarf = 1;
- }