import string import os struct_list = [ "timeval", "timezone", "timex", "tms", "timespec", "itimerval", "sigevent", "itimerspec", "sched_param", "kexec_segment", "rusage", "siginfo", "statfs", "statfs64", "stat", "ustat", "stat64", "io_event", "iocb", "utimbuf", "iovec", "linux_dirent", "linux_dirent64", "sockaddr", "msghdr", "mmsghdr", "pollfd", "sel_arg_struct", "epoll_event", "new_utsname", "rlimit", "rlimit64", "msgbuf", "msqid_ds", "sembuf", "shmid_ds", "mq_attr", "__sysctl_args", "robust_list_head", "getcpu_cache", "perf_event_attr", "mmap_arg_struct", "file_handle" ] head = "/***** Automatically generated by gen_recursive.c *********/\n\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\n#include \"struct_analyze.h\"\n#include \"syscall.h\"\n\nint nullfd = 0;\n\nvoid struct_recursive_analyze(void *arg_ptr, enum struct_argtype struct_argtype, xmlTextWriterPtr writer) {\n\nif(arg_ptr == NULL)\nreturn;\nif(nullfd == 0)\nnullfd = open(\"/dev/random\", O_WRONLY);\n\nswitch(struct_argtype) {\n" f = open("test.c", "w") f.write(head) for i in struct_list: f.write("struct " + i + " " + i + "_s;\n") f.write("struct " + i + " *" + i + "_t;\n\n") for i in struct_list: f.write("case STRUCT_ARG_" + i + ":\n") f.write("if(write(nullfd, (void *) arg_ptr, sizeof(" + i + "_s" +")) < 0) {\n") f.write("xmlTextWriterWriteElement(writer, \"STRUCT_" + i + "\", \"unmapped\");\n") f.write("return;\n }\n\n") f.write(i + "_p = (struct " + i + " *) arg_ptr;\n") f.write("xmlTextWriterStartElement(writer, \"STRUCT_" + i + "\");\n") f.write("xmlTextWriterWriteBase64(writer, (char *) " + i + "_p, 0, sizeof(" + i + "_s));\n") f.write("xmlTextWriterEndElement(writer);\n\n") f.write("break;\n\n") f.write("default:\nbreak;\n}\n}") f.close() .