bool find_process(const char *name) { size_t len = strlen(name); DIR *dir; struct dirent *d; int ret = -1; dir = opendir(procfs__mountpoint()); if (!dir) return false; /* Walk through the directory. */ while (ret && (d = readdir(dir)) != NULL) { char path[PATH_MAX]; char *data; size_t size; if ((d->d_type != DT_DIR) || !strcmp(".", d->d_name) || !strcmp("..", d->d_name)) continue; scnprintf(path, sizeof(path), "%s/%s/comm", procfs__mountpoint(), d->d_name); if (filename__read_str(path, &data, &size)) continue; ret = strncmp(name, data, len); free(data); } closedir(dir); return ret ? false : true; }
/* * Returns pointer with encoded error via <linux/err.h> interface. */ static struct event_format* tp_format(const char *sys, const char *name) { struct pevent *pevent = tevent.pevent; struct event_format *event = NULL; char path[PATH_MAX]; size_t size; char *data; int err; scnprintf(path, PATH_MAX, "%s/%s/%s/format", tracing_events_path, sys, name); err = filename__read_str(path, &data, &size); if (err) return ERR_PTR(err); pevent_parse_format(pevent, &event, data, size, sys); free(data); return event; }
static int get_comm(char **comm, pid_t pid) { char *path; size_t size; int err; if (asprintf(&path, "%s/%d/comm", procfs__mountpoint(), pid) == -1) return -ENOMEM; err = filename__read_str(path, comm, &size); if (!err) { /* * We're reading 16 bytes, while filename__read_str * allocates data per BUFSIZ bytes, so we can safely * mark the end of the string. */ (*comm)[size] = 0; rtrim(*comm); } free(path); return err; }