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