1#!/bin/sh 2 3# Generates various defines needed for using rump on non-NetBSD systems. 4# Run this occasionally (yes, it's a slightly suboptimal kludge, but 5# better than nothing). 6 7echo Generating rumpdefs.h 8rm -f rumpdefs.h 9exec 3>&1 > rumpdefs.h 10 11printf '/* $NetBSD: makerumpdefs.sh,v 1.31 2018/08/21 11:45:23 christos Exp $ */\n\n' 12printf '/*\n *\tAUTOMATICALLY GENERATED. DO NOT EDIT.\n */\n\n' 13printf '#ifndef _RUMP_RUMPDEFS_H_\n' 14printf '#define _RUMP_RUMPDEFS_H_\n\n' 15printf '#include <rump/rump_namei.h>\n' 16 17fromvers () { 18 echo 19 sed -n '1{s/\$//gp;q;}' $1 20} 21 22# not perfect, but works well enough for the cases so far 23# (also has one struct-specific hack for MAXNAMLEN) 24getstruct () { 25 sed -n '/struct[ ]*'"$2"'[ ]*{/{ 26 a\ 27struct rump_'"$2"' { 28 :loop 29 n 30 s/^}.*;$/};/p 31 t 32 /^#/!{/MAXNAMLEN/!{s/ino_t/uint64_t/;p;}} 33 b loop 34 }' < $1 35} 36 37# likewise not perfect, but as long as it's KNF, we're peachy (though 38# I personally like nectarines more) 39getenum () { 40 sed -n '/enum[ ]*'"$2"'[ ]*{/{ 41 a\ 42enum rump_'"$2"' { 43 :loop 44 n 45 s/^}.*;$/};/p 46 t 47 s/'$3'/RUMP_&/gp 48 b loop 49 }' < $1 50} 51 52 53fromvers ../../../sys/fcntl.h 54sed -n '/#define O_[A-Z]* *0x/s/O_/RUMP_O_/gp' \ 55 < ../../../sys/fcntl.h 56sed -n '/#define F_[A-Z_]* *0x/s/F_/RUMP_F_/gp' \ 57 < ../../../sys/fcntl.h 58sed -n '/#define F_[A-Z_]* *(/s/F_/RUMP_F_/gp' \ 59 < ../../../sys/fcntl.h 60sed -n '/#define[ ]*_FCN/{ 61:t 62N 63/\\$/bt 64s/_FCN/RUMP__FCN/g 65s/F_[A-Z]/RUMP_&/gp 66}' <../../../sys/fcntl.h | sed 's,/\*.*$,,' 67 68fromvers ../../../sys/vnode.h 69sed -n '/enum vtype.*{/{s/vtype/rump_&/;s/ V/ RUMP_V/gp;}' <../../../sys/vnode.h 70sed -n '/#define.*LK_[A-Z]/s/LK_/RUMP_LK_/gp' <../../../sys/vnode.h \ 71 | sed 's,/\*.*$,,' 72 73fromvers ../../../sys/errno.h 74sed -n '/#define[ ]*E/s/\([ ]\)\(E[A-Z2][A-Z]*\)/\1RUMP_\2/gp' \ 75 < ../../../sys/errno.h 76 77fromvers ../../../sys/reboot.h 78sed -n '/#define.*RB_[A-Z]/s/RB_/RUMP_RB_/gp' <../../../sys/reboot.h \ 79 | sed 's,/\*.*$,,' 80sed -n '/#define.*AB_[A-Z]/s/AB_/RUMP_AB_/gp' <../../../sys/reboot.h \ 81 | sed 's,/\*.*$,,' 82 83fromvers ../../../sys/socket.h 84sed -n '/#define[ ]*SOCK_[A-Z]/s/SOCK_/RUMP_SOCK_/gp' <../../../sys/socket.h \ 85 | sed 's,/\*.*$,,' 86sed -n '/#define[ ]*[AP]F_[A-Z]/s/[AP]F_/RUMP_&/gp' <../../../sys/socket.h \ 87 | sed 's,/\*.*$,,' 88sed -n '/#define[ ]*SO_[A-Z]/s/SO_/RUMP_&/gp' <../../../sys/socket.h \ 89 | sed 's,/\*.*$,,' 90sed -n '/#define[ ]*SOL_[A-Z]/s/SOL_/RUMP_&/gp' <../../../sys/socket.h \ 91 | sed 's,/\*.*$,,' 92sed -n '/#define[ ]*MSG_[A-Z]/s/MSG_/RUMP_&/gp' <../../../sys/socket.h \ 93 | sed 's,/\*.*$,,' 94 95fromvers ../../../netinet/in.h 96sed -n '/#define[ ]*IP_[A-Z]/s/IP_/RUMP_&/gp' <../../../netinet/in.h \ 97 | sed 's,/\*.*$,,' 98sed -n '/#define[ ]*IPPROTO_[A-Z]/s/IPPROTO_/RUMP_&/gp' <../../../netinet/in.h \ 99 | sed 's,/\*.*$,,' 100 101fromvers ../../../netinet/tcp.h 102sed -n '/#define[ ]*TCP_[A-Z]/s/TCP_/RUMP_&/gp' <../../../netinet/tcp.h \ 103 | sed 's,/\*.*$,,' 104 105fromvers ../../../sys/mount.h 106sed -n '/#define[ ]*MOUNT_[A-Z]/s/MOUNT_/RUMP_MOUNT_/gp' <../../../sys/mount.h | sed 's,/\*.*$,,' 107 108fromvers ../../../sys/fstypes.h 109sed -n '/#define[ ]*MNT_[A-Z].*[^\]$/s/MNT_/RUMP_MNT_/gp' <../../../sys/fstypes.h | sed 's,/\*.*$,,' 110 111fromvers ../../../sys/ioccom.h 112sed -n '/#define[ ]*IOC[A-Z_].*[^\\]$/s/IOC/RUMP_&/gp' <../../../sys/ioccom.h | sed 's,/\*.*$,,' 113sed -n '/#define[ ]*_IO.*\\$/{ 114:t 115N 116/\\$/bt 117s/_IOC/_RUMP_IOC/g 118s/IOC[A-Z]/RUMP_&/gp 119}' <../../../sys/ioccom.h \ 120 | sed 's,/\*.*$,,' 121sed -n '/#define[ ]*_IO.*[^\]$/{s/_IO/_RUMP_IO/g;s/IOC_/RUMP_IOC_/gp;}' <../../../sys/ioccom.h \ 122 | sed 's,/\*.*$,,' 123 124fromvers ../../../sys/ktrace.h 125sed -n '/#define[ ]*KTROP_[A-Z_]/s/KTROP_/RUMP_&/gp' <../../../sys/ktrace.h | sed 's,/\*.*$,,' 126sed -n '/#define[ ]*KTR_[A-Z_]/s/KTR_/RUMP_&/gp' <../../../sys/ktrace.h | sed 's,/\*.*$,,' 127sed -n '/#define[ ]*KTRFAC_[A-Z_]/{s/KTRFAC_/RUMP_&/g;s/KTR_/RUMP_&/g;p;}' <../../../sys/ktrace.h | sed 's,/\*.*$,,' 128sed -n '/#define[ ]*KTRFACv[0-9]/{s/KTRFACv/RUMP_&/g;s/KTRFAC_/RUMP_&/g;p;}' <../../../sys/ktrace.h | sed 's,/\*.*$,,' 129 130fromvers ../../../sys/module.h 131getstruct ../../../sys/module.h modctl_load 132getenum ../../../sys/module.h modctl MODCTL 133 134fromvers ../../../ufs/ufs/ufsmount.h 135getstruct ../../../ufs/ufs/ufsmount.h ufs_args 136 137fromvers ../../../fs/sysvbfs/sysvbfs_args.h 138getstruct ../../../fs/sysvbfs/sysvbfs_args.h sysvbfs_args 139 140fromvers ../../../sys/dirent.h 141getstruct ../../../sys/dirent.h dirent 142 143printf '\n#endif /* _RUMP_RUMPDEFS_H_ */\n' 144 145exec 1>&3 146 147echo Generating rumperr.h 148rm -f rumperr.h 149exec > rumperr.h 150printf '/* $NetBSD: makerumpdefs.sh,v 1.31 2018/08/21 11:45:23 christos Exp $ */\n\n' 151printf '/*\n *\tAUTOMATICALLY GENERATED. DO NOT EDIT.\n */\n' 152 153fromvers ../../../sys/errno.h 154 155printf "\nstatic __inline const char *\nrump_strerror(int error)\n{\n\n" 156printf "\tswitch (error) {\n\tcase 0:\n" 157printf "\t\t return \"No error: zero, zip, zilch, none!\";\n" 158awk '/^#define[ ]*E.*[0-9]/{ 159 ename = $2 160 evalue = $3 161 error = 1 162 if (ename == "ELAST") { 163 printf "\tdefault:\n" 164 printf "\t\treturn \"Invalid error!\";\n\t}\n}\n" 165 error = 0 166 exit 0 167 } 168 if (preverror + 1 != evalue) 169 exit 1 170 preverror = evalue 171 printf "\tcase %d: /* (%s) */\n\t\treturn \"", evalue, ename 172 sp = "" 173 for (i = 5; i < NF; i++) { 174 printf "%s%s", sp, $i 175 sp = " " 176 } 177 printf "\";\n" 178} 179END { 180 exit error 181}' < ../../../sys/errno.h 182if [ $? -ne 0 ]; then 183 echo 'Parsing errno.h failed!' 1>&3 184 rm -f rumpdefs.h rumperr.h 185 exit 1 186fi 187 188echo Generating rumperrno2host.h 1>&3 189rm -f rumperrno2host.h 190exec > rumperrno2host.h 191printf '/* $NetBSD: makerumpdefs.sh,v 1.31 2018/08/21 11:45:23 christos Exp $ */\n\n' 192printf '/*\n *\tAUTOMATICALLY GENERATED. DO NOT EDIT.\n */\n' 193 194fromvers ../../../sys/errno.h 195 196printf "\n#ifndef ERANGE\n#error include ISO C style errno.h first\n#endif\n" 197printf "\nstatic __inline int \nrump_errno2host(int rumperrno)\n{\n\n" 198printf "\tswitch (rumperrno) {\n\tcase 0:\n" 199printf "\t\t return 0;\n" 200awk '/^#define[ ]*E.*[0-9]/{ 201 ename = $2 202 evalue = $3 203 error = 1 204 if (ename == "ELAST") { 205 printf "\tdefault:\n" 206 printf "#ifdef EINVAL\n\t\treturn EINVAL;\n" 207 printf "#else\n\t\treturn ERANGE;\n#endif\n" 208 printf "\t}\n}\n" 209 error = 0 210 exit 0 211 } 212 if (preverror + 1 != evalue) 213 exit 1 214 preverror = evalue 215 printf "#ifdef %s\n", ename 216 printf "\tcase %d:\n\t\treturn %s;\n", evalue, ename 217 printf "#endif\n" 218} 219END { 220 exit error 221}' < ../../../sys/errno.h 222if [ $? -ne 0 ]; then 223 echo 'Parsing errno.h failed!' 1>&3 224 rm -f rumpdefs.h rumperr.h rumperrno2host.h 225 exit 1 226fi 227 228exit 0 229