--- /dev/null
+#include <ccan/cdump/cdump_parse.h>
+#include <ccan/talloc/talloc.h>
+#include <ccan/grab_file/grab_file.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <err.h>
+
+int main(int argc, char *argv[])
+{
+ unsigned int i;
+ int declfd, deffd;
+ char *defs, *decls;
+
+ if (argc < 4)
+ errx(1, "Usage: %s <declfile> <defsfile> <sourcefiles>...",
+ argv[0]);
+
+ declfd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 0600);
+ if (declfd < 0)
+ err(1, "Opening %s", argv[1]);
+ deffd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0600);
+ if (deffd < 0)
+ err(1, "Opening %s", argv[2]);
+
+ decls = (char *)"#ifndef OSERVER_CDUMP_DECLS_H\n"
+ "#define OSERVER_CDUMP_DECLS_H\n"
+ "/* Autogenerated by dump_headers. */\n"
+ "#include <ccan/cdump/cdump_internal.h>\n";
+ if (write(declfd, decls, strlen(decls)) != strlen(decls))
+ err(1, "Writing to %s", argv[1]);
+
+ defs = (char *)"/* Definitions: autogenerated by dump_headers */\n"
+ "#define CDUMP_FAKE 1\n"
+ "#include <ccan/oserver/oserver_types.h>\n"
+ "#include <ccan/oserver/oserver_cdump.h>\n"
+ "#include <stddef.h>\n";
+ if (write(deffd, defs, strlen(defs)) != strlen(defs))
+ err(1, "Writing to %s", argv[2]);
+
+ for (i = 3; i < argc; i++) {
+ char *errmsg, *code;
+
+ code = grab_file(NULL, argv[i], NULL);
+ if (!code)
+ err(1, "Reading %s", argv[i]);
+ errmsg = cdump_parse(code, code, &decls, &defs);
+ if (errmsg)
+ errx(1, "Parsing %s: %s", argv[1], errmsg);
+ if (write(declfd, decls, strlen(decls)) != strlen(decls))
+ err(1, "Writing to %s", argv[1]);
+ if (write(deffd, defs, strlen(defs)) != strlen(defs))
+ err(1, "Writing to %s", argv[2]);
+ talloc_free(code);
+ }
+
+ decls = (char *)"#endif /* OSERVER_CDUMP_DECLS_H */\n";
+ if (write(declfd, decls, strlen(decls)) != strlen(decls))
+ err(1, "Writing to %s", argv[1]);
+ close(declfd);
+ close(deffd);
+ return 0;
+}