#define MAX_N 5
int N; /* the number of fds this factory makes */
int EX_N; /* fds made optionally */
- void (*make)(const struct factory *, struct fdesc[], int, char **);
+ void *(*make)(const struct factory *, struct fdesc[], int, char **);
+ void (*free)(const struct factory *, void *);
const struct parameter * params;
};
close(fd);
}
-static void open_ro_regular_file(const struct factory *factory, struct fdesc fdescs[],
- int argc, char ** argv)
+static void *open_ro_regular_file(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
{
struct arg file = decode_arg("file", factory->params, argc, argv);
struct arg offset = decode_arg("offset", factory->params, argc, argv);
.close = close_fdesc,
.data = NULL
};
+
+ return NULL;
}
-static void make_pipe(const struct factory *factory, struct fdesc fdescs[],
- int argc, char ** argv)
+static void *make_pipe(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
{
int pd[2];
int nonblock_flags[2] = {0, 0};
};
}
}
+
+ return NULL;
}
static void close_dir(int fd, void *data)
close_fdesc(fd, NULL);
}
-static void open_directory(const struct factory *factory, struct fdesc fdescs[],
- int argc, char ** argv)
+static void *open_directory(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
{
struct arg dir = decode_arg("dir", factory->params, argc, argv);
struct arg dentries = decode_arg("dentries", factory->params, argc, argv);
.close = close_dir,
.data = dp
};
+
+ return NULL;
}
-static void open_rw_chrdev(const struct factory *factory, struct fdesc fdescs[],
- int argc, char ** argv)
+static void *open_rw_chrdev(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
{
struct arg chrdev = decode_arg("chrdev", factory->params, argc, argv);
int fd = open(ARG_STRING(chrdev), O_RDWR);
.close = close_fdesc,
.data = NULL
};
+
+ return NULL;
}
-static void make_socketpair(const struct factory *factory, struct fdesc fdescs[],
- int argc, char ** argv)
+static void *make_socketpair(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
{
int sd[2];
struct arg socktype = decode_arg("socktype", factory->params, argc, argv);
.data = NULL
};
}
+
+ return NULL;
}
-static void open_with_opath(const struct factory *factory, struct fdesc fdescs[],
- int argc, char ** argv)
+static void *open_with_opath(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
{
struct arg path = decode_arg("path", factory->params, argc, argv);
int fd = open(ARG_STRING(path), O_PATH|O_NOFOLLOW);
.close = close_fdesc,
.data = NULL
};
+
+ return NULL;
}
-static void open_ro_blkdev(const struct factory *factory, struct fdesc fdescs[],
+static void *open_ro_blkdev(const struct factory *factory, struct fdesc fdescs[],
int argc, char ** argv)
{
struct arg blkdev = decode_arg("blkdev", factory->params, argc, argv);
.close = close_fdesc,
.data = NULL,
};
+
+ return NULL;
}
static int make_packet_socket(int socktype, const char *interface)
close(fd);
}
-static void make_mmapped_packet_socket(const struct factory *factory, struct fdesc fdescs[],
- int argc, char ** argv)
+static void *make_mmapped_packet_socket(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
{
int sd;
struct arg socktype = decode_arg("socktype", factory->params, argc, argv);
.close = close_fdesc_after_munmap,
.data = munmap_data,
};
+
+ return NULL;
}
-static void make_pidfd(const struct factory *factory, struct fdesc fdescs[],
- int argc, char ** argv)
+static void *make_pidfd(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
{
struct arg target_pid = decode_arg("target-pid", factory->params, argc, argv);
pid_t pid = ARG_INTEGER(target_pid);
.close = close_fdesc,
.data = NULL
};
+
+ return NULL;
}
-static void make_inotify_fd(const struct factory *factory _U_, struct fdesc fdescs[],
- int argc _U_, char ** argv _U_)
+static void *make_inotify_fd(const struct factory *factory _U_, struct fdesc fdescs[],
+ int argc _U_, char ** argv _U_)
{
int fd = inotify_init();
if (fd < 0)
.close = close_fdesc,
.data = NULL
};
+
+ return NULL;
}
#define PARAM_END { .name = NULL, }
struct fdesc fdescs[MAX_N];
bool quiet = false;
bool cont = false;
+ void *data;
static const struct option longopts[] = {
{ "list", no_argument, NULL, 'l' },
}
optind += factory->N;
- factory->make(factory, fdescs, argc - optind, argv + optind);
+ data = factory->make(factory, fdescs, argc - optind, argv + optind);
signal(SIGCONT, do_nothing);
if (fdescs[i].fd >= 0)
fdescs[i].close(fdescs[i].fd, fdescs[i].data);
+ if (factory->free)
+ factory->free (factory, data);
+
exit(EXIT_SUCCESS);
}