libbpf: Add pathname_concat() helper
authorWang Yufen <wangyufen@huawei.com>
Thu, 22 Sep 2022 06:28:44 +0000 (14:28 +0800)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 23 Sep 2022 21:18:03 +0000 (14:18 -0700)
Move snprintf and len check to common helper pathname_concat() to make the
code simpler.

Signed-off-by: Wang Yufen <wangyufen@huawei.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/1663828124-10437-1-git-send-email-wangyufen@huawei.com
tools/lib/bpf/libbpf.c

index 67bc1850615023efce36817cec81f80b12b0a862..e691f08a297ff01243a54f8cfb09d3ef0eaf0004 100644 (file)
@@ -2097,19 +2097,30 @@ static bool get_map_field_int(const char *map_name, const struct btf *btf,
        return true;
 }
 
+static int pathname_concat(char *buf, size_t buf_sz, const char *path, const char *name)
+{
+       int len;
+
+       len = snprintf(buf, buf_sz, "%s/%s", path, name);
+       if (len < 0)
+               return -EINVAL;
+       if (len >= buf_sz)
+               return -ENAMETOOLONG;
+
+       return 0;
+}
+
 static int build_map_pin_path(struct bpf_map *map, const char *path)
 {
        char buf[PATH_MAX];
-       int len;
+       int err;
 
        if (!path)
                path = "/sys/fs/bpf";
 
-       len = snprintf(buf, PATH_MAX, "%s/%s", path, bpf_map__name(map));
-       if (len < 0)
-               return -EINVAL;
-       else if (len >= PATH_MAX)
-               return -ENAMETOOLONG;
+       err = pathname_concat(buf, sizeof(buf), path, bpf_map__name(map));
+       if (err)
+               return err;
 
        return bpf_map__set_pin_path(map, buf);
 }
@@ -7968,17 +7979,9 @@ int bpf_object__pin_maps(struct bpf_object *obj, const char *path)
                        continue;
 
                if (path) {
-                       int len;
-
-                       len = snprintf(buf, PATH_MAX, "%s/%s", path,
-                                      bpf_map__name(map));
-                       if (len < 0) {
-                               err = -EINVAL;
-                               goto err_unpin_maps;
-                       } else if (len >= PATH_MAX) {
-                               err = -ENAMETOOLONG;
+                       err = pathname_concat(buf, sizeof(buf), path, bpf_map__name(map));
+                       if (err)
                                goto err_unpin_maps;
-                       }
                        sanitize_pin_path(buf);
                        pin_path = buf;
                } else if (!map->pin_path) {
@@ -8016,14 +8019,9 @@ int bpf_object__unpin_maps(struct bpf_object *obj, const char *path)
                char buf[PATH_MAX];
 
                if (path) {
-                       int len;
-
-                       len = snprintf(buf, PATH_MAX, "%s/%s", path,
-                                      bpf_map__name(map));
-                       if (len < 0)
-                               return libbpf_err(-EINVAL);
-                       else if (len >= PATH_MAX)
-                               return libbpf_err(-ENAMETOOLONG);
+                       err = pathname_concat(buf, sizeof(buf), path, bpf_map__name(map));
+                       if (err)
+                               return libbpf_err(err);
                        sanitize_pin_path(buf);
                        pin_path = buf;
                } else if (!map->pin_path) {
@@ -8041,6 +8039,7 @@ int bpf_object__unpin_maps(struct bpf_object *obj, const char *path)
 int bpf_object__pin_programs(struct bpf_object *obj, const char *path)
 {
        struct bpf_program *prog;
+       char buf[PATH_MAX];
        int err;
 
        if (!obj)
@@ -8052,17 +8051,9 @@ int bpf_object__pin_programs(struct bpf_object *obj, const char *path)
        }
 
        bpf_object__for_each_program(prog, obj) {
-               char buf[PATH_MAX];
-               int len;
-
-               len = snprintf(buf, PATH_MAX, "%s/%s", path, prog->name);
-               if (len < 0) {
-                       err = -EINVAL;
-                       goto err_unpin_programs;
-               } else if (len >= PATH_MAX) {
-                       err = -ENAMETOOLONG;
+               err = pathname_concat(buf, sizeof(buf), path, prog->name);
+               if (err)
                        goto err_unpin_programs;
-               }
 
                err = bpf_program__pin(prog, buf);
                if (err)
@@ -8073,13 +8064,7 @@ int bpf_object__pin_programs(struct bpf_object *obj, const char *path)
 
 err_unpin_programs:
        while ((prog = bpf_object__prev_program(obj, prog))) {
-               char buf[PATH_MAX];
-               int len;
-
-               len = snprintf(buf, PATH_MAX, "%s/%s", path, prog->name);
-               if (len < 0)
-                       continue;
-               else if (len >= PATH_MAX)
+               if (pathname_concat(buf, sizeof(buf), path, prog->name))
                        continue;
 
                bpf_program__unpin(prog, buf);
@@ -8098,13 +8083,10 @@ int bpf_object__unpin_programs(struct bpf_object *obj, const char *path)
 
        bpf_object__for_each_program(prog, obj) {
                char buf[PATH_MAX];
-               int len;
 
-               len = snprintf(buf, PATH_MAX, "%s/%s", path, prog->name);
-               if (len < 0)
-                       return libbpf_err(-EINVAL);
-               else if (len >= PATH_MAX)
-                       return libbpf_err(-ENAMETOOLONG);
+               err = pathname_concat(buf, sizeof(buf), path, prog->name);
+               if (err)
+                       return libbpf_err(err);
 
                err = bpf_program__unpin(prog, buf);
                if (err)