summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/util.c23
-rw-r--r--src/util.h1
2 files changed, 24 insertions, 0 deletions
diff --git a/src/util.c b/src/util.c
index ed0991a68b..8f70c0f28a 100644
--- a/src/util.c
+++ b/src/util.c
@@ -241,6 +241,29 @@ int parse_boolean(const char *v) {
return -EINVAL;
}
+int parse_pid(const char *s, pid_t* ret_pid) {
+ unsigned long ul;
+ pid_t pid;
+ int r;
+
+ assert(s);
+ assert(ret_pid);
+
+ if ((r = safe_atolu(s, &ul)) < 0)
+ return r;
+
+ pid = (pid_t) ul;
+
+ if ((unsigned long) pid != ul)
+ return -ERANGE;
+
+ if (pid <= 0)
+ return -ERANGE;
+
+ *ret_pid = pid;
+ return 0;
+}
+
int safe_atou(const char *s, unsigned *ret_u) {
char *x = NULL;
unsigned long l;
diff --git a/src/util.h b/src/util.h
index 1e5ee28eba..1ca8f90cf1 100644
--- a/src/util.h
+++ b/src/util.h
@@ -108,6 +108,7 @@ void close_many(const int fds[], unsigned n_fd);
int parse_boolean(const char *v);
int parse_usec(const char *t, usec_t *usec);
+int parse_pid(const char *s, pid_t* ret_pid);
int safe_atou(const char *s, unsigned *ret_u);
int safe_atoi(const char *s, int *ret_i);