return err;
 }
 
-int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32))
+int do_pin_any(int argc, char **argv, int (*get_fd)(int *, char ***))
 {
-       unsigned int id;
-       char *endptr;
        int err;
        int fd;
 
-       if (argc < 3) {
-               p_err("too few arguments, id ID and FILE path is required");
-               return -1;
-       } else if (argc > 3) {
-               p_err("too many arguments");
-               return -1;
-       }
-
-       if (!is_prefix(*argv, "id")) {
-               p_err("expected 'id' got %s", *argv);
-               return -1;
-       }
-       NEXT_ARG();
-
-       id = strtoul(*argv, &endptr, 0);
-       if (*endptr) {
-               p_err("can't parse %s as ID", *argv);
-               return -1;
-       }
-       NEXT_ARG();
-
-       fd = get_fd_by_id(id);
-       if (fd < 0) {
-               p_err("can't open object by id (%u): %s", id, strerror(errno));
-               return -1;
-       }
+       fd = get_fd(&argc, &argv);
+       if (fd < 0)
+               return fd;
 
        err = do_pin_fd(fd, *argv);
 
 
 int open_obj_pinned(char *path, bool quiet);
 int open_obj_pinned_any(char *path, enum bpf_obj_type exp_type);
 int mount_bpffs_for_pin(const char *name);
-int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32));
+int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(int *, char ***));
 int do_pin_fd(int fd, const char *name);
 
 int do_prog(int argc, char **arg);
 
 {
        int err;
 
-       err = do_pin_any(argc, argv, bpf_map_get_fd_by_id);
+       err = do_pin_any(argc, argv, map_parse_fd);
        if (!err && json_output)
                jsonw_null(json_wtr);
        return err;
 
 {
        int err;
 
-       err = do_pin_any(argc, argv, bpf_prog_get_fd_by_id);
+       err = do_pin_any(argc, argv, prog_parse_fd);
        if (!err && json_output)
                jsonw_null(json_wtr);
        return err;