# Copyright all contributors # License: AGPL-3.0+ # Dump system-specific constant numbers this is to maintain # PublicInbox::Syscall and any other system-specific pieces. # However, sysconf(3) constants are stable ABI on all safe to dump. eval 'exec perl -S $0 ${1+"$@"}' # no shebang if 0; # running under some shell use v5.12; use File::Temp 0.19; use POSIX qw(uname); use Config; print STDERR '# $machine='.(POSIX::uname())[-1]."\n"; my $cc = $ENV{CC} // $Config{cc} // 'cc'; my @cflags = split(/\s+/, $ENV{CFLAGS} // $Config{ccflags} // '-Wall'); my $str = do { local $/; }; $str =~ s/^\s*MAYBE\s*([DX])\((\w+)\)/ #ifdef $2 $1($2); #endif /sgxm; my $tmp = File::Temp->newdir('sysdefs-list-XXXX', TMPDIR => 1); my $f = "$tmp/sysdefs.c"; my $x = "$tmp/sysdefs"; open my $fh, '>', $f or die "open $f $!"; print $fh $str or die "print $f $!"; close $fh or die "close $f $!"; system($cc, '-o', $x, $f, @cflags) == 0 or die "$cc failed \$?=$?"; print STDERR '# %Config', (map { " $_=$Config{$_}" } qw(ptrsize sizesize lseeksize)), "\n"; exit(system($x)); # exit is to ensure File::Temp::Dir->DESTROY fires __DATA__ #ifndef _GNU_SOURCE # define _GNU_SOURCE #endif #include #include #include #include #include #include #ifdef __linux__ # include # include # include # include #endif #include #include #include #include #define STRUCT_BEGIN(t) do { t x; printf("'"#t"' => '%zu bytes\n", sizeof(x)) #define STRUCT_END puts("',"); } while (0) // prints the struct field name, @offset, and signed/unsigned bit size #define PR_NUM(f) do { \ x.f = ~0; \ printf("\t.%s @%zu %c%zu\n", #f, \ offsetof(typeof(x),f), \ x.f > 0 ? 'u' : 's', \ sizeof(x.f) * 8); \ } while (0) #define PR_PTR(f) do { \ assert(sizeof(x.f) == sizeof(void *)); \ printf("\t.%s @%zu ptr\n", #f, offsetof(typeof(x),f)); \ } while (0) #define PR_OFF(f) do { \ printf("\t.%s @%zu\n", #f, offsetof(typeof(x),f)); \ } while (0) #define D(x) printf(#x " => %ld,\n", (long)x) #define X(x) printf(#x " => 0x%lx,\n", (unsigned long)x) int main(void) { // verify Config{(ptr|size|lseek)size} entries match: printf("'sizeof(ptr)' => %zu,\n", sizeof(void *)); printf("'sizeof(size_t)' => %zu,\n", sizeof(size_t)); printf("'sizeof(off_t)' => %zu,\n", sizeof(off_t)); #ifdef __linux__ D(SYS_epoll_create1); D(SYS_epoll_ctl); MAYBE D(SYS_epoll_wait); D(SYS_epoll_pwait); D(SYS_signalfd4); X(IN_CLOEXEC); X(IN_ACCESS); X(IN_ALL_EVENTS); X(IN_ATTRIB); X(IN_CLOSE); X(IN_CLOSE_NOWRITE); X(IN_CLOSE_WRITE); X(IN_CREATE); X(IN_DELETE); X(IN_DELETE_SELF); X(IN_DONT_FOLLOW); X(IN_EXCL_UNLINK); X(IN_IGNORED); X(IN_ISDIR); X(IN_MASK_ADD); X(IN_MODIFY); X(IN_MOVE); X(IN_MOVED_FROM); X(IN_MOVED_TO); X(IN_MOVE_SELF); X(IN_ONESHOT); X(IN_ONLYDIR); X(IN_OPEN); X(IN_Q_OVERFLOW); X(IN_UNMOUNT); D(SYS_inotify_init1); D(SYS_inotify_add_watch); D(SYS_inotify_rm_watch); D(SYS_prctl); D(SYS_fstatfs); MAYBE X(FS_IOC_GETFLAGS); MAYBE X(FS_IOC_SETFLAGS); MAYBE D(SYS_renameat2); STRUCT_BEGIN(struct epoll_event); PR_NUM(events); PR_NUM(data.u64); STRUCT_END; STRUCT_BEGIN(struct inotify_event); PR_NUM(wd); PR_NUM(mask); PR_NUM(cookie); PR_NUM(len); PR_OFF(name); STRUCT_END; STRUCT_BEGIN(struct statfs); PR_NUM(f_type); STRUCT_END; #endif /* Linux, any other OSes with stable syscalls? */ D(SIGWINCH); MAYBE D(SO_ACCEPTFILTER); MAYBE D(_SC_NPROCESSORS_ONLN); MAYBE D(_SC_AVPHYS_PAGES); MAYBE D(_SC_PAGE_SIZE); MAYBE D(_SC_PAGESIZE); D(SYS_sendmsg); D(SYS_recvmsg); STRUCT_BEGIN(struct flock); PR_NUM(l_start); PR_NUM(l_len); PR_NUM(l_pid); PR_NUM(l_type); PR_NUM(l_whence); STRUCT_END; STRUCT_BEGIN(struct msghdr); PR_PTR(msg_name); PR_NUM(msg_namelen); PR_PTR(msg_iov); PR_NUM(msg_iovlen); PR_PTR(msg_control); PR_NUM(msg_controllen); PR_NUM(msg_flags); STRUCT_END; STRUCT_BEGIN(struct cmsghdr); PR_NUM(cmsg_len); PR_NUM(cmsg_level); PR_NUM(cmsg_type); STRUCT_END; { struct cmsghdr cmsg; uintptr_t cmsg_data_off; cmsg_data_off = (uintptr_t)CMSG_DATA(&cmsg) - (uintptr_t)&cmsg; D(cmsg_data_off); } return 0; }