void ioctl_tree_write(FILE * f, const ioctl_tree * tree) { int i; if (tree == NULL) return; /* write indent */ for (i = 0; i < tree->depth; ++i) fputc(' ', f); if (tree->id != tree->type->id) { long offset; offset = _IOC_NR(tree->id) - _IOC_NR(tree->type->id); assert(offset >= 0); assert(offset <= tree->type->nr_range); fprintf(f, "%s(%li) %i ", tree->type->name, offset, tree->ret); } else { fprintf(f, "%s %i ", tree->type->name, tree->ret); } tree->type->write(tree, f); assert(fputc('\n', f) == '\n'); ioctl_tree_write(f, tree->child); ioctl_tree_write(f, tree->next); }
static void ioctl_record_close(int fd) { if (fd < 0 || fd != ioctl_record_fd) return; DBG("ioctl_record_close: stopping ioctl recording on fd %i\n", fd); ioctl_record_fd = -1; /* recorded anything? */ if (ioctl_record != NULL) { rewind(ioctl_record_log); assert(ftruncate(fileno(ioctl_record_log), 0) == 0); ioctl_tree_write(ioctl_record_log, ioctl_record); fflush(ioctl_record_log); } }
static void ioctl_record_close(int fd) { if (fd < 0 || fd != ioctl_record_fd) return; DBG(DBG_IOCTL, "ioctl_record_close: stopping ioctl recording on fd %i\n", fd); ioctl_record_fd = -1; /* recorded anything? */ if (ioctl_record != NULL) { rewind(ioctl_record_log); assert(ftruncate(fileno(ioctl_record_log), 0) == 0); fprintf(ioctl_record_log, "@DEV %s\n", getenv("UMOCKDEV_IOCTL_RECORD_DEVICE_PATH")); ioctl_tree_write(ioctl_record_log, ioctl_record); fflush(ioctl_record_log); } }