github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/tools/syz-declextract/testdata/file_operations.c (about) 1 // Copyright 2024 syzkaller project authors. All rights reserved. 2 // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 #include "include/fs.h" 5 #include "include/uapi/file_operations.h" 6 #include "include/uapi/unused_ioctl.h" 7 8 enum { 9 FOO_IOCTL12 = _IOR('c', 12, int), 10 }; 11 12 enum { 13 config_foo 14 }; 15 16 static void foo_open() {} 17 static void foo_read() {} 18 static void foo_write() {} 19 static void foo_mmap() {} 20 static void foo_mmap2() {} 21 22 static void foo_ioctl2(unsigned int cmd, unsigned long arg) { 23 switch (cmd) { 24 case FOO_IOCTL6: 25 case FOO_IOCTL7: 26 default: 27 } 28 } 29 30 static void foo_ioctl(void* file, unsigned int cmd, unsigned long arg) { 31 switch (cmd) { 32 case FOO_IOCTL1: 33 case FOO_IOCTL2: 34 case FOO_IOCTL3: 35 case FOO_IOCTL4: 36 case FOO_IOCTL5: 37 case FOO_IOCTL10: 38 case FOO_IOCTL11: 39 case FOO_IOCTL12: 40 } 41 foo_ioctl2(cmd, arg); 42 } 43 44 const struct file_operations foo = { 45 .open = foo_open, 46 .read = foo_read, 47 .write = foo_write, 48 .unlocked_ioctl = foo_ioctl, 49 // Such code happens after macro expansion, 50 // we want to extract the first function name. 51 .mmap = ((config_foo) ? foo_mmap : foo_mmap2), 52 }; 53 54 static void proc_open() {} 55 static void proc_read() {} 56 static void proc_write() {} 57 static void proc_ioctl(void* file, unsigned int cmd, unsigned long arg) {} 58 59 const struct file_operations proc_ops[] = { 60 { 61 .open = proc_open, 62 .read_iter = proc_read, 63 .write_iter = proc_write, 64 }, 65 { 66 .open = proc_open, 67 .unlocked_ioctl = proc_ioctl, 68 }, 69 }; 70 71 #define UNUSED_IOCTL2 _IO('c', 2) 72 73 static void unused_ioctl(void* file, unsigned int cmd, unsigned long arg) { 74 switch (cmd) { 75 case UNUSED_IOCTL1: 76 case UNUSED_IOCTL2: 77 } 78 } 79 80 const struct file_operations unused = { 81 .unlocked_ioctl = unused_ioctl, 82 };