+Thu Oct 17 01:55:34 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * sunrpc/Makefile ($(objpfx)rpcsvc/%.h, $(objpfx)x%.c): Write
+ output to $@T and move to $@ later since the new rpcgen will not
+ overwrite existing files.
+
+ * po/Makefile (libc.pot): Fix typo.
+
+Sun Oct 13 20:52:07 1996 Thorsten Kukuk <kukuk@weber.uni-paderborn.de>
+
+ Update rpcgen program to TI-rpc code.
+ * sunrpc/Makefile (rpcgen-objs): Add rpc_tblout.o and rpc_sample.o.
+ (distribute): Add proto.h.
+ * sunrpc/proto.h: New file. Prototypes for all the RPC functions.
+ * sunrpc/rpc_clntout.c: Change to allow generation of ISO C code.
+ * sunrpc/rpc_cout.c: Likewise.
+ * sunrpc/rpc_hout.c: Likewise.
+ * sunrpc/rpc_main.c: Likewise.
+ * sunrpc/rpc_parse.c: Likewise.
+ * sunrpc/rpc_parse.h: Likewise.
+ * sunrpc/rpc_scan.c: Likewise.
+ * sunrpc/rpc_scan.h: Likewise.
+ * sunrpc/rpc_svcout.c: Likewise.
+ * sunrpc/rpc_util.c: Likewise.
+ * sunrpc/rpc_util.h: Likewise.
+
+ * sunrpc/rpc_tblout.c: New file.
+ * sunrpc/rpc_sample.c: Likewise.
+
+Thu Oct 17 00:26:20 1996 NIIBE Yutaka <gniibe@mri.co.jp>
+
+ * sysdeps/unix/opendir.c: Add semicolon for consistency.
+
+Wed Oct 16 12:26:53 1996 Sven Verdoolaege <skimo@breughel.ufsia.ac.be>
+
+ * locale/progams/localedef.c (main): Test with -1 to find out
+ whether read failed.
+
+Wed Oct 16 14:54:59 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/unix/sysv/linux/i386/clone.S: Use JUMPTARGET and
+ PSEUDO_END macro.
+
+Tue Oct 15 21:27:42 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/unix/sysv/linux/m68k/sigcontext.h: Removed.
+
+Tue Oct 15 15:52:29 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/unix/sysv/linux/m68k/clone.S: Add CALL_MCOUNT.
+ * sysdeps/unix/sysv/linux/m68k/mmap.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/sigreturn.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/socket.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/sysdep.S (__errno_location):
+ Likewise.
+ * sysdeps/unix/sysv/linux/m68k/syscall.S: Likewise.
+ Correct generation of system call.
+
+Tue Oct 15 15:13:16 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * Makerules (sysd-Makefile): Fix command so that it works in the
+ subdirectories.
+ (BUILD_CFLAGS): Change back using $(..) instead of
+ $(common-objpfx), the latter fails in the toplevel directory when
+ $(objdir) is relative.
+ (common-objdir-compile): Run compiler in $(objdir).
+ * sysdeps/posix/Makefile (mk-stdiolim): Likewise.
+
+Tue Oct 15 23:39:48 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * string/string.h [__USE_SVID]: Add prototype for swab.
+ * time/sys/time.h [__USE_BSD]: Add prototype for ualarm.
+ Reported by Andreas Jaeger.
+
+ The available nlist implementation is not generally usable.
+ Especially on the currently supported ELF systems the nlist
+ function comes with the libelf.
+ * misc/Makefile (headers): Remove nlist.h.
+ (routines): Remove nlist.
+
+ * Makefile ($(objpfx)version-info.h): Include information about
+ system the libc is built on in version-info.h file.
+
+ * po/Makefile (distribute): Add header.pot.
+
+Tue Oct 15 16:34:15 1996 Andreas Jaeger <aj@arthur.pfalz.de>
+
+ * sysdeps/unix/sysv/linux/sleep.c: Include file with prototype.
+ * sysdeps/unix/sysv/linux/reboot.c: Likewise.
+ * misc/error.c: Likewise.
+
+Tue Oct 15 22:41:27 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/unix/sysv/linux/syscalls.list: Add {get,set}resuid.
+
+Tue Oct 15 08:06:02 1996 Andreas Jaeger <aj@arthur.pfalz.de>
+
+ * crypt/Makefiel (rpath-link): Extend search path to current directory.
+
+Fri Oct 11 09:18:06 1996 Sven Verdoolaege <skimo@breughel.ufsia.ac.be>
+
+ * sysdeps/i386/i586/strlen.S: Correct handling of prolog for
+ aligning pointer.
+
+Tue Oct 15 02:13:21 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * stdio-common/vfprintf.c: Don't declare __flockfile as weak.
+
+ * crypt/md5-crypt.c (md5_crypt_r): Add cast to prevent warning.
+
+Sun Oct 13 19:16:10 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/unix/sysv/linux/m68k/sysdep.h (POUND): Macro removed,
+ replaced by `&'.
+ (PSEUDO_END): Provide definition to use .size directive.
+ (PSEUDO): Don't interpret negative return values less than -128 as
+ syscall error.
+ * sysdeps/unix/sysv/linux/m68k/syscall.S (syscall): Likewise.
+
+ * sysdeps/m68k/bsd-_setjmp.S: Use PSEUDO_END macro to provide
+ .size directive.
+ * sysdeps/m68k/bsd-setjmp.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/clone.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/mmap.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/sigreturn.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/socket.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/syscall.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/sysdep.S: Use PSEUDO_END instead of
+ explicit .size directive.
+
Sun Oct 13 22:52:56 1996 Ulrich Drepper <drepper@cygnus.com>
* shlib-versions: Add version number/name for ld.so.
Sat Oct 12 20:31:58 1996 Richard Henderson <rth@tamu.edu>
- * libio/iogets.c: Warn when gets used.
+ * libio/iogets.c: Warn when gets is used.
* stdio/gets.c: Strengthen the warning.
Sat Oct 12 23:10:43 1996 Ulrich Drepper <drepper@cygnus.com>
* po/fr.po: Update.
- * time/strptime.c: Recognize %s, %u, %g, and %G format.
+cd * time/strptime.c: Recognize %s, %u, %g, and %G format.
* posix/getopt.c: Add some more casts and initializations to
prevent warnings.
In this file you have to change a few things:
-- change `ld-linux.so.1' to `ld.so.1'
+- change `ld-linux.so.1' to `ld.so.1' (or to ld-linux.so.2, see below)
- remove all expression `%{...:-lgmon}'; there is no libgmon in glibc
-----------------------------------------------------------------------
+The above is currently correct for all systems but ix86/Linux.
+Because of compatibility issues on this platform the dynamic linker
+must have a different name: ld-linux.so.2. So you have to replace
+
+ %{!dynamic-linker:-dynamic-linker=/home/gnu/lib/ld.so.1}
+by
+ %{!dynamic-linker:-dynamic-linker=/home/gnu/lib/ld-linux.so.2}
+
+in the above example specs file.
+
Future versions of GCC will automatically provide the correct specs.
# The following code requires GNU date.
$P/libc.pot: $(all-pot)
@rm -f $@.new
- disp='set `date -R`; echo $$6'; \
+ set `date -R`; disp="$$6"; \
sed -e 's/VERSION/$(version)/' \
- -e "s/DATE/`date +'%Y-%m-%d %I:%M'$$disp/" \
+ -e "s/DATE/`date +'%Y-%m-%d %H:%M'$$disp`/" \
po/header.pot > $@.new
$(XGETTEXT) -d - --omit-header -n -s $^ >> $@.new
mv -f $@.new $@
\f
all-Banner-files = $(wildcard $(addsuffix /Banner, $(subdirs)))
$(objpfx)version-info.h: $(+sysdir_pfx)config.make $(all-Banner-files)
- (files="$(all-Banner-files)"; \
+ (case $(config-os) in \
+ linux*) version=`(echo -e "#include <linux/version.h>\nUTS_RELEASE"\
+ | $(CC) -E -P - | \
+ sed -e 's/"\([^"]*\)".*/\1/p' -e d) 2>/dev/null`;\
+ if [ -z "$$version" ]; then \
+ if [ -r /proc/version ]; then \
+ version=`sed 's/.*version \([^ ]*\) .*/>>\1<</' \
+ < /proc/version`; \
+ else \
+ version=`uname -r`; \
+ fi; \
+ fi; \
+ echo -n "\"Compiled on a Linux $$version system "; \
+ echo "on `date +%Y/%m/%d`.\\n\"" ;; \
+ *) ;; \
+ esac; \
+ files="$(all-Banner-files)"; \
if test -n "$$files"; then \
echo "\"Available extensions:"; \
sed -e '/^#/d' -e 's/^[[:space:]]*/ /' $$files; \
(echo 'sysd-Makefile-sysdirs := $(config-sysdirs)'; \
for dir in $(config-sysdirs); do \
file=$$dir/Makefile; \
- if [ -f $(..)$$file ]; then \
+ case $$dir in \
+ /*) rel= ;; \
+ *) rel=$(..) ;; \
+ esac; \
+ if [ -f $$rel$$file ]; then \
case $$dir in \
/*) echo include "$$file" ;; \
*) echo include "\$$(..)$$file" ;; \
esac; \
else true; fi; \
- done; \
+ done; \
echo 'sysd-Makefile-done=t') > $@T
mv -f $@T $@
endif
endef
# Command to compile $< in $(common-objdir) using the native libraries.
+# We must cd to $(objdir) anyway so that $(..)config.h is valid.
define common-objdir-compile
-cd $(@D); $(BUILD_CC) $(BUILD_CFLAGS) $(<:$(common-objpfx)%=%) -o $(@F)
+cd $(objpfx).; \
+$(BUILD_CC) $(BUILD_CFLAGS) $(<:$(common-objpfx)%=$(..)%) -o $(..)$(@F)
endef
# We always want to use configuration definitions.
-BUILD_CFLAGS = -include $(common-objpfx)config.h
+BUILD_CFLAGS = -include $(..)config.h
# Support the GNU standard name for this target.
.PHONY: check
-This directory contains the version 1.94 test release of the GNU C Library.
+This directory contains the version 1.96 test release of the GNU C Library.
Many bugs have been fixed since the last release.
Some bugs surely remain.
Because of the United States export restriction on DES implementations,
we are distributing this code separately from the rest of the C
library. There is an extra distribution tar file just for crypt; it is
-called `glibc-1.94-crypt.tar.gz'. You can just unpack the crypt
+called `glibc-1.96-crypt.tar.gz'. You can just unpack the crypt
distribution along with the rest of the C library and build; you can
also build the library without getting crypt. Users outside the USA
can get the crypt distribution via anonymous FTP from ftp.uni-c.dk
{
long int n;
n = read (fd, read_ptr, left);
- if (n == 1)
+ if (n == -1)
error (5, errno, _("cannot read locale file `%s'"),
fname);
read_ptr += n;
headers := sys/uio.h iovec.h sys/ioctl.h ioctls.h ioctl-types.h \
sys/ptrace.h sys/file.h sys/dir.h sys/cdefs.h \
- ar.h a.out.h nlist.h stab.h stab.def sgtty.h \
+ ar.h a.out.h stab.h stab.def sgtty.h \
ttyent.h syslog.h sys/syslog.h paths.h sys/reboot.h \
sys/mman.h sys/param.h fstab.h mntent.h search.h err.h error.h\
sys/queue.h sysexits.h syscall.h sys/syscall.h sys/swap.h \
swapon swapoff mktemp mkstemp \
ualarm usleep \
gtty stty \
- ptrace nlist \
+ ptrace \
fstab mntent mntent_r \
utimes \
truncate ftruncate \
void exit ();
#endif
+#include "error.h"
+
#ifndef _
#define _(String) String
#endif
install-others = $(LINGUAS:%=$(mo-installed))
# Files to distribute: all the source and compiled binary translation files.
-distribute = $(ALL_LINGUAS:=.po) $(ALL_LINGUAS:=.mo) libc.pot
+distribute = $(ALL_LINGUAS:=.po) $(ALL_LINGUAS:=.mo) libc.pot header.pot
include ../Rules
-# GNU libc message catalog of translations
+# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: libc 1.94\n"
-"POT-Creation-Date: 1996-09-08 3:45\n"
+"Project-Id-Version: libc 1.96\n"
+"POT-Creation-Date: 1996-10-17 03:22+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+DIST\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
-#: sunrpc/rpc_main.c:80
-#, c-format
-msgid " %s [-c | -h | -l | -m] [-o outfile] [infile]\n"
-msgstr ""
-
-#: sunrpc/rpc_main.c:83
-#, c-format
-msgid " %s [-s udp|tcp]* [-o outfile] [infile]\n"
-msgstr ""
-
#: sunrpc/rpcinfo.c:612
msgid " rpcinfo -b prognum versnum\n"
msgstr ""
msgid " program vers proto port\n"
msgstr ""
-#: time/zic.c:425
+#: time/zic.c:424
#, c-format
msgid " (rule from \"%s\", line %d)"
msgstr ""
-#: locale/programs/ld-collate.c:360 locale/programs/ld-ctype.c:1233
+#: locale/programs/ld-collate.c:360 locale/programs/ld-ctype.c:1234
msgid " done\n"
msgstr ""
-#: time/zic.c:422
+#: time/zic.c:421
#, c-format
msgid "\"%s\", line %d: %s"
msgstr ""
-#: time/zic.c:946
+#: time/zic.c:945
#, c-format
msgid "\"Zone %s\" line and -l option are mutually exclusive"
msgstr ""
-#: time/zic.c:954
+#: time/zic.c:953
#, c-format
msgid "\"Zone %s\" line and -p option are mutually exclusive"
msgstr ""
-#: time/zic.c:759
+#: time/zic.c:758
#, c-format
msgid "%s in ruleless zone"
msgstr ""
msgid "%s%sUnknown signal %d\n"
msgstr ""
-#: sunrpc/rpc_util.c:258
-#, c-format
-msgid "%s, line %d: "
-msgstr ""
-
-#: time/zic.c:2140
+#: time/zic.c:2139
#, c-format
msgid "%s: %d did not sign extend correctly\n"
msgstr ""
msgid "%s: <mb_cur_max> must be greater than <mb_cur_min>\n"
msgstr ""
-#: time/zic.c:1431
+#: time/zic.c:1430
#, c-format
msgid "%s: Can't create %s: %s\n"
msgstr ""
-#: time/zic.c:2119
+#: time/zic.c:2118
#, c-format
msgid "%s: Can't create directory %s: %s\n"
msgstr ""
-#: time/zic.c:613
+#: time/zic.c:612
#, c-format
msgid "%s: Can't link from %s to %s: %s\n"
msgstr ""
-#: time/zic.c:784
+#: time/zic.c:783
#, c-format
msgid "%s: Can't open %s: %s\n"
msgstr ""
-#: time/zic.c:852
+#: time/zic.c:851
#, c-format
msgid "%s: Error closing %s: %s\n"
msgstr ""
-#: time/zic.c:846
+#: time/zic.c:845
#, c-format
msgid "%s: Error reading %s\n"
msgstr ""
-#: time/zic.c:1495
+#: time/zic.c:1494
#, c-format
msgid "%s: Error writing %s\n"
msgstr ""
msgid "%s: Error writing standard output "
msgstr ""
-#: time/zic.c:831
+#: time/zic.c:830
#, c-format
msgid "%s: Leap line in non leap seconds file %s\n"
msgstr ""
msgid "%s: Memory exhausted: %s\n"
msgstr ""
-#: time/zic.c:528
+#: time/zic.c:527
#, c-format
msgid "%s: More than one -L option specified\n"
msgstr ""
-#: time/zic.c:488
+#: time/zic.c:487
#, c-format
msgid "%s: More than one -d option specified\n"
msgstr ""
-#: time/zic.c:498
+#: time/zic.c:497
#, c-format
msgid "%s: More than one -l option specified\n"
msgstr ""
-#: time/zic.c:508
+#: time/zic.c:507
#, c-format
msgid "%s: More than one -p option specified\n"
msgstr ""
-#: time/zic.c:518
+#: time/zic.c:517
#, c-format
msgid "%s: More than one -y option specified\n"
msgstr ""
-#: time/zic.c:1846
+#: time/zic.c:1845
#, c-format
msgid "%s: command was '%s', result was %d\n"
msgstr ""
msgid "%s: error in state machine"
msgstr ""
-#: posix/getopt.c:686
+#: posix/getopt.c:687
#, c-format
msgid "%s: illegal option -- %c\n"
msgstr ""
-#: posix/getopt.c:689
+#: posix/getopt.c:690
#, c-format
msgid "%s: invalid option -- %c\n"
msgstr ""
-#: posix/getopt.c:610
+#: posix/getopt.c:611
#, c-format
msgid "%s: option `%c%s' doesn't allow an argument\n"
msgstr ""
-#: posix/getopt.c:581
+#: posix/getopt.c:582
#, c-format
msgid "%s: option `%s' is ambiguous\n"
msgstr ""
-#: posix/getopt.c:627
+#: posix/getopt.c:628 posix/getopt.c:801
#, c-format
msgid "%s: option `%s' requires an argument\n"
msgstr ""
-#: posix/getopt.c:605
+#: posix/getopt.c:606
#, c-format
msgid "%s: option `--%s' doesn't allow an argument\n"
msgstr ""
-#: posix/getopt.c:725
+#: posix/getopt.c:786
#, c-format
-msgid "%s: option requires an argument -- %c\n"
+msgid "%s: option `-W %s' doesn't allow an argument\n"
msgstr ""
-#: sunrpc/rpc_main.c:146
+#: posix/getopt.c:767
#, c-format
-msgid "%s: output would overwrite %s\n"
+msgid "%s: option `-W %s' is ambiguous\n"
msgstr ""
-#: time/zic.c:838 time/zic.c:1249 time/zic.c:1269
+#: posix/getopt.c:721 posix/getopt.c:850
#, c-format
-msgid "%s: panic: Invalid l_value %d\n"
+msgid "%s: option requires an argument -- %c\n"
msgstr ""
-#: locale/programs/charmap.c:600
+#: time/zic.c:837 time/zic.c:1248 time/zic.c:1268
#, c-format
-msgid "%s: premature end of file"
+msgid "%s: panic: Invalid l_value %d\n"
msgstr ""
-#: sunrpc/rpc_main.c:152
+#: locale/programs/charmap.c:600
#, c-format
-msgid "%s: unable to open "
+msgid "%s: premature end of file"
msgstr ""
-#: posix/getopt.c:660
+#: posix/getopt.c:661
#, c-format
msgid "%s: unrecognized option `%c%s'\n"
msgstr ""
-#: posix/getopt.c:656
+#: posix/getopt.c:657
#, c-format
msgid "%s: unrecognized option `--%s'\n"
msgstr ""
-#: time/zic.c:447
+#: time/zic.c:446
#, c-format
msgid ""
"%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d "
msgid "(unknown)"
msgstr ""
-#: catgets/gencat.c:244
+#: catgets/gencat.c:253
msgid "*standard input*"
msgstr ""
msgid ".lib section in a.out corrupted"
msgstr ""
-#: inet/rcmd.c:325
+#: inet/rcmd.c:328
msgid ".rhosts fstat failed"
msgstr ""
-#: inet/rcmd.c:321
+#: inet/rcmd.c:324
msgid ".rhosts lstat failed"
msgstr ""
-#: inet/rcmd.c:323
+#: inet/rcmd.c:326
msgid ".rhosts not regular file"
msgstr ""
-#: inet/rcmd.c:329
+#: inet/rcmd.c:332
msgid ".rhosts writeable by other than owner"
msgstr ""
msgid "; why = "
msgstr ""
-#: locale/programs/ld-ctype.c:325
+#: locale/programs/ld-ctype.c:326
#, c-format
msgid "<SP> character must not be in class `%s'"
msgstr ""
-#: locale/programs/ld-ctype.c:316
+#: locale/programs/ld-ctype.c:317
#, c-format
msgid "<SP> character not in class `%s'"
msgstr ""
msgid "Block device required"
msgstr ""
-#: sunrpc/pmap_rmt.c:335
+#: sunrpc/pmap_rmt.c:337
msgid "Broadcast select problem"
msgstr ""
msgid "Cannot assign requested address"
msgstr ""
-#: sunrpc/pmap_rmt.c:253
+#: sunrpc/pmap_rmt.c:255
msgid "Cannot create socket for broadcast rpc"
msgstr ""
msgid "Cannot exec a shared library directly"
msgstr ""
-#: sunrpc/pmap_rmt.c:347
+#: sunrpc/pmap_rmt.c:349
msgid "Cannot receive reply to broadcast"
msgstr ""
msgid "Cannot send after transport endpoint shutdown"
msgstr ""
-#: sunrpc/pmap_rmt.c:311
+#: sunrpc/pmap_rmt.c:313
msgid "Cannot send broadcast packet"
msgstr ""
-#: sunrpc/pmap_rmt.c:259
+#: sunrpc/pmap_rmt.c:261
msgid "Cannot set socket option SO_BROADCAST"
msgstr ""
msgid "Computer bought the farm"
msgstr ""
-#: locale/programs/ld-ctype.c:1196
+#: locale/programs/ld-ctype.c:1197
msgid "Computing table size for character classes might take a while..."
msgstr ""
msgid "Continued"
msgstr ""
+#: catgets/gencat.c:169 db/makedb.c:120 locale/programs/locale.c:187
+#: locale/programs/localedef.c:177
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+
#. TRANS No default destination address was set for the socket. You get this
#. TRANS error when you try to transmit data over a connectionless socket,
#. TRANS without first specifying a destination for the data with @code{connect}.
msgid "Error in unknown error system: "
msgstr ""
-#: inet/ruserpass.c:156
+#: inet/ruserpass.c:161
msgid "Error: .netrc file is readable by others."
msgstr ""
msgid "Exec format error"
msgstr ""
-#: locale/programs/localedef.c:207
+#: locale/programs/localedef.c:213
msgid "FATAL: system does not define `_POSIX2_LOCALEDEF'"
msgstr ""
msgid "No message of desired type"
msgstr ""
-#: posix/regex.c:5202
+#: posix/regex.c:5204
msgid "No previous regular expression"
msgstr ""
msgid "Object is remote"
msgstr ""
-#: time/zic.c:1940
+#: time/zic.c:1939
msgid "Odd number of quotation marks"
msgstr ""
msgid "Remote address changed"
msgstr ""
-#: inet/ruserpass.c:157
+#: inet/ruserpass.c:162
msgid "Remove password or make file unreadable by others."
msgstr ""
+#: catgets/gencat.c:224 db/makedb.c:227 locale/programs/locale.c:257
+#: locale/programs/localedef.c:408
+msgid "Report bugs to <bug-glibc@prep.ai.mit.edu>.\n"
+msgstr ""
+
#: resolv/herror.c:73
msgid "Resolver Error 0 (no error)"
msgstr ""
msgid "Transport endpoint is not connected"
msgstr ""
-#: catgets/gencat.c:202 db/makedb.c:197 locale/programs/locale.c:234
-#: locale/programs/localedef.c:383
+#: catgets/gencat.c:208 db/makedb.c:209 locale/programs/locale.c:241
+#: locale/programs/localedef.c:389
#, c-format
msgid "Try `%s --help' for more information.\n"
msgstr ""
-#: inet/rcmd.c:118
+#: inet/rcmd.c:121
#, c-format
msgid "Trying %s...\n"
msgstr ""
-#: inet/ruserpass.c:241
+#: inet/ruserpass.c:246
#, c-format
msgid "Unknown .netrc keyword %s"
msgstr ""
msgid "Unknown signal %d"
msgstr ""
-#: misc/error.c:92
+#: misc/error.c:94
msgid "Unknown system error"
msgstr ""
msgid "Unmatched \\{"
msgstr ""
-#: posix/getconf.c:184
+#: posix/getconf.c:191
#, c-format
msgid "Unrecognized variable `%s'"
msgstr ""
msgid "Urgent I/O condition"
msgstr ""
-#: catgets/gencat.c:205
+#: catgets/gencat.c:212
#, c-format
msgid ""
"Usage: %s [OPTION]... -o OUTPUT-FILE [INPUT-FILE]...\n"
" -V, --version output version information and exit\n"
"If INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE\n"
"is -, output is written to standard output.\n"
-"Report bugs to <bug-glibc@prep.ai.mit.edu>.\n"
msgstr ""
-#: db/makedb.c:200
+#: db/makedb.c:213
#, c-format
msgid ""
"Usage: %s [OPTION]... INPUT-FILE OUTPUT-FILE\n"
" -u, --undo print content of database file, one entry a line\n"
" -V, --version output version information and exit\n"
"If INPUT-FILE is -, input is read from standard input.\n"
-"Report bugs to <bug-glibc@prep.ai.mit.edu>.\n"
msgstr ""
-#: locale/programs/localedef.c:386
+#: locale/programs/localedef.c:393
#, c-format
msgid ""
"Usage: %s [OPTION]... name\n"
"\n"
"System's directory for character maps: %s\n"
" locale files : %s\n"
-"Report bugs to <bug-glibc@prep.ai.mit.edu>.\n"
msgstr ""
-#: locale/programs/locale.c:237
+#: locale/programs/locale.c:245
#, c-format
msgid ""
"Usage: %s [OPTION]... name\n"
"\n"
" -c, --category-name write names of selected categories\n"
" -k, --keyword-name write names of selected keywords\n"
-"Report bugs to <bug-glibc@prep.ai.mit.edu>.\n"
msgstr ""
-#: posix/getconf.c:131
+#: posix/getconf.c:138
#, c-format
msgid "Usage: %s variable_name [pathname]\n"
msgstr ""
msgid "Virtual timer expired"
msgstr ""
-#: time/zic.c:1845
+#: time/zic.c:1844
msgid "Wild result from command execution"
msgstr ""
msgid "Window changed"
msgstr ""
+#: catgets/gencat.c:174 db/makedb.c:125 locale/programs/locale.c:192
+#: locale/programs/localedef.c:182
+#, c-format
+msgid "Written by %s.\n"
+msgstr ""
+
#. TRANS You did @strong{what}?
#: stdio-common/../sysdeps/gnu/errlist.c:596
msgid "You really blew it this time"
msgstr ""
-#: time/zic.c:1051
+#: time/zic.c:1050
msgid "Zone continuation line end time is not after end time of previous line"
msgstr ""
msgid "argument to `%s' must be a single character"
msgstr ""
-#: sunrpc/rpc_parse.c:326
-msgid "array declaration expected"
-msgstr ""
-
-#: sunrpc/auth_unix.c:314
+#: sunrpc/auth_unix.c:322
msgid "auth_none.c - Fatal marshalling problem"
msgstr ""
-#: inet/rcmd.c:327
+#: inet/rcmd.c:330
msgid "bad .rhosts owner"
msgstr ""
msgid "bad argument"
msgstr ""
-#: time/zic.c:1173
+#: time/zic.c:1172
msgid "blank FROM field on Link line"
msgstr ""
-#: time/zic.c:1177
+#: time/zic.c:1176
msgid "blank TO field on Link line"
msgstr ""
msgid "bogus mcheck_status, library is buggy"
msgstr ""
-#: sunrpc/pmap_rmt.c:177
+#: sunrpc/pmap_rmt.c:179
msgid "broadcast: ioctl (get interface configuration)"
msgstr ""
-#: sunrpc/pmap_rmt.c:184
+#: sunrpc/pmap_rmt.c:186
msgid "broadcast: ioctl (get interface flags)"
msgstr ""
-#: sunrpc/svc_udp.c:398
+#: sunrpc/svc_udp.c:402
msgid "cache_set: victim not found"
msgstr ""
-#: time/zic.c:1686
+#: time/zic.c:1685
msgid "can't determine time zone abbrevation to use just after until time"
msgstr ""
msgid "can't reassign procedure number %d\n"
msgstr ""
-#: locale/programs/localedef.c:281
+#: locale/programs/localedef.c:287
#, c-format
msgid "cannot `stat' locale file `%s'"
msgstr ""
msgid "cannot insert new collating symbol definition: %s"
msgstr ""
-#: db/makedb.c:149
+#: db/makedb.c:161
#, c-format
msgid "cannot open database file `%s': %s"
msgstr ""
-#: catgets/gencat.c:250 db/makedb.c:168
+#: catgets/gencat.c:259 db/makedb.c:180
#, c-format
msgid "cannot open input file `%s'"
msgstr ""
-#: locale/programs/localedef.c:215
+#: locale/programs/localedef.c:221
#, c-format
msgid "cannot open locale definition file `%s'"
msgstr ""
-#: catgets/gencat.c:755 catgets/gencat.c:796 db/makedb.c:177
+#: catgets/gencat.c:764 catgets/gencat.c:805 db/makedb.c:189
#, c-format
msgid "cannot open output file `%s'"
msgstr ""
msgid "cannot process order specification"
msgstr ""
-#: locale/programs/locale.c:293
+#: locale/programs/locale.c:303
#, c-format
msgid "cannot read character map directory `%s'"
msgstr ""
-#: locale/programs/locale.c:268
+#: locale/programs/locale.c:278
#, c-format
msgid "cannot read locale directory `%s'"
msgstr ""
-#: locale/programs/localedef.c:303
+#: locale/programs/localedef.c:309
#, c-format
msgid "cannot read locale file `%s'"
msgstr ""
-#: locale/programs/localedef.c:328
+#: locale/programs/localedef.c:334
#, c-format
msgid "cannot write output files to `%s'"
msgstr ""
-#: locale/programs/localedef.c:371
+#: locale/programs/localedef.c:377
msgid "category data requested more than once: should not happen"
msgstr ""
-#: locale/programs/ld-ctype.c:264
+#: locale/programs/ld-ctype.c:265
#, c-format
msgid "character %s'%s' in class `%s' must be in class `%s'"
msgstr ""
-#: locale/programs/ld-ctype.c:288
+#: locale/programs/ld-ctype.c:289
#, c-format
msgid "character %s'%s' in class `%s' must not be in class `%s'"
msgstr ""
-#: locale/programs/ld-ctype.c:309
+#: locale/programs/ld-ctype.c:310
msgid "character <SP> not defined in character map"
msgstr ""
-#: locale/programs/ld-ctype.c:1140
+#: locale/programs/ld-ctype.c:1141
#, c-format
msgid "character `%c' not defined while needed as default value"
msgstr ""
-#: locale/programs/ld-ctype.c:938 locale/programs/ld-ctype.c:1001
-#: locale/programs/ld-ctype.c:1009 locale/programs/ld-ctype.c:1017
-#: locale/programs/ld-ctype.c:1025 locale/programs/ld-ctype.c:1033
-#: locale/programs/ld-ctype.c:1041 locale/programs/ld-ctype.c:1067
-#: locale/programs/ld-ctype.c:1075 locale/programs/ld-ctype.c:1113
-#: locale/programs/ld-ctype.c:1151
+#: locale/programs/ld-ctype.c:939 locale/programs/ld-ctype.c:1002
+#: locale/programs/ld-ctype.c:1010 locale/programs/ld-ctype.c:1018
+#: locale/programs/ld-ctype.c:1026 locale/programs/ld-ctype.c:1034
+#: locale/programs/ld-ctype.c:1042 locale/programs/ld-ctype.c:1068
+#: locale/programs/ld-ctype.c:1076 locale/programs/ld-ctype.c:1114
+#: locale/programs/ld-ctype.c:1152
#, c-format
msgid "character `%s' not defined while needed as default value"
msgstr ""
-#: locale/programs/ld-ctype.c:800
+#: locale/programs/ld-ctype.c:801
#, c-format
msgid "character class `%s' already defined"
msgstr ""
-#: locale/programs/ld-ctype.c:832
+#: locale/programs/ld-ctype.c:833
#, c-format
msgid "character map `%s' already defined"
msgstr ""
msgid "collation symbol expected after `%s'"
msgstr ""
-#: inet/rcmd.c:112
+#: inet/rcmd.c:114
#, c-format
msgid "connect to address %s: "
msgstr ""
-#: sunrpc/rpc_scan.c:109
-msgid "constant or identifier expected"
-msgstr ""
-
#: sunrpc/svc_simple.c:70
msgid "couldn't create an rpc server\n"
msgstr ""
msgid "default character map file `%s' not found"
msgstr ""
-#: sunrpc/rpc_parse.c:77
-msgid "definition keyword expected"
+#: locale/programs/ld-time.c:154
+#, c-format
+msgid ""
+"direction flag in string %d in `era' field in category `%s' is not '+' nor "
+"'-'"
+msgstr ""
+
+#: locale/programs/ld-time.c:164
+#, c-format
+msgid ""
+"direction flag in string %d in `era' field in category `%s' is not a single "
+"character"
msgstr ""
#: locale/programs/charset.c:87 locale/programs/charset.c:132
msgid "duplicate definition for character `%.*s'"
msgstr ""
-#: db/makedb.c:295
+#: db/makedb.c:310
msgid "duplicate key"
msgstr ""
-#: catgets/gencat.c:369
+#: catgets/gencat.c:378
msgid "duplicate set definition"
msgstr ""
-#: time/zic.c:966
+#: time/zic.c:965
#, c-format
msgid "duplicate zone name %s (file \"%s\", line %d)"
msgstr ""
-#: catgets/gencat.c:532
+#: catgets/gencat.c:541
msgid "duplicated message identifier"
msgstr ""
-#: catgets/gencat.c:505
+#: catgets/gencat.c:514
msgid "duplicated message number"
msgstr ""
msgid "empty weight name: line ignored"
msgstr ""
-#: sunrpc/svc_udp.c:344
+#: sunrpc/svc_udp.c:348
msgid "enablecache: cache already enabled"
msgstr ""
-#: sunrpc/svc_udp.c:349
+#: sunrpc/svc_udp.c:353
msgid "enablecache: could not allocate cache"
msgstr ""
-#: sunrpc/svc_udp.c:356
+#: sunrpc/svc_udp.c:360
msgid "enablecache: could not allocate cache data"
msgstr ""
-#: sunrpc/svc_udp.c:362
+#: sunrpc/svc_udp.c:366
msgid "enablecache: could not allocate cache fifo"
msgstr ""
msgid "expect string argument for `copy'"
msgstr ""
-#: sunrpc/rpc_util.c:300
-#, c-format
-msgid "expected '%s'"
-msgstr ""
-
-#: sunrpc/rpc_util.c:312
-#, c-format
-msgid "expected '%s' or '%s'"
-msgstr ""
-
-#: sunrpc/rpc_util.c:325
-#, c-format
-msgid "expected '%s', '%s' or '%s'"
-msgstr ""
-
-#: time/zic.c:857
+#: time/zic.c:856
msgid "expected continuation line not found"
msgstr ""
-#: sunrpc/rpc_parse.c:384
-msgid "expected type specifier"
-msgstr ""
-
#: locale/programs/locfile.c:1010
#, c-format
msgid "failure while writing data for category `%s'"
msgid "garbage at end of digit"
msgstr ""
+#: locale/programs/ld-time.c:183
+#, c-format
+msgid ""
+"garbage at end of offset value in string %d in `era' field in category `%s'"
+msgstr ""
+
+#: locale/programs/ld-time.c:238
+#, c-format
+msgid ""
+"garbage at end of starting date in string %d in `era' field in category `%s'"
+msgstr ""
+
+#: locale/programs/ld-time.c:310
+#, c-format
+msgid ""
+"garbage at end of stopping date in string %d in `era' field in category `%s'"
+msgstr ""
+
#: sunrpc/get_myaddr.c:73
msgid "get_myaddress: ioctl (get interface configuration)"
msgstr ""
-#: time/zic.c:1150
+#: time/zic.c:1149
msgid "illegal CORRECTION field on Leap line"
msgstr ""
-#: time/zic.c:1154
+#: time/zic.c:1153
msgid "illegal Rolling/Stationary field on Leap line"
msgstr ""
msgid "illegal character constant in string"
msgstr ""
-#: sunrpc/rpc_scan.c:281
-msgid "illegal character in file: "
-msgstr ""
-
#: locale/programs/ld-collate.c:1115
msgid "illegal collation element"
msgstr ""
msgid "illegal names for character range"
msgstr ""
-#: sunrpc/rpc_parse.c:146
-msgid "illegal result type"
+#: locale/programs/ld-time.c:176
+#, c-format
+msgid "illegal number for offset in string %d in `era' field in category `%s'"
msgstr ""
-#: catgets/gencat.c:342 catgets/gencat.c:419
+#: catgets/gencat.c:351 catgets/gencat.c:428
msgid "illegal set number"
msgstr ""
-#: locale/programs/ld-ctype.c:806
+#: locale/programs/ld-time.c:230
+#, c-format
+msgid "illegal starting date in string %d in `era' field in category `%s'"
+msgstr ""
+
+#: locale/programs/ld-time.c:302
+#, c-format
+msgid "illegal stopping date in string %d in `era' field in category `%s'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:807
#, c-format
msgid "implementation limit: no more than %d character classes allowed"
msgstr ""
-#: locale/programs/ld-ctype.c:838
+#: locale/programs/ld-ctype.c:839
#, c-format
msgid "implementation limit: no more than %d character maps allowed"
msgstr ""
-#: db/makedb.c:151
+#: db/makedb.c:163
msgid "incorrectly formatted file"
msgstr ""
-#: time/zic.c:815
+#: time/zic.c:814
msgid "input line of unknown type"
msgstr ""
-#: time/zic.c:1734
+#: time/zic.c:1733
msgid "internal error - addtype called with bad isdst"
msgstr ""
-#: time/zic.c:1742
+#: time/zic.c:1741
msgid "internal error - addtype called with bad ttisgmt"
msgstr ""
-#: time/zic.c:1738
+#: time/zic.c:1737
msgid "internal error - addtype called with bad ttisstd"
msgstr ""
-#: locale/programs/ld-ctype.c:300
+#: locale/programs/ld-ctype.c:301
#, c-format
msgid "internal error in %s, line %u"
msgstr ""
-#: time/zic.c:1022
+#: time/zic.c:1021
msgid "invalid GMT offset"
msgstr ""
-#: time/zic.c:1025
+#: time/zic.c:1024
msgid "invalid abbreviation format"
msgstr ""
-#: time/zic.c:1115 time/zic.c:1314 time/zic.c:1328
+#: time/zic.c:1114 time/zic.c:1313 time/zic.c:1327
msgid "invalid day of month"
msgstr ""
-#: time/zic.c:1273
+#: time/zic.c:1272
msgid "invalid ending year"
msgstr ""
-#: time/zic.c:1087
+#: time/zic.c:1086
msgid "invalid leaping year"
msgstr ""
-#: time/zic.c:1102 time/zic.c:1205
+#: time/zic.c:1101 time/zic.c:1204
msgid "invalid month name"
msgstr ""
-#: time/zic.c:921
+#: time/zic.c:920
msgid "invalid saved time"
msgstr ""
-#: time/zic.c:1253
+#: time/zic.c:1252
msgid "invalid starting year"
msgstr ""
-#: time/zic.c:1131 time/zic.c:1233
+#: time/zic.c:1130 time/zic.c:1232
msgid "invalid time of day"
msgstr ""
-#: time/zic.c:1319
+#: time/zic.c:1318
msgid "invalid weekday name"
msgstr ""
msgid "line before ellipsis does not contain definition for character constant"
msgstr ""
-#: time/zic.c:795
+#: time/zic.c:794
msgid "line too long"
msgstr ""
-#: locale/programs/localedef.c:275
+#: locale/programs/localedef.c:281
#, c-format
msgid "locale file `%s', used in `copy' statement, not found"
msgstr ""
-#: catgets/gencat.c:600
+#: catgets/gencat.c:609
msgid "malformed line ignored"
msgstr ""
#: locale/programs/ld-collate.c:167 locale/programs/ld-collate.c:173
#: locale/programs/ld-collate.c:177 locale/programs/ld-collate.c:1438
#: locale/programs/ld-collate.c:1467 locale/programs/locfile.c:940
-#: locale/programs/xmalloc.c:64 posix/getconf.c:174
+#: locale/programs/xmalloc.c:68 posix/getconf.c:181
msgid "memory exhausted"
msgstr ""
msgid "memory is consistent, library is buggy"
msgstr ""
-#: time/zic.c:916
+#: locale/programs/ld-time.c:348
+#, c-format
+msgid "missing era format in string %d in `era' field in category `%s'"
+msgstr ""
+
+#: locale/programs/ld-time.c:337
+#, c-format
+msgid "missing era name in string %d in `era' fieldin category `%s'"
+msgstr ""
+
+#: time/zic.c:915
msgid "nameless rule"
msgstr ""
msgid "never registered prog %d\n"
msgstr ""
-#: sunrpc/rpc_parse.c:305 sunrpc/rpc_parse.c:313
-msgid "no array-of-pointer declarations -- use typedef"
-msgstr ""
-
#: locale/programs/ld-messages.c:95 locale/programs/ld-messages.c:116
#, c-format
msgid "no correct regular expression for field `%s' in category `%s': %s"
msgstr ""
-#: time/zic.c:2060
+#: time/zic.c:2059
msgid "no day in month matches rule"
msgstr ""
msgid "no other keyword shall be specified when `copy' is used"
msgstr ""
-#: locale/programs/localedef.c:334
+#: locale/programs/localedef.c:340
msgid "no output file produced because warning were issued"
msgstr ""
msgid "portmap cannot create socket"
msgstr ""
-#: sunrpc/rpc_scan.c:456 sunrpc/rpc_scan.c:464
-msgid "preprocessor error"
-msgstr ""
-
-#: db/makedb.c:311
+#: db/makedb.c:326
#, c-format
msgid "problems while reading `%s'"
msgstr ""
msgid "program %lu version %lu ready and waiting\n"
msgstr ""
-#: inet/rcmd.c:154
+#: inet/rcmd.c:157
#, c-format
msgid "rcmd: select (setting up stderr): %s\n"
msgstr ""
-#: inet/rcmd.c:86
+#: inet/rcmd.c:87
msgid "rcmd: socket: All ports in use\n"
msgstr ""
-#: inet/rcmd.c:141
+#: inet/rcmd.c:144
#, c-format
msgid "rcmd: write (setting up stderr): %s\n"
msgstr ""
msgid "registerrpc: out of memory\n"
msgstr ""
-#: time/zic.c:1795
+#: time/zic.c:1794
msgid "repeated leap second moment"
msgstr ""
msgid "run_svc returned unexpectedly\n"
msgstr ""
-#: time/zic.c:709 time/zic.c:711
+#: time/zic.c:708 time/zic.c:710
msgid "same rule name in multiple files"
msgstr ""
-#: inet/rcmd.c:158
+#: inet/rcmd.c:161
msgid "select: protocol failure in circuit setup\n"
msgstr ""
-#: inet/rcmd.c:176
-msgid "socket: protocol failure in circuit setup.\n"
+#: inet/rcmd.c:179
+msgid "socket: protocol failure in circuit setup\n"
msgstr ""
#: locale/programs/locfile.c:600
"specification of sorting weight for collation symbol does not make sense"
msgstr ""
-#: time/zic.c:780
+#: time/zic.c:779
msgid "standard input"
msgstr ""
msgid "standard output"
msgstr ""
-#: time/zic.c:1277
+#: locale/programs/ld-time.c:256
+#, c-format
+msgid "starting date is illegal in string %d in `era' field in category `%s'"
+msgstr ""
+
+#: time/zic.c:1276
msgid "starting year greater than ending year"
msgstr ""
-#: sunrpc/svc_tcp.c:199 sunrpc/svc_tcp.c:204
+#: locale/programs/ld-time.c:328
+#, c-format
+msgid "stopping date is illegal in string %d in `era' field in category `%s'"
+msgstr ""
+
+#: sunrpc/svc_tcp.c:201 sunrpc/svc_tcp.c:206
msgid "svc_tcp: makefd_xprt: out of memory\n"
msgstr ""
-#: sunrpc/svc_tcp.c:147
+#: sunrpc/svc_tcp.c:149
msgid "svctcp_.c - cannot getsockname or listen"
msgstr ""
-#: sunrpc/svc_tcp.c:134
+#: sunrpc/svc_tcp.c:136
msgid "svctcp_.c - udp socket creation problem"
msgstr ""
-#: sunrpc/svc_tcp.c:154 sunrpc/svc_tcp.c:161
+#: sunrpc/svc_tcp.c:156 sunrpc/svc_tcp.c:163
msgid "svctcp_create: out of memory\n"
msgstr ""
-#: sunrpc/svc_udp.c:119
+#: sunrpc/svc_udp.c:123
msgid "svcudp_create - cannot getsockname"
msgstr ""
-#: sunrpc/svc_udp.c:107
+#: sunrpc/svc_udp.c:111
msgid "svcudp_create: socket creation problem"
msgstr ""
msgid "syntax error: not inside a locale definition section"
msgstr ""
-#: catgets/gencat.c:371 catgets/gencat.c:507 catgets/gencat.c:534
+#: catgets/gencat.c:380 catgets/gencat.c:516 catgets/gencat.c:543
msgid "this is the first definition"
msgstr ""
-#: time/zic.c:1120
+#: time/zic.c:1119
msgid "time before zero"
msgstr ""
-#: time/zic.c:1128 time/zic.c:1960 time/zic.c:1979
+#: time/zic.c:1127 time/zic.c:1959 time/zic.c:1978
msgid "time overflow"
msgstr ""
msgid "too many character classes defined"
msgstr ""
-#: sunrpc/rpc_util.c:285
-msgid "too many files!\n"
-msgstr ""
-
-#: time/zic.c:1789
+#: time/zic.c:1788
msgid "too many leap seconds"
msgstr ""
-#: time/zic.c:1761
+#: time/zic.c:1760
msgid "too many local time types"
msgstr ""
-#: time/zic.c:1715
+#: time/zic.c:1714
msgid "too many transitions?!"
msgstr ""
msgid "too many weights"
msgstr ""
-#: time/zic.c:2083
+#: time/zic.c:2082
msgid "too many, or too long, time zone abbreviations"
msgstr ""
msgid "two lines in a row containing `...' are not allowed"
msgstr ""
-#: time/zic.c:1284
+#: time/zic.c:1283
msgid "typed single year"
msgstr ""
#: locale/programs/ld-messages.c:193 locale/programs/ld-messages.c:204
#: locale/programs/ld-messages.c:215 locale/programs/ld-messages.c:226
+#: locale/programs/ld-time.c:696
#, c-format
msgid "unknown character in field `%s' of category `%s'"
msgstr ""
msgid "unknown collation directive"
msgstr ""
-#: catgets/gencat.c:468
+#: catgets/gencat.c:477
#, c-format
msgid "unknown directive `%s': line ignored"
msgstr ""
-#: catgets/gencat.c:447
+#: catgets/gencat.c:456
#, c-format
msgid "unknown set `%s'"
msgstr ""
msgid "unknown symbol `%.*s': line ignored"
msgstr ""
-#: time/zic.c:752
+#: time/zic.c:751
msgid "unruly zone"
msgstr ""
-#: catgets/gencat.c:952
+#: catgets/gencat.c:961
msgid "unterminated message"
msgstr ""
msgid "unterminated string"
msgstr ""
-#: sunrpc/rpc_scan.c:319
-msgid "unterminated string constant"
-msgstr ""
-
#: locale/programs/linereader.c:385
msgid "unterminated symbolic name"
msgstr ""
msgid "upper limit in range is not smaller then lower limit"
msgstr ""
-#: sunrpc/rpc_main.c:78
-#, c-format
-msgid "usage: %s infile\n"
-msgstr ""
-
-#: time/zic.c:2026
+#: time/zic.c:2025
msgid "use of 2/29 in non leap-year"
msgstr ""
msgid "values for field `%s' in category `%s' must not be zero"
msgstr ""
-#: sunrpc/rpc_parse.c:330
-msgid "variable-length array declaration expected"
-msgstr ""
-
-#: sunrpc/rpc_parse.c:370
-msgid "voids allowed only inside union and program definitions"
-msgstr ""
-
#: login/setutent_r.c:47
msgid "while opening UTMP file"
msgstr ""
-#: catgets/gencat.c:979
+#: catgets/gencat.c:988
msgid "while opening old catalog file"
msgstr ""
-#: db/makedb.c:338
+#: db/makedb.c:353
msgid "while reading database"
msgstr ""
-#: db/makedb.c:300
+#: db/makedb.c:315
msgid "while writing data base file"
msgstr ""
-#: db/makedb.c:130
+#: db/makedb.c:142
msgid "wrong number of arguments"
msgstr ""
-#: time/zic.c:1078
+#: time/zic.c:1077
msgid "wrong number of fields on Leap line"
msgstr ""
-#: time/zic.c:1169
+#: time/zic.c:1168
msgid "wrong number of fields on Link line"
msgstr ""
-#: time/zic.c:912
+#: time/zic.c:911
msgid "wrong number of fields on Rule line"
msgstr ""
-#: time/zic.c:982
+#: time/zic.c:981
msgid "wrong number of fields on Zone continuation line"
msgstr ""
-#: time/zic.c:940
+#: time/zic.c:939
msgid "wrong number of fields on Zone line"
msgstr ""
#endif
extern void __flockfile (FILE *);
-weak_extern (__flockfile);
extern void __funlockfile (FILE *);
/* Global variables. */
extern char *basename __P ((__const char *__filename));
#endif
+#ifdef __USE_SVID
+/* Swab pairs bytes in the first N bytes of the area pointed to by
+ FROM and copy the result to TO. The value of TO must not be in the
+ range [FROM - N + 1, FROM - 1]. If N is odd the first byte in FROM
+ is without partner. */
+extern void swab __P ((__const char *__from, __const char *__to, size_t __n));
+#endif
+
__END_DECLS
#endif /* string.h */
#
subdir := sunrpc
-# The code in this subdirectory is taken verbatim from Sun's RPCSRC-4.0
-# distribution. A few files needed trivial modifications to compile in the
-# GNU environment; these changes are marked by comments that say
-# `roland@gnu'. All the code from Sun's rpc, etc, and rpcgen
-# subdirectories is in this directory; the rpc subdirectory contains only
-# the header files. Other than that, several files were renamed so as not
-# to exceed 14-character file name limits:
+# The code in this subdirectory is taken from Sun's RPCSRC-4.0
+# distribution with some additional changes from the TI-RPC package
+# which is also available from Sun. A few files needed trivial
+# modifications to compile in the GNU environment; these changes are
+# marked by comments that say `roland@gnu'. All the code from Sun's
+# rpc, etc, and rpcgen subdirectories is in this directory; the rpc
+# subdirectory contains only the header files. Other than that,
+# several files were renamed so as not to exceed 14-character file
+# name limits:
#
# authunix_prot.c -> authuxprot.c
# bindresvport.c -> bindrsvprt.c
install-bin := rpcgen
install-sbin := rpcinfo portmap
rpcgen-objs = rpc_main.o rpc_hout.o rpc_cout.o rpc_parse.o \
- rpc_scan.o rpc_util.o rpc_svcout.o rpc_clntout.o
+ rpc_scan.o rpc_util.o rpc_svcout.o rpc_clntout.o \
+ rpc_tblout.o rpc_sample.o
# These headers are part of rpcgen.
-distribute := rpc_util.h rpc_parse.h rpc_scan.h $(rpcgen-objs:.o=.c) etc.rpc
+distribute := proto.h rpc_util.h rpc_parse.h rpc_scan.h \
+ $(rpcgen-objs:.o=.c) etc.rpc
extra-objs = $(rpcgen-objs)
all: # Make this the default target; it will be defined in Rules.
# Generate the rpcsvc headers with rpcgen.
$(objpfx)rpcsvc/%.h: rpcsvc/%.x $(objpfx)rpcgen
$(make-target-directory)
- $(rpcgen-cmd) -h $< -o $@
+ -@rm -f $@T
+ $(rpcgen-cmd) -h $< -o $@T
+ mv -f $@T $@
+
# Generate the rpcsvc XDR functions with rpcgen.
$(objpfx)x%.c: rpcsvc/%.x $(objpfx)rpcgen
- $(rpcgen-cmd) -c $< -o $@
+ -@rm -f $@T
+ $(rpcgen-cmd) -c $< -o $@T
+ mv -f $@T $@
+
# The generated source files depend on the corresponding generated headers.
# Gratuitous dependency on generated .c file here just gets it mentioned to
# avoid being an intermediate file and getting removed.
--- /dev/null
+/****** rpc_clntout.c ******/
+
+void write_stubs(void);
+void printarglist(proc_list *proc,
+ const char *addargname, const char *addargtype);
+
+/****** rpc_cout.c ******/
+
+void emit(definition *def);
+void emit_inline(declaration *decl, int flag);
+void emit_single_in_line(declaration *decl, int flag, relation rel);
+
+/****** rpc_hout.c ******/
+
+void print_datadef(definition *def);
+void print_funcdef(definition *def);
+void pxdrfuncdecl(const char *name, int pointerp);
+void pprocdef(proc_list *proc, version_list *vp,
+ const char *addargtype, int server_p, int mode);
+void pdeclaration(const char *name, declaration *dec, int tab,
+ const char *separator);
+
+/****** rpc_main.c ******/
+ /* nil */
+
+/****** rpc_parse.c ******/
+definition *get_definition(void);
+
+/****** rpc_sample.c ******/
+void write_sample_svc(definition *def);
+int write_sample_clnt(definition *def);
+void add_sample_msg(void);
+void write_sample_clnt_main(void);
+
+/****** rpc_scan.c ******/
+ /* see rpc_scan.h */
+
+/****** rpc_svcout.c ******/
+int nullproc(proc_list *proc);
+void write_svc_aux(int nomain);
+void write_msg_out(void);
+
+/****** rpc_tblout.c ******/
+void write_tables(void);
+
+/****** rpc_util.c ******/
+void reinitialize(void);
+int streq(const char *a, const char *b);
+void error(const char *msg);
+void crash(void);
+void tabify(FILE *f, int tab);
+char *make_argname(const char *pname, const char *vname);
+void add_type(int len, const char *type);
-/* @(#)rpc_clntout.c 2.1 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
+ *
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
+ *
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
- *
+ *
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
- *
+ *
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
- *
+ *
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#ifndef lint
-static char sccsid[] = "@(#)rpc_clntout.c 1.2 87/06/24 (C) 1987 SMI";
-#endif
+
+/*
+ * From: @(#)rpc_clntout.c 1.11 89/02/22 (C) 1987 SMI
+ */
+char clntout_rcsid[] =
+ "$Id$";
/*
* rpc_clntout.c, Client-stub outputter for the RPC protocol compiler
* Copyright (C) 1987, Sun Microsytsems, Inc.
*/
#include <stdio.h>
-#include <strings.h>
+#include <string.h>
+#include <rpc/types.h>
#include "rpc_parse.h"
#include "rpc_util.h"
+#include "proto.h"
#define DEFAULT_TIMEOUT 25 /* in seconds */
+static char RESULT[] = "clnt_res";
+
+static void write_program(definition *def);
+static void printbody(proc_list *proc);
+static const char *ampr(const char *type);
+static void printbody(proc_list *proc);
+
void
-write_stubs()
+write_stubs(void)
{
list *l;
definition *def;
- f_print(fout,
- "\n/* Default timeout can be changed using clnt_control() */\n");
- f_print(fout, "static struct timeval TIMEOUT = { %d, 0 };\n",
+ f_print(fout,
+ "\n/* Default timeout can be changed using clnt_control() */\n");
+ f_print(fout, "static struct timeval TIMEOUT = { %d, 0 };\n",
DEFAULT_TIMEOUT);
for (l = defined; l != NULL; l = l->next) {
def = (definition *) l->val;
}
}
-
-static
-write_program(def)
- definition *def;
+static void
+write_program(definition *def)
{
version_list *vp;
proc_list *proc;
ptype(proc->res_prefix, proc->res_type, 1);
f_print(fout, "*\n");
pvname(proc->proc_name, vp->vers_num);
- f_print(fout, "(argp, clnt)\n");
- f_print(fout, "\t");
- ptype(proc->arg_prefix, proc->arg_type, 1);
- f_print(fout, "*argp;\n");
- f_print(fout, "\tCLIENT *clnt;\n");
+ printarglist( proc, "clnt", "CLIENT *" );
f_print(fout, "{\n");
printbody(proc);
- f_print(fout, "}\n\n");
+ f_print(fout, "}\n");
}
}
}
-static char *
-ampr(type)
- char *type;
+/* Writes out declarations of procedure's argument list.
+ In either ANSI C style, in one of old rpcgen style (pass by reference),
+ or new rpcgen style (multiple arguments, pass by value);
+ */
+
+/* sample addargname = "clnt"; sample addargtype = "CLIENT * " */
+
+void printarglist(proc_list *proc,
+ const char *addargname, const char *addargtype)
+{
+
+ decl_list *l;
+
+ if (!newstyle) { /* old style: always pass argument by reference */
+ if (Cflag) { /* C++ style heading */
+ f_print(fout, "(");
+ ptype(proc->args.decls->decl.prefix, proc->args.decls->decl.type, 1);
+ f_print(fout, "*argp, %s%s)\n", addargtype, addargname );
+ }
+ else {
+ f_print(fout, "(argp, %s)\n", addargname);
+ f_print(fout, "\t");
+ ptype(proc->args.decls->decl.prefix, proc->args.decls->decl.type, 1);
+ f_print(fout, "*argp;\n");
+ }
+ } else if (streq( proc->args.decls->decl.type, "void")) {
+ /* newstyle, 0 argument */
+ if( Cflag )
+ f_print(fout, "(%s%s)\n", addargtype, addargname );
+ else
+ f_print(fout, "(%s)\n", addargname);
+ } else {
+ /* new style, 1 or multiple arguments */
+ if( !Cflag ) {
+ f_print(fout, "(");
+ for (l = proc->args.decls; l != NULL; l = l->next)
+ f_print(fout, "%s, ", l->decl.name);
+ f_print(fout, "%s)\n", addargname );
+ for (l = proc->args.decls; l != NULL; l = l->next) {
+ pdeclaration(proc->args.argname, &l->decl, 1, ";\n" );
+ }
+ } else { /* C++ style header */
+ f_print(fout, "(");
+ for(l = proc->args.decls; l != NULL; l = l->next) {
+ pdeclaration(proc->args.argname, &l->decl, 0, ", " );
+ }
+ f_print(fout, " %s%s)\n", addargtype, addargname );
+ }
+ }
+
+ if( !Cflag )
+ f_print(fout, "\t%s%s;\n", addargtype, addargname );
+}
+
+
+
+static
+const char *
+ampr(const char *type)
{
if (isvectordef(type, REL_ALIAS)) {
return ("");
}
}
-static
-printbody(proc)
- proc_list *proc;
+static void
+printbody(proc_list *proc)
{
+ decl_list *l;
+ bool_t args2 = (proc->arg_num > 1);
+/* int i; */
+
+ /* For new style with multiple arguments, need a structure in which
+ to stuff the arguments. */
+ if ( newstyle && args2) {
+ f_print(fout, "\t%s", proc->args.argname);
+ f_print(fout, " arg;\n");
+ }
f_print(fout, "\tstatic ");
if (streq(proc->res_type, "void")) {
f_print(fout, "char ");
} else {
ptype(proc->res_prefix, proc->res_type, 0);
}
- f_print(fout, "res;\n");
+ f_print(fout, "%s;\n",RESULT);
f_print(fout, "\n");
- f_print(fout, "\tbzero((char *)%sres, sizeof(res));\n",
- ampr(proc->res_type));
- f_print(fout,
- "\tif (clnt_call(clnt, %s, xdr_%s, argp, xdr_%s, %sres, TIMEOUT) != RPC_SUCCESS) {\n",
- proc->proc_name, stringfix(proc->arg_type),
- stringfix(proc->res_type), ampr(proc->res_type));
+ f_print(fout, "\tmemset((char *)%s%s, 0, sizeof(%s));\n",
+ ampr(proc->res_type ), RESULT, RESULT);
+ if (newstyle && !args2 && (streq( proc->args.decls->decl.type, "void"))) {
+ /* newstyle, 0 arguments */
+ f_print(fout,
+ "\tif (clnt_call(clnt, %s, xdr_void", proc->proc_name);
+ f_print(fout,
+ ", NULL, xdr_%s, %s,%s, TIMEOUT) != RPC_SUCCESS) {\n",
+ stringfix(proc->res_type), ampr(proc->res_type), RESULT);
+
+ } else if ( newstyle && args2) {
+ /* newstyle, multiple arguments: stuff arguments into structure */
+ for (l = proc->args.decls; l != NULL; l = l->next) {
+ f_print(fout, "\targ.%s = %s;\n",
+ l->decl.name, l->decl.name);
+ }
+ f_print(fout,
+ "\tif (clnt_call(clnt, %s, xdr_%s", proc->proc_name,
+ proc->args.argname);
+ f_print(fout,
+ ", &arg, xdr_%s, %s%s, TIMEOUT) != RPC_SUCCESS) {\n",
+ stringfix(proc->res_type), ampr(proc->res_type), RESULT);
+ } else { /* single argument, new or old style */
+ f_print(fout,
+ "\tif (clnt_call(clnt, %s, xdr_%s, %s%s, xdr_%s, %s%s, TIMEOUT) != RPC_SUCCESS) {\n",
+ proc->proc_name,
+ stringfix(proc->args.decls->decl.type),
+ (newstyle ? "&" : ""),
+ (newstyle ? proc->args.decls->decl.name : "argp"),
+ stringfix(proc->res_type), ampr(proc->res_type),RESULT);
+ }
f_print(fout, "\t\treturn (NULL);\n");
f_print(fout, "\t}\n");
if (streq(proc->res_type, "void")) {
- f_print(fout, "\treturn ((void *)%sres);\n",
- ampr(proc->res_type));
+ f_print(fout, "\treturn ((void *)%s%s);\n",
+ ampr(proc->res_type),RESULT);
} else {
- f_print(fout, "\treturn (%sres);\n", ampr(proc->res_type));
+ f_print(fout, "\treturn (%s%s);\n", ampr(proc->res_type),RESULT);
}
}
+
-/* @(#)rpc_cout.c 2.1 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
+ *
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
+ *
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
- *
+ *
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
- *
+ *
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
- *
+ *
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#ifndef lint
-static char sccsid[] = "@(#)rpc_cout.c 1.8 87/06/24 (C) 1987 SMI";
-#endif
/*
- * rpc_cout.c, XDR routine outputter for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsystems, Inc.
+ * From: @(#)rpc_cout.c 1.13 89/02/22 (C) 1987 SMI
+ */
+char cout_rcsid[] =
+ "$Id$";
+
+/*
+ * rpc_cout.c, XDR routine outputter for the RPC protocol compiler
*/
+#include <ctype.h>
#include <stdio.h>
-#include <strings.h>
-#include "rpc_util.h"
+#include <string.h>
#include "rpc_parse.h"
+#include "rpc_util.h"
+#include "proto.h"
+
+static void emit_enum(definition *def);
+static void emit_program(definition *def);
+static void emit_union(definition *def);
+static void emit_struct(definition *def);
+static void emit_typedef(definition *def);
+static int findtype(const definition *def, const char *type);
+static int undefined(const char *type);
+static void print_generic_header(const char *procname, int pointerp);
+static void print_ifopen(int indent, const char *name);
+static void print_ifarg(const char *arg);
+static void print_ifsizeof(const char *prefix, const char *type);
+static void print_ifclose(int indent);
+static void print_ifstat(int indent, const char *prefix, const char *type,
+ relation rel, const char *amax,
+ const char *objname, const char *name);
+static void print_stat(int indent, declaration *dec);
+static void print_header(definition *def);
+static void print_trailer(void);
+static char *upcase(const char *str);
/*
- * Emit the C-routine for the given definition
+ * Emit the C-routine for the given definition
*/
void
-emit(def)
- definition *def;
+emit(definition *def)
{
- if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
+ if (def->def_kind == DEF_CONST) {
return;
}
+ if (def->def_kind == DEF_PROGRAM) {
+ emit_program(def);
+ return;
+ }
+ if(def->def_kind == DEF_TYPEDEF)
+ {
+ /* now we need to handle declarations like
+ struct typedef foo foo;
+ since we dont want this to be expanded into 2 calls to xdr_foo */
+
+ if(strcmp(def->def.ty.old_type,def->def_name)==0)
+ return;
+ };
+
print_header(def);
switch (def->def_kind) {
case DEF_UNION:
case DEF_TYPEDEF:
emit_typedef(def);
break;
+ default:
+ /* can't happen */
}
print_trailer();
}
-static
-findtype(def, type)
- definition *def;
- char *type;
+static int
+findtype(const definition *def, const char *type)
{
+
if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
return (0);
} else {
}
}
-static
-undefined(type)
- char *type;
+static int
+undefined(const char *type)
{
definition *def;
def = (definition *) FINDVAL(defined, type, findtype);
+
+
return (def == NULL);
}
-static
-print_header(def)
- definition *def;
+static void
+print_generic_header(const char *procname, int pointerp)
{
- space();
+ f_print(fout, "\n");
f_print(fout, "bool_t\n");
- f_print(fout, "xdr_%s(xdrs, objp)\n", def->def_name);
- f_print(fout, "\tXDR *xdrs;\n");
- f_print(fout, "\t%s ", def->def_name);
- if (def->def_kind != DEF_TYPEDEF ||
- !isvectordef(def->def.ty.old_type, def->def.ty.rel)) {
- f_print(fout, "*");
+ if (Cflag) {
+ f_print(fout, "xdr_%s(", procname);
+ f_print(fout, "XDR *xdrs, ");
+ f_print(fout, "%s ", procname);
+ if( pointerp )
+ f_print(fout, "*");
+ f_print(fout, "objp)\n{\n\n");
+ } else {
+ f_print(fout, "xdr_%s(xdrs, objp)\n", procname);
+ f_print(fout, "\tXDR *xdrs;\n");
+ f_print(fout, "\t%s ", procname);
+ if( pointerp )
+ f_print(fout, "*");
+ f_print(fout, "objp;\n{\n\n");
}
- f_print(fout, "objp;\n");
- f_print(fout, "{\n");
}
-static
-print_trailer()
+static void
+print_header(definition *def)
+{
+
+/*
+ decl_list *dl;
+ bas_type *ptr;
+ int i;
+ */
+
+ print_generic_header( def->def_name,
+ def->def_kind != DEF_TYPEDEF ||
+ !isvectordef(def->def.ty.old_type, def->def.ty.rel));
+
+ /* Now add Inline support */
+
+
+ if(inlineflag == 0 )
+ return;
+ /*May cause lint to complain. but ... */
+f_print(fout, "\t register long *buf;\n\n");
+
+}
+
+static void
+print_prog_header(proc_list *plist)
+{
+ print_generic_header( plist->args.argname, 1 );
+}
+
+static void
+print_trailer(void)
{
f_print(fout, "\treturn (TRUE);\n");
f_print(fout, "}\n");
- space();
}
-static
-print_ifopen(indent, name)
- int indent;
- char *name;
+static void
+print_ifopen(int indent, const char *name)
{
tabify(fout, indent);
- f_print(fout, "if (!xdr_%s(xdrs", name);
+ f_print(fout, " if (!xdr_%s(xdrs", name);
}
-
-static
-print_ifarg(arg)
- char *arg;
+static void
+print_ifarg(const char *arg)
{
f_print(fout, ", %s", arg);
}
-
-static
-print_ifsizeof(prefix, type)
- char *prefix;
- char *type;
+static void
+print_ifsizeof(const char *prefix, const char *type)
{
if (streq(type, "bool")) {
- f_print(fout, ", sizeof(bool_t), xdr_bool");
- } else {
+ f_print(fout, ", sizeof(bool_t), (xdrproc_t)xdr_bool");
+ }
+ else {
f_print(fout, ", sizeof(");
if (undefined(type) && prefix) {
f_print(fout, "%s ", prefix);
}
- f_print(fout, "%s), xdr_%s", type, type);
+ f_print(fout, "%s), (xdrproc_t)xdr_%s", type, type);
}
}
-static
-print_ifclose(indent)
- int indent;
+static void
+print_ifclose(int indent)
{
f_print(fout, ")) {\n");
tabify(fout, indent);
- f_print(fout, "\treturn (FALSE);\n");
+ f_print(fout, "\t return (FALSE);\n");
tabify(fout, indent);
- f_print(fout, "}\n");
-}
-
-static
-space()
-{
- f_print(fout, "\n\n");
+ f_print(fout, " }\n");
}
-static
-print_ifstat(indent, prefix, type, rel, amax, objname, name)
- int indent;
- char *prefix;
- char *type;
- relation rel;
- char *amax;
- char *objname;
- char *name;
+static void
+print_ifstat(int indent, const char *prefix, const char *type, relation rel,
+ const char *amax, const char *objname, const char *name)
{
- char *alt = NULL;
+ const char *alt = NULL;
switch (rel) {
case REL_POINTER:
print_ifclose(indent);
}
-
-/* ARGSUSED */
-static
-emit_enum(def)
- definition *def;
+static void
+emit_enum(definition *def)
{
+ (void)def;
+
print_ifopen(1, "enum");
print_ifarg("(enum_t *)objp");
print_ifclose(1);
}
-
-static
-emit_union(def)
- definition *def;
+static void
+emit_program(definition *def)
{
- declaration *dflt;
- case_list *cl;
- declaration *cs;
- char *object;
- char *format = "&objp->%s_u.%s";
-
- print_stat(&def->def.un.enum_decl);
- f_print(fout, "\tswitch (objp->%s) {\n", def->def.un.enum_decl.name);
- for (cl = def->def.un.cases; cl != NULL; cl = cl->next) {
- cs = &cl->case_decl;
- f_print(fout, "\tcase %s:\n", cl->case_name);
- if (!streq(cs->type, "void")) {
- object = alloc(strlen(def->def_name) + strlen(format) +
- strlen(cs->name) + 1);
- s_print(object, format, def->def_name, cs->name);
- print_ifstat(2, cs->prefix, cs->type, cs->rel, cs->array_max,
- object, cs->name);
- free(object);
- }
- f_print(fout, "\t\tbreak;\n");
- }
- dflt = def->def.un.default_decl;
- if (dflt != NULL) {
- if (!streq(dflt->type, "void")) {
- f_print(fout, "\tdefault:\n");
- object = alloc(strlen(def->def_name) + strlen(format) +
- strlen(dflt->name) + 1);
- s_print(object, format, def->def_name, dflt->name);
- print_ifstat(2, dflt->prefix, dflt->type, dflt->rel,
- dflt->array_max, object, dflt->name);
- free(object);
- f_print(fout, "\t\tbreak;\n");
- }
- } else {
- f_print(fout, "\tdefault:\n");
- f_print(fout, "\t\treturn (FALSE);\n");
- }
- f_print(fout, "\t}\n");
+ decl_list *dl;
+ version_list *vlist;
+ proc_list *plist;
+
+ for (vlist = def->def.pr.versions; vlist != NULL;vlist = vlist->next)
+ for(plist = vlist->procs; plist != NULL; plist = plist->next) {
+ if (!newstyle || plist->arg_num < 2)
+ continue; /* old style, or single argument */
+ print_prog_header(plist);
+ for (dl = plist->args.decls; dl != NULL;
+ dl = dl->next)
+ print_stat(1,&dl->decl);
+ print_trailer();
+ }
}
+static void
+emit_union(definition *def)
+{
+ declaration *dflt;
+ case_list *cl;
+ declaration *cs;
+ char *object;
+ const char *vecformat = "objp->%s_u.%s";
+ const char *format = "&objp->%s_u.%s";
+
+ print_stat(1,&def->def.un.enum_decl);
+ f_print(fout, "\tswitch (objp->%s) {\n", def->def.un.enum_decl.name);
+ for (cl = def->def.un.cases; cl != NULL; cl = cl->next) {
+
+ f_print(fout, "\tcase %s:\n", cl->case_name);
+ if(cl->contflag == 1) /* a continued case statement */
+ continue;
+ cs = &cl->case_decl;
+ if (!streq(cs->type, "void")) {
+ object = alloc(strlen(def->def_name) + strlen(format) +
+ strlen(cs->name) + 1);
+ if (isvectordef(cs->type, cs->rel)) {
+ s_print(object, vecformat, def->def_name,
+ cs->name);
+ } else {
+ s_print(object, format, def->def_name,
+ cs->name);
+ }
+ print_ifstat(2, cs->prefix, cs->type, cs->rel, cs->array_max,
+ object, cs->name);
+ free(object);
+ }
+ f_print(fout, "\t\tbreak;\n");
+ }
+ dflt = def->def.un.default_decl;
+ if (dflt != NULL) {
+ if (!streq(dflt->type, "void")) {
+ f_print(fout, "\tdefault:\n");
+ object = alloc(strlen(def->def_name) + strlen(format) +
+ strlen(dflt->name) + 1);
+ if (isvectordef(dflt->type, dflt->rel)) {
+ s_print(object, vecformat, def->def_name,
+ dflt->name);
+ } else {
+ s_print(object, format, def->def_name,
+ dflt->name);
+ }
+
+ print_ifstat(2, dflt->prefix, dflt->type, dflt->rel,
+ dflt->array_max, object, dflt->name);
+ free(object);
+ f_print(fout, "\t\tbreak;\n");
+ }
+#ifdef __GNU_LIBRARY__
+ else {
+ f_print(fout, "\tdefault:\n");
+ f_print(fout, "\t\tbreak;\n");
+ }
+#endif
+ } else {
+ f_print(fout, "\tdefault:\n");
+ f_print(fout, "\t\treturn (FALSE);\n");
+ }
+ f_print(fout, "\t}\n");
+}
-static
-emit_struct(def)
- definition *def;
+static void
+emit_struct(definition *def)
{
decl_list *dl;
-
- for (dl = def->def.st.decls; dl != NULL; dl = dl->next) {
- print_stat(&dl->decl);
+ int i,j,size,flag;
+ decl_list *cur = NULL,*psav;
+ bas_type *ptr;
+ char *sizestr;
+ const char *plus;
+ char ptemp[256];
+ int can_inline;
+
+
+ if(inlineflag == 0) {
+ for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
+ print_stat(1,&dl->decl);
}
-}
+ else {
+ for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
+ if(dl->decl.rel == REL_VECTOR){
+ f_print(fout,"\t int i;\n");
+ break;
+ }
+ size=0;can_inline=0;
+ for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
+ if((dl->decl.prefix == NULL) && ((ptr=find_type(dl->decl.type))!= NULL) && ((dl->decl.rel == REL_ALIAS)||(dl->decl.rel == REL_VECTOR))){
-static
-emit_typedef(def)
- definition *def;
-{
- char *prefix = def->def.ty.old_prefix;
- char *type = def->def.ty.old_type;
- char *amax = def->def.ty.array_max;
- relation rel = def->def.ty.rel;
+ if(dl->decl.rel == REL_ALIAS)
+ size+=ptr->length;
+ else {
+ can_inline=1;
+ break; /* can be inlined */
+ };
+ }
+ else {
+ if(size >= inlineflag){
+ can_inline=1;
+ break; /* can be inlined */
+ }
+ size=0;
+ }
+ if(size > inlineflag)
+ can_inline=1;
+
+ if(can_inline == 0){ /* can not inline, drop back to old mode */
+ for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
+ print_stat(1,&dl->decl);
+ return;
+ };
+
+
+
+
+ flag=PUT;
+ for(j=0; j<2; j++){
+
+ if(flag == PUT)
+ f_print(fout,"\n\t if (xdrs->x_op == XDR_ENCODE) {\n");
+ else
+ f_print(fout,"\n \t return (TRUE);\n\t} else if (xdrs->x_op == XDR_DECODE) {\n");
+
+
+ i=0;
+ size=0;
+ sizestr=NULL;
+ for (dl = def->def.st.decls; dl != NULL; dl = dl->next) { /* xxx */
+
+ /* now walk down the list and check for basic types */
+ if((dl->decl.prefix == NULL) && ((ptr=find_type(dl->decl.type))!= NULL) && ((dl->decl.rel == REL_ALIAS)||(dl->decl.rel == REL_VECTOR))){
+ if(i ==0 )
+ cur=dl;
+ i++;
+
+ if(dl->decl.rel == REL_ALIAS)
+ size+=ptr->length;
+ else {
+ /* this is required to handle arrays */
+
+ if(sizestr == NULL)
+ plus = " ";
+ else
+ plus = "+";
+
+ if(ptr->length != 1)
+ s_print(ptemp," %s %s * %d",plus,dl->decl.array_max,ptr->length);
+ else
+ s_print(ptemp," %s %s ",plus,dl->decl.array_max);
+
+ /*now concatenate to sizestr !!!! */
+ if (sizestr == NULL)
+ sizestr=strdup(ptemp);
+ else{
+ sizestr=realloc(sizestr,strlen(sizestr)+strlen(ptemp)+1);
+ if(sizestr == NULL){
+
+ f_print(stderr, "Fatal error : no memory \n");
+ crash();
+ };
+ sizestr=strcat(sizestr,ptemp); /*build up length of array */
+
+ }
+ }
+
+ }
+ else{
+ if(i > 0 )
+ if(sizestr == NULL && size < inlineflag){
+ /* don't expand into inline code if size < inlineflag */
+ while(cur != dl){
+ print_stat(1,&cur->decl);
+ cur=cur->next;
+ }
+ }
+ else{
+
+
+
+ /* were already looking at a xdr_inlineable structure */
+ if(sizestr == NULL)
+ f_print(fout,"\t buf = XDR_INLINE(xdrs,%d * BYTES_PER_XDR_UNIT);",
+ size);
+ else
+ if(size == 0)
+ f_print(fout,
+ "\t buf = XDR_INLINE(xdrs,%s * BYTES_PER_XDR_UNIT);",
+ sizestr);
+ else
+ f_print(fout,
+ "\t buf = XDR_INLINE(xdrs,(%d + %s)* BYTES_PER_XDR_UNIT);",
+ size,sizestr);
+
+ f_print(fout,"\n\t if (buf == NULL) {\n");
+
+ psav=cur;
+ while(cur != dl){
+ print_stat(2,&cur->decl);
+ cur=cur->next;
+ }
+
+ f_print(fout,"\n\t }\n\t else {\n");
+
+ cur=psav;
+ while(cur != dl){
+ emit_inline(&cur->decl,flag);
+ cur=cur->next;
+ }
+
+ f_print(fout,"\t }\n");
+ }
+ size=0;i=0;sizestr=NULL;
+ print_stat(1,&dl->decl);
+ }
- print_ifstat(1, prefix, type, rel, amax, "objp", def->def_name);
+ }
+ if(i > 0 )
+ if(sizestr == NULL && size < inlineflag){
+ /* don't expand into inline code if size < inlineflag */
+ while(cur != dl){
+ print_stat(1,&cur->decl);
+ cur=cur->next;
+ }
+ }
+ else{
+
+ /* were already looking at a xdr_inlineable structure */
+ if(sizestr == NULL)
+ f_print(fout,"\t\tbuf = XDR_INLINE(xdrs,%d * BYTES_PER_XDR_UNIT);",
+ size);
+ else
+ if(size == 0)
+ f_print(fout,
+ "\t\tbuf = XDR_INLINE(xdrs,%s * BYTES_PER_XDR_UNIT);",
+ sizestr);
+ else
+ f_print(fout,
+ "\t\tbuf = XDR_INLINE(xdrs,(%d + %s)* BYTES_PER_XDR_UNIT);",
+ size,sizestr);
+
+ f_print(fout,"\n\t\tif (buf == NULL) {\n");
+
+ psav=cur;
+ while(cur != NULL){
+ print_stat(2,&cur->decl);
+ cur=cur->next;
+ }
+ f_print(fout,"\n\t }\n\t else {\n");
+
+ cur=psav;
+ while(cur != dl){
+ emit_inline(&cur->decl,flag);
+ cur=cur->next;
+ }
+
+ f_print(fout,"\t }\n");
+
+ }
+ flag=GET;
+ }
+ f_print(fout,"\t return(TRUE);\n\t}\n\n");
+
+ /* now take care of XDR_FREE case */
+
+ for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
+ print_stat(1,&dl->decl);
+ }
}
+static void
+emit_typedef(definition *def)
+{
+ const char *prefix = def->def.ty.old_prefix;
+ const char *type = def->def.ty.old_type;
+ const char *amax = def->def.ty.array_max;
+ relation rel = def->def.ty.rel;
+ print_ifstat(1, prefix, type, rel, amax, "objp", def->def_name);
+}
-static
-print_stat(dec)
- declaration *dec;
+static void
+print_stat(int indent, declaration *dec)
{
- char *prefix = dec->prefix;
- char *type = dec->type;
- char *amax = dec->array_max;
+ const char *prefix = dec->prefix;
+ const char *type = dec->type;
+ const char *amax = dec->array_max;
relation rel = dec->rel;
char name[256];
} else {
s_print(name, "&objp->%s", dec->name);
}
- print_ifstat(1, prefix, type, rel, amax, name, dec->name);
+ print_ifstat(indent, prefix, type, rel, amax, name, dec->name);
+}
+
+
+void
+emit_inline(declaration *decl, int flag)
+{
+
+/*check whether an array or not */
+
+switch(decl->rel)
+ {
+ case REL_ALIAS :
+ emit_single_in_line(decl,flag,REL_ALIAS);
+ break;
+ case REL_VECTOR :
+ f_print(fout,"\t\t{ register %s *genp; \n",decl->type);
+ f_print(fout,"\t\t for ( i = 0,genp=objp->%s;\n \t\t\ti < %s; i++){\n\t\t",
+ decl->name,decl->array_max);
+ emit_single_in_line(decl,flag,REL_VECTOR);
+ f_print(fout,"\t\t }\n\t\t };\n");
+
+ default:
+ /* ?... do nothing I guess */
+ }
+}
+
+void
+emit_single_in_line(declaration *decl, int flag, relation rel)
+{
+ char *upp_case1;
+ const char *upp_case;
+
+ if (flag == PUT) {
+ f_print(fout,"\t\t IXDR_PUT_");
+ }
+ else {
+ if(rel== REL_ALIAS) {
+ f_print(fout, "\t\t objp->%s = IXDR_GET_", decl->name);
+ }
+ else {
+ f_print(fout,"\t\t *genp++ = IXDR_GET_");
+ }
+ }
+
+ upp_case1 = upcase(decl->type);
+ upp_case = upp_case1;
+
+ /* hack - XX */
+ if (!strcmp(upp_case, "INT")) upp_case="LONG";
+ if (!strcmp(upp_case, "U_INT")) upp_case="U_LONG";
+
+ if (flag == PUT) {
+ if (rel==REL_ALIAS) {
+ f_print(fout,"%s(buf,objp->%s);\n",upp_case,decl->name);
+ }
+ else {
+ f_print(fout,"%s(buf,*genp++);\n",upp_case);
+ }
+ }
+ else {
+ f_print(fout,"%s(buf);\n",upp_case);
+ }
+
+ free(upp_case1);
+}
+
+
+static char *upcase(const char *str) {
+ char *ptr, *hptr;
+ ptr = malloc(strlen(str));
+ if (ptr == NULL) {
+ f_print(stderr,"malloc failed\n");
+ exit(1);
+ }
+ hptr=ptr;
+ while (*str != 0) {
+ *ptr++ = toupper(*str++);
+ }
+ *ptr=0;
+ return hptr;
}
-/* @(#)rpc_hout.c 2.1 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
+ *
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
+ *
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
- *
+ *
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
- *
+ *
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
- *
+ *
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#ifndef lint
-static char sccsid[] = "@(#)rpc_hout.c 1.6 87/07/28 (C) 1987 SMI";
-#endif
+
+/*
+ * From: @(#)rpc_hout.c 1.12 89/02/22 (C) 1987 SMI
+ */
+char hout_rcsid[] =
+ "$Id$";
/*
* rpc_hout.c, Header file outputter for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsystems, Inc.
*/
#include <stdio.h>
#include <ctype.h>
-#include "rpc_util.h"
#include "rpc_parse.h"
+#include "rpc_util.h"
+#include "proto.h"
+static void pconstdef(definition *def);
+static void pargdef(definition *def);
+static void pstructdef(definition *def);
+static void puniondef(definition *def);
+static void pdefine(const char *name, const char *num);
+static void puldefine(const char *name, const char *num);
+static int define_printed(proc_list *stop, version_list *start);
+static void pprogramdef(definition *def);
+static void parglist(proc_list *proc, const char *addargtype);
+static void penumdef(definition *def);
+static void ptypedef(definition *def);
+static int undefined2(const char *type, const char *stop);
/*
* Print the C-version of an xdr definition
*/
void
-print_datadef(def)
- definition *def;
+print_datadef(definition *def)
{
+
+ if (def->def_kind == DEF_PROGRAM ) /* handle data only */
+ return;
+
if (def->def_kind != DEF_CONST) {
f_print(fout, "\n");
}
break;
}
if (def->def_kind != DEF_PROGRAM && def->def_kind != DEF_CONST) {
- f_print(fout, "bool_t xdr_%s();\n", def->def_name);
+ pxdrfuncdecl( def->def_name,
+ def->def_kind != DEF_TYPEDEF ||
+ !isvectordef(def->def.ty.old_type, def->def.ty.rel));
+
}
- if (def->def_kind != DEF_CONST) {
+}
+
+
+void
+print_funcdef(definition *def)
+{
+ switch (def->def_kind) {
+ case DEF_PROGRAM:
f_print(fout, "\n");
+ pprogramdef(def);
+ break;
+ default:
+ /* ?... shouldn't happen I guess */
}
}
-static
-pconstdef(def)
- definition *def;
+void
+pxdrfuncdecl(const char *name, int pointerp)
+{
+
+ f_print(fout,"#ifdef __cplusplus \n");
+ f_print(fout, "extern \"C\" bool_t xdr_%s(XDR *, %s%s);\n", name, name, pointerp ? "*" : "");
+ f_print(fout,"#elif __STDC__ \n");
+ f_print(fout, "extern bool_t xdr_%s(XDR *, %s%s);\n", name, name, pointerp ? "*" : "");
+ f_print(fout,"#else /* Old Style C */ \n");
+ f_print(fout, "bool_t xdr_%s();\n", name);
+ f_print(fout,"#endif /* Old Style C */ \n\n");
+}
+
+
+static void
+pconstdef(definition *def)
{
pdefine(def->def_name, def->def.co);
}
-static
-pstructdef(def)
- definition *def;
+/* print out the definitions for the arguments of functions in the
+ header file
+*/
+static void
+pargdef(definition *def)
+{
+ decl_list *l;
+ version_list *vers;
+ const char *name;
+ proc_list *plist;
+
+
+ for (vers = def->def.pr.versions; vers != NULL; vers = vers->next) {
+ for(plist = vers->procs; plist != NULL;
+ plist = plist->next) {
+
+ if (!newstyle || plist->arg_num < 2) {
+ continue; /* old style or single args */
+ }
+ name = plist->args.argname;
+ f_print(fout, "struct %s {\n", name);
+ for (l = plist->args.decls;
+ l != NULL; l = l->next) {
+ pdeclaration(name, &l->decl, 1, ";\n" );
+ }
+ f_print(fout, "};\n");
+ f_print(fout, "typedef struct %s %s;\n", name, name);
+ pxdrfuncdecl(name, 0);
+ f_print( fout, "\n" );
+ }
+ }
+
+}
+
+
+static void
+pstructdef(definition *def)
{
decl_list *l;
- char *name = def->def_name;
+ const char *name = def->def_name;
f_print(fout, "struct %s {\n", name);
for (l = def->def.st.decls; l != NULL; l = l->next) {
- pdeclaration(name, &l->decl, 1);
+ pdeclaration(name, &l->decl, 1, ";\n");
}
f_print(fout, "};\n");
f_print(fout, "typedef struct %s %s;\n", name, name);
}
-static
-puniondef(def)
- definition *def;
+static void
+puniondef(definition *def)
{
case_list *l;
- char *name = def->def_name;
+ const char *name = def->def_name;
declaration *decl;
f_print(fout, "struct %s {\n", name);
}
f_print(fout, "\tunion {\n");
for (l = def->def.un.cases; l != NULL; l = l->next) {
- pdeclaration(name, &l->case_decl, 2);
+ if(l->contflag == 0)
+ pdeclaration(name, &l->case_decl, 2, ";\n" );
}
decl = def->def.un.default_decl;
if (decl && !streq(decl->type, "void")) {
- pdeclaration(name, decl, 2);
+ pdeclaration(name, decl, 2, ";\n" );
}
f_print(fout, "\t} %s_u;\n", name);
f_print(fout, "};\n");
f_print(fout, "typedef struct %s %s;\n", name, name);
}
-
-
-static
-pdefine(name, num)
- char *name;
- char *num;
+static void
+pdefine(const char *name, const char *num)
{
f_print(fout, "#define %s %s\n", name, num);
}
-static
-puldefine(name, num)
- char *name;
- char *num;
+static void
+puldefine(const char *name, const char *num)
{
f_print(fout, "#define %s ((u_long)%s)\n", name, num);
}
-static
-define_printed(stop, start)
- proc_list *stop;
- version_list *start;
+static int
+define_printed(proc_list *stop, version_list *start)
{
version_list *vers;
proc_list *proc;
/* NOTREACHED */
}
-
-static
-pprogramdef(def)
- definition *def;
+static void
+pprogramdef(definition *def)
{
version_list *vers;
proc_list *proc;
+ int i;
+ const char *ext;
+
+ pargdef(def);
puldefine(def->def_name, def->def.pr.prog_num);
for (vers = def->def.pr.versions; vers != NULL; vers = vers->next) {
+ if (tblflag) {
+ f_print(fout, "extern struct rpcgen_table %s_%s_table[];\n",
+ locase(def->def_name), vers->vers_num);
+ f_print(fout, "extern %s_%s_nproc;\n",
+ locase(def->def_name), vers->vers_num);
+ }
puldefine(vers->vers_name, vers->vers_num);
- for (proc = vers->procs; proc != NULL; proc = proc->next) {
- if (!define_printed(proc, def->def.pr.versions)) {
- puldefine(proc->proc_name, proc->proc_num);
+
+ /*
+ * Print out 3 definitions, one for ANSI-C, another for C++,
+ * a third for old style C
+ */
+
+ for (i=0;i<3;i++) {
+ if (i==0) {
+ f_print(fout,"\n#ifdef __cplusplus\n");
+ ext="extern \"C\" ";
+ }
+ else if (i==1) {
+ f_print(fout,"\n#elif __STDC__\n");
+ ext="extern " ;
+ }
+ else {
+ f_print(fout,"\n#else /* Old Style C */ \n");
+ ext="extern ";
}
- pprocdef(proc, vers);
+
+
+ for (proc = vers->procs; proc != NULL; proc = proc->next) {
+ if (!define_printed(proc, def->def.pr.versions)) {
+ puldefine(proc->proc_name, proc->proc_num);
+ }
+ f_print(fout,"%s",ext);
+ pprocdef(proc, vers, "CLIENT *", 0,i);
+ f_print(fout,"%s",ext);
+ pprocdef(proc, vers, "struct svc_req *", 1,i);
+
+ }
+
}
+ f_print(fout,"#endif /* Old Style C */ \n");
}
}
+void
+pprocdef(proc_list *proc, version_list *vp,
+ const char *addargtype, int server_p, int mode)
+{
-pprocdef(proc, vp)
- proc_list *proc;
- version_list *vp;
+
+
+
+ ptype( proc->res_prefix, proc->res_type, 1 );
+ f_print( fout, "* " );
+ if( server_p )
+ pvname_svc(proc->proc_name, vp->vers_num);
+ else
+ pvname(proc->proc_name, vp->vers_num);
+
+ /*
+ * mode 0 == cplusplus, mode 1 = ANSI-C, mode 2 = old style C
+ */
+ if(mode == 0 || mode ==1)
+ parglist(proc, addargtype);
+ else
+ f_print(fout, "();\n");
+
+
+
+}
+
+
+
+/* print out argument list of procedure */
+static void
+parglist(proc_list *proc, const char *addargtype)
{
- f_print(fout, "extern ");
- if (proc->res_prefix) {
- if (streq(proc->res_prefix, "enum")) {
- f_print(fout, "enum ");
+ decl_list *dl;
+
+ f_print(fout,"(");
+
+ if( proc->arg_num < 2 && newstyle &&
+ streq( proc->args.decls->decl.type, "void")) {
+ /* 0 argument in new style: do nothing */
} else {
- f_print(fout, "struct ");
+ for (dl = proc->args.decls; dl != NULL; dl = dl->next) {
+ ptype( dl->decl.prefix, dl->decl.type, 1 );
+ if( !newstyle )
+ f_print( fout, "*" ); /* old style passes by reference */
+
+ f_print( fout, ", " );
+ }
}
- }
- if (streq(proc->res_type, "bool")) {
- f_print(fout, "bool_t *");
- } else if (streq(proc->res_type, "string")) {
- f_print(fout, "char **");
- } else {
- f_print(fout, "%s *", fixtype(proc->res_type));
- }
- pvname(proc->proc_name, vp->vers_num);
- f_print(fout, "();\n");
+
+ f_print(fout, "%s);\n", addargtype);
+
}
-static
-penumdef(def)
- definition *def;
+static void
+penumdef(definition *def)
{
- char *name = def->def_name;
+ const char *name = def->def_name;
enumval_list *l;
- char *last = NULL;
+ const char *last = NULL;
int count = 0;
f_print(fout, "enum %s {\n", name);
f_print(fout, "typedef enum %s %s;\n", name, name);
}
-static
-ptypedef(def)
- definition *def;
+static void
+ptypedef(definition *def)
{
- char *name = def->def_name;
- char *old = def->def.ty.old_type;
+ const char *name = def->def_name;
+ const char *old = def->def.ty.old_type;
char prefix[8]; /* enough to contain "struct ", including NUL */
relation rel = def->def.ty.rel;
def->def.ty.array_max);
break;
case REL_ALIAS:
- f_print(fout, "%s%s %s", prefix, old, name);
+ f_print(fout, "%s%s %s", prefix, old, name);
break;
}
f_print(fout, ";\n");
}
}
-
-static
-pdeclaration(name, dec, tab)
- char *name;
- declaration *dec;
- int tab;
+void
+pdeclaration(const char *name, declaration *dec, int tab,
+ const char *separator)
{
char buf[8]; /* enough to hold "struct ", include NUL */
- char *prefix;
- char *type;
+ const char *prefix;
+ const char *type;
if (streq(dec->type, "void")) {
return;
break;
}
}
- f_print(fout, ";\n");
+ f_print(fout, separator );
}
-
-
-static
-undefined2(type, stop)
- char *type;
- char *stop;
+static int
+undefined2(const char *type, const char *stop)
{
list *l;
definition *def;
-/* @(#)rpc_main.c 2.2 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
*
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#ifndef lint
-static char sccsid[] = "@(#)rpc_main.c 1.7 87/06/24 (C) 1987 SMI";
-#endif
+
+/*
+ * From @(#)rpc_main.c 1.30 89/03/30 (C) 1987 SMI;
+ */
+char main_rcsid[] =
+ "$Id$";
/*
* rpc_main.c, Top level of the RPC protocol compiler.
- * Copyright (C) 1987, Sun Microsystems, Inc.
*/
#include <stdio.h>
-#include <strings.h>
+#include <string.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/param.h>
#include <sys/file.h>
-#include "rpc_util.h"
+#include <sys/stat.h>
#include "rpc_parse.h"
+#include "rpc_util.h"
#include "rpc_scan.h"
+#include "proto.h"
+
#define EXTEND 1 /* alias for TRUE */
+#define DONT_EXTEND 0 /* alias for FALSE */
+
+#define SVR4_CPP "/usr/ccs/lib/cpp"
+#define SUNOS_CPP "/lib/cpp"
+static int cppDefined = 0; /* explicit path for C preprocessor */
struct commandline {
- int cflag;
- int hflag;
- int lflag;
- int sflag;
- int mflag;
- char *infile;
- char *outfile;
+ int cflag; /* xdr C routines */
+ int hflag; /* header file */
+ int lflag; /* client side stubs */
+ int mflag; /* server side stubs */
+ int nflag; /* netid flag */
+ int sflag; /* server stubs for the given transport */
+ int tflag; /* dispatch Table file */
+ int Ssflag; /* produce server sample code */
+ int Scflag; /* produce client sample code */
+ const char *infile; /* input module name */
+ const char *outfile; /* output module name */
};
-static char *cmdname;
-static char CPP[] = "/lib/cpp";
+
+static const char *cmdname;
+
+static const char *svcclosetime = "120";
+static const char *CPP = SVR4_CPP;
static char CPPFLAGS[] = "-C";
-static char *allv[] = {
+static char pathbuf[MAXPATHLEN + 1];
+static const char *allv[] = {
"rpcgen", "-s", "udp", "-s", "tcp",
};
static int allc = sizeof(allv)/sizeof(allv[0]);
+static const char *allnv[] = {
+ "rpcgen", "-s", "netpath",
+};
+static int allnc = sizeof(allnv)/sizeof(allnv[0]);
+
+/*
+ * machinations for handling expanding argument list
+ */
+static void addarg(const char *); /* add another argument to the list */
+static void putarg(int, const char *); /* put argument at specified location */
+static void clear_args(void); /* clear argument list */
+static void checkfiles(const char *, const char *);
+ /* check if out file already exists */
+
+static void clear_args(void);
+static char *extendfile(const char *file, const char *ext);
+static void open_output(const char *infile, const char *outfile);
+static void add_warning(void);
+static void clear_args(void);
+static void find_cpp(void);
+static void open_input(const char *infile, const char *define);
+static int check_nettype(const char *name, const char *list_to_check[]);
+static void c_output(const char *infile, const char *define,
+ int extend, const char *outfile);
+static void h_output(const char *infile, const char *define,
+ int extend, const char *outfile);
+static void s_output(int argc, const char *argv[], const char *infile,
+ const char *define, int extend,
+ const char *outfile, int nomain, int netflag);
+static void l_output(const char *infile, const char *define,
+ int extend, const char *outfile);
+static void t_output(const char *infile, const char *define,
+ int extend, const char *outfile);
+static void svc_output(const char *infile, const char *define,
+ int extend, const char *outfile);
+static void clnt_output(const char *infile, const char *define,
+ int extend, const char *outfile);
+static int do_registers(int argc, const char *argv[]);
+static void addarg(const char *cp);
+static void putarg(int whereto, const char *cp);
+static void checkfiles(const char *infile, const char *outfile);
+static int parseargs(int argc, const char *argv[], struct commandline *cmd);
+static void usage(void);
+static void options_usage(void);
+static void c_initialize(void);
+static char *generate_guard(const char *pathname);
+
+
+#define ARGLISTLEN 20
+#define FIXEDARGS 2
+
+static const char *arglist[ARGLISTLEN];
+static int argcount = FIXEDARGS;
+
+
+int nonfatalerrors; /* errors */
+int inetdflag/* = 1*/; /* Support for inetd */ /* is now the default */
+int pmflag; /* Support for port monitors */
+int logflag; /* Use syslog instead of fprintf for errors */
+int tblflag; /* Support for dispatch table file */
-main(argc, argv)
- int argc;
- char *argv[];
+#define INLINE 3
+/*length at which to start doing an inline */
+int inlineflag=INLINE; /* length at which to start doing an inline. 3 = default
+ if 0, no xdr_inline code */
+
+int indefinitewait; /* If started by port monitors, hang till it wants */
+int exitnow; /* If started by port monitors, exit after the call */
+int timerflag; /* TRUE if !indefinite && !exitnow */
+int newstyle; /* newstyle of passing arguments (by value) */
+#ifdef __GNU_LIBRARY__
+int Cflag = 1 ; /* ANSI C syntax */
+#else
+int Cflag = 0 ; /* ANSI C syntax */
+#endif
+static int allfiles; /* generate all files */
+#ifdef __GNU_LIBRARY__
+int tirpcflag = 0; /* generating code for tirpc, by default */
+#else
+int tirpcflag = 1; /* generating code for tirpc, by default */
+#endif
+
+int
+main(int argc, const char *argv[])
{
struct commandline cmd;
- /* Use the libc message catalog for translations. */
- textdomain (_libc_intl_domainname);
+ (void) memset((char *)&cmd, 0, sizeof (struct commandline));
+ clear_args();
+ if (!parseargs(argc, argv, &cmd))
+ usage();
- if (!parseargs(argc, argv, &cmd)) {
- f_print(stderr,
- _("usage: %s infile\n"), cmdname);
- f_print(stderr,
- _(" %s [-c | -h | -l | -m] [-o outfile] [infile]\n"),
- cmdname);
- f_print(stderr,
- _(" %s [-s udp|tcp]* [-o outfile] [infile]\n"),
- cmdname);
- exit(1);
+ if (cmd.cflag || cmd.hflag || cmd.lflag || cmd.tflag || cmd.sflag ||
+ cmd.mflag || cmd.nflag || cmd.Ssflag || cmd.Scflag ) {
+ checkfiles(cmd.infile, cmd.outfile);
}
+ else
+ checkfiles(cmd.infile,NULL);
+
if (cmd.cflag) {
- c_output(cmd.infile, "-DRPC_XDR", !EXTEND, cmd.outfile);
+ c_output(cmd.infile, "-DRPC_XDR", DONT_EXTEND, cmd.outfile);
} else if (cmd.hflag) {
- h_output(cmd.infile, "-DRPC_HDR", !EXTEND, cmd.outfile);
+ h_output(cmd.infile, "-DRPC_HDR", DONT_EXTEND, cmd.outfile);
} else if (cmd.lflag) {
- l_output(cmd.infile, "-DRPC_CLNT", !EXTEND, cmd.outfile);
- } else if (cmd.sflag || cmd.mflag) {
- s_output(argc, argv, cmd.infile, "-DRPC_SVC", !EXTEND,
- cmd.outfile, cmd.mflag);
+ l_output(cmd.infile, "-DRPC_CLNT", DONT_EXTEND, cmd.outfile);
+ } else if (cmd.sflag || cmd.mflag || (cmd.nflag)) {
+ s_output(argc, argv, cmd.infile, "-DRPC_SVC", DONT_EXTEND,
+ cmd.outfile, cmd.mflag, cmd.nflag);
+ } else if (cmd.tflag) {
+ t_output(cmd.infile, "-DRPC_TBL", DONT_EXTEND, cmd.outfile);
+ } else if (cmd.Ssflag) {
+ svc_output(cmd.infile, "-DRPC_SERVER", DONT_EXTEND, cmd.outfile);
+ } else if (cmd.Scflag) {
+ clnt_output(cmd.infile, "-DRPC_CLIENT", DONT_EXTEND, cmd.outfile);
} else {
+ /* the rescans are required, since cpp may effect input */
c_output(cmd.infile, "-DRPC_XDR", EXTEND, "_xdr.c");
reinitialize();
h_output(cmd.infile, "-DRPC_HDR", EXTEND, ".h");
reinitialize();
l_output(cmd.infile, "-DRPC_CLNT", EXTEND, "_clnt.c");
reinitialize();
- s_output(allc, allv, cmd.infile, "-DRPC_SVC", EXTEND,
- "_svc.c", cmd.mflag);
+ if (inetdflag || !tirpcflag )
+ s_output(allc, allv, cmd.infile, "-DRPC_SVC", EXTEND,
+ "_svc.c", cmd.mflag, cmd.nflag);
+ else
+ s_output(allnc, allnv, cmd.infile, "-DRPC_SVC",
+ EXTEND, "_svc.c", cmd.mflag, cmd.nflag);
+ if (tblflag) {
+ reinitialize();
+ t_output(cmd.infile, "-DRPC_TBL", EXTEND, "_tbl.i");
+ }
+ if (allfiles) {
+ reinitialize();
+ svc_output(cmd.infile, "-DRPC_SERVER", EXTEND, "_server.c");
+ }
+ if (allfiles) {
+ reinitialize();
+ clnt_output(cmd.infile, "-DRPC_CLIENT", EXTEND, "_client.c");
+ }
}
- exit(0);
+ exit(nonfatalerrors);
+ /* NOTREACHED */
}
/*
* add extension to filename
*/
static char *
-extendfile(file, ext)
- char *file;
- char *ext;
+extendfile(const char *file, const char *ext)
{
char *res;
- char *p;
+ const char *p;
res = alloc(strlen(file) + strlen(ext) + 1);
if (res == NULL) {
abort();
}
- p = rindex(file, '.');
+ p = strrchr(file, '.');
if (p == NULL) {
p = file + strlen(file);
}
/*
* Open output file with given extension
*/
-static
-open_output(infile, outfile)
- char *infile;
- char *outfile;
+static void
+open_output(const char *infile, const char *outfile)
{
+
if (outfile == NULL) {
fout = stdout;
return;
}
+
if (infile != NULL && streq(outfile, infile)) {
- f_print(stderr, _("%s: output would overwrite %s\n"), cmdname,
+ f_print(stderr, "%s: output would overwrite %s\n", cmdname,
infile);
crash();
}
fout = fopen(outfile, "w");
if (fout == NULL) {
- f_print(stderr, _("%s: unable to open "), cmdname);
+ f_print(stderr, "%s: unable to open ", cmdname);
perror(outfile);
crash();
}
record_open(outfile);
}
+static void
+add_warning(void)
+{
+ f_print(fout, "/*\n");
+ f_print(fout, " * Please do not edit this file.\n");
+ f_print(fout, " * It was generated using rpcgen.\n");
+ f_print(fout, " */\n\n");
+}
+
+static void
+add_stdheaders(void)
+{
+ f_print(fout, "#include <rpc/types.h>\n");
+ f_print(fout, "#include <rpc/xdr.h>\n\n");
+}
+
+/* clear list of arguments */
+static void clear_args(void)
+{
+ int i;
+ for( i=FIXEDARGS; i<ARGLISTLEN; i++ )
+ arglist[i] = NULL;
+ argcount = FIXEDARGS;
+}
+
+/* make sure that a CPP exists */
+static void find_cpp(void)
+{
+ struct stat buf;
+
+ if (stat(CPP, &buf) < 0 ) { /* SVR4 or explicit cpp does not exist */
+ if (cppDefined) {
+ fprintf( stderr, "cannot find C preprocessor: %s \n", CPP );
+ crash();
+ } else { /* try the other one */
+ CPP = SUNOS_CPP;
+ if( stat( CPP, &buf ) < 0 ) { /* can't find any cpp */
+ fprintf( stderr, "cannot find any C preprocessor (cpp)\n" );
+ crash();
+ }
+ }
+ }
+}
+
/*
* Open input file with given define for C-preprocessor
*/
-static
-open_input(infile, define)
- char *infile;
- char *define;
+static void
+open_input(const char *infile, const char *define)
{
int pd[2];
(void) pipe(pd);
switch (fork()) {
case 0:
+ find_cpp();
+ putarg(0, CPP);
+ putarg(1, CPPFLAGS);
+ addarg(define);
+ addarg(infile);
+ addarg((char *)NULL);
(void) close(1);
(void) dup2(pd[1], 1);
(void) close(pd[0]);
- execl(CPP, CPP, CPPFLAGS, define, infile, NULL);
- perror("execl");
+ execv(arglist[0], (char **)arglist);
+ perror("execv");
exit(1);
case -1:
perror("fork");
}
}
+/* valid tirpc nettypes */
+static const char *valid_ti_nettypes[] =
+{
+ "netpath",
+ "visible",
+ "circuit_v",
+ "datagram_v",
+ "circuit_n",
+ "datagram_n",
+ "udp",
+ "tcp",
+ "raw",
+ NULL
+ };
+
+/* valid inetd nettypes */
+static const char *valid_i_nettypes[] =
+{
+ "udp",
+ "tcp",
+ NULL
+};
+
+static int check_nettype(const char *name, const char *list_to_check[]) {
+ int i;
+ for( i = 0; list_to_check[i] != NULL; i++ ) {
+ if( strcmp( name, list_to_check[i] ) == 0 ) {
+ return 1;
+ }
+ }
+ f_print( stderr, "illegal nettype :\'%s\'\n", name );
+ return 0;
+}
+
/*
* Compile into an XDR routine output file
*/
-static
-c_output(infile, define, extend, outfile)
- char *infile;
- char *define;
- int extend;
- char *outfile;
+
+static void
+c_output(const char *infile, const char *define, int extend,
+ const char *outfile)
{
definition *def;
char *include;
- char *outfilename;
+ const char *outfilename;
long tell;
+ c_initialize();
open_input(infile, define);
outfilename = extend ? extendfile(infile, outfile) : outfile;
open_output(infile, outfilename);
- f_print(fout, "#include <rpc/rpc.h>\n");
+ add_warning();
+ add_stdheaders();
if (infile && (include = extendfile(infile, ".h"))) {
f_print(fout, "#include \"%s\"\n", include);
free(include);
- }
+ /* .h file already contains rpc/rpc.h */
+ } else
+ f_print(fout, "#include <rpc/rpc.h>\n");
tell = ftell(fout);
- while (def = get_definition()) {
+ while ((def = get_definition())!=NULL) {
emit(def);
}
if (extend && tell == ftell(fout)) {
}
}
+void
+c_initialize(void)
+{
+
+ /* add all the starting basic types */
+
+ add_type(1,"int");
+ add_type(1,"long");
+ add_type(1,"short");
+ add_type(1,"bool");
+
+ add_type(1,"u_int");
+ add_type(1,"u_long");
+ add_type(1,"u_short");
+
+}
+
+char rpcgen_table_dcl[] = "struct rpcgen_table {\n\
+ char *(*proc)();\n\
+ xdrproc_t xdr_arg;\n\
+ unsigned len_arg;\n\
+ xdrproc_t xdr_res;\n\
+ unsigned len_res;\n\
+};\n";
+
+
+static char *generate_guard(const char *pathname) {
+ const char *filename;
+ char *guard, *tmp;
+
+ filename = strrchr(pathname, '/' ); /* find last component */
+ filename = ((filename == NULL) ? pathname : filename+1);
+ guard = strdup(filename);
+ /* convert to upper case */
+ tmp = guard;
+ while (*tmp) {
+ if (islower(*tmp))
+ *tmp = toupper(*tmp);
+ tmp++;
+ }
+
+ guard = extendfile(guard, "_H_RPCGEN");
+ return guard;
+}
+
/*
* Compile into an XDR header file
*/
-static
-h_output(infile, define, extend, outfile)
- char *infile;
- char *define;
- int extend;
- char *outfile;
+
+
+static void
+h_output(const char *infile, const char *define, int extend,
+ const char *outfile)
{
definition *def;
- char *outfilename;
+ const char *ifilename;
+ const char *outfilename;
long tell;
+ char *guard;
+ list *l;
open_input(infile, define);
outfilename = extend ? extendfile(infile, outfile) : outfile;
open_output(infile, outfilename);
+ add_warning();
+ ifilename = (infile == NULL) ? "STDIN" : infile;
+ guard = generate_guard( outfilename ? outfilename: ifilename );
+
+ f_print(fout,"#ifndef _%s\n#define _%s\n\n", guard,
+ guard);
+
+ f_print(fout, "#include <rpc/rpc.h>\n\n");
+
tell = ftell(fout);
- while (def = get_definition()) {
+ /* print data definitions */
+ while ((def = get_definition())!=NULL) {
print_datadef(def);
}
+
+ /* print function declarations.
+ Do this after data definitions because they might be used as
+ arguments for functions */
+ for (l = defined; l != NULL; l = l->next) {
+ print_funcdef(l->val);
+ }
if (extend && tell == ftell(fout)) {
(void) unlink(outfilename);
+ } else if (tblflag) {
+ f_print(fout, rpcgen_table_dcl);
}
+ f_print(fout, "\n#endif /* !_%s */\n", guard);
}
/*
* Compile into an RPC service
*/
-static
-s_output(argc, argv, infile, define, extend, outfile, nomain)
- int argc;
- char *argv[];
- char *infile;
- char *define;
- int extend;
- char *outfile;
- int nomain;
+static void
+s_output(int argc, const char *argv[], const char *infile, const char *define,
+ int extend, const char *outfile, int nomain, int netflag)
{
char *include;
definition *def;
- int foundprogram;
- char *outfilename;
+ int foundprogram = 0;
+ const char *outfilename;
open_input(infile, define);
outfilename = extend ? extendfile(infile, outfile) : outfile;
open_output(infile, outfilename);
- f_print(fout, "#include <stdio.h>\n");
- f_print(fout, "#include <rpc/rpc.h>\n");
+ add_warning();
if (infile && (include = extendfile(infile, ".h"))) {
f_print(fout, "#include \"%s\"\n", include);
free(include);
+ } else
+ f_print(fout, "#include <rpc/rpc.h>\n");
+
+ f_print(fout, "#include <stdio.h>\n");
+ f_print(fout, "#include <stdlib.h>/* getenv, exit */\n");
+ if (Cflag) {
+ f_print (fout, "#include <rpc/pmap_clnt.h> /* for pmap_unset */\n");
+ f_print (fout, "#include <string.h> /* strcmp */ \n");
+ }
+ if (strcmp(svcclosetime, "-1") == 0)
+ indefinitewait = 1;
+ else if (strcmp(svcclosetime, "0") == 0)
+ exitnow = 1;
+ else if (inetdflag || pmflag) {
+ f_print(fout, "#include <signal.h>\n");
+ timerflag = 1;
+ }
+
+ if( !tirpcflag && inetdflag )
+#ifdef __GNU_LIBRARY__
+ f_print(fout, "#include <sys/ioctl.h> /* ioctl, TIOCNOTTY */\n");
+#else
+ f_print(fout, "#include <sys/ttycom.h>/* TIOCNOTTY */\n");
+#endif
+ if( Cflag && (inetdflag || pmflag ) ) {
+#ifdef __GNU_LIBRARY__
+ f_print(fout, "#include <sys/types.h> /* open */\n");
+ f_print(fout, "#include <sys/stat.h> /* open */\n");
+ f_print(fout, "#include <fcntl.h> /* open */\n");
+ f_print(fout, "#include <unistd.h> /* getdtablesize */\n");
+#else
+ f_print(fout, "#ifdef __cplusplus\n");
+ f_print(fout, "#include <sysent.h> /* getdtablesize, open */\n");
+ f_print(fout, "#endif /* __cplusplus */\n");
+#endif
+ if( tirpcflag )
+ f_print(fout, "#include <unistd.h> /* setsid */\n");
+ }
+ if( tirpcflag )
+ f_print(fout, "#include <sys/types.h>\n");
+
+ f_print(fout, "#include <memory.h>\n");
+#ifndef __GNU_LIBRARY__
+ f_print(fout, "#include <stropts.h>\n");
+#endif
+ if (inetdflag || !tirpcflag ) {
+ f_print(fout, "#include <sys/socket.h>\n");
+ f_print(fout, "#include <netinet/in.h>\n");
+ }
+
+ if ( (netflag || pmflag) && tirpcflag ) {
+ f_print(fout, "#include <netconfig.h>\n");
+ }
+ if (/*timerflag &&*/ tirpcflag)
+ f_print(fout, "#include <sys/resource.h> /* rlimit */\n");
+ if (logflag || inetdflag || pmflag) {
+#ifdef __GNU_LIBRARY__
+ f_print(fout, "#include <syslog.h>\n");
+#else
+ f_print(fout, "#ifdef SYSLOG\n");
+ f_print(fout, "#include <syslog.h>\n");
+ f_print(fout, "#else\n");
+ f_print(fout, "#define LOG_ERR 1\n");
+ f_print(fout, "#define openlog(a, b, c)\n");
+ f_print(fout, "#endif\n");
+#endif
}
- foundprogram = 0;
- while (def = get_definition()) {
+
+ /* for ANSI-C */
+ f_print(fout, "\n#ifdef __STDC__\n#define SIG_PF void(*)(int)\n#endif\n");
+
+#ifndef __GNU_LIBRARY__
+ f_print(fout, "\n#ifdef DEBUG\n#define RPC_SVC_FG\n#endif\n");
+#endif
+ if (timerflag)
+ f_print(fout, "\n#define _RPCSVC_CLOSEDOWN %s\n", svcclosetime);
+ while ((def = get_definition())!=NULL) {
foundprogram |= (def->def_kind == DEF_PROGRAM);
}
if (extend && !foundprogram) {
(void) unlink(outfilename);
return;
}
- if (nomain) {
- write_programs((char *)NULL);
- } else {
- write_most();
- do_registers(argc, argv);
+ write_most(infile, netflag, nomain);
+ if (!nomain) {
+ if( !do_registers(argc, argv) ) {
+ if (outfilename)
+ (void) unlink(outfilename);
+ usage();
+ }
write_rest();
- write_programs("static");
}
}
-static
-l_output(infile, define, extend, outfile)
- char *infile;
- char *define;
- int extend;
- char *outfile;
+/*
+ * generate client side stubs
+ */
+static void
+l_output(const char *infile, const char *define, int extend,
+ const char *outfile)
{
char *include;
definition *def;
- int foundprogram;
- char *outfilename;
+ int foundprogram = 0;
+ const char *outfilename;
open_input(infile, define);
outfilename = extend ? extendfile(infile, outfile) : outfile;
open_output(infile, outfilename);
- f_print(fout, "#include <rpc/rpc.h>\n");
+ add_warning();
+ if (Cflag)
+ f_print (fout, "#include <memory.h> /* for memset */\n");
if (infile && (include = extendfile(infile, ".h"))) {
f_print(fout, "#include \"%s\"\n", include);
free(include);
- }
- foundprogram = 0;
- while (def = get_definition()) {
+ } else
+ f_print(fout, "#include <rpc/rpc.h>\n");
+ while ((def = get_definition())!=NULL) {
foundprogram |= (def->def_kind == DEF_PROGRAM);
}
if (extend && !foundprogram) {
}
/*
- * Perform registrations for service output
+ * generate the dispatch table
*/
-static
-do_registers(argc, argv)
- int argc;
- char *argv[];
+static void
+t_output(const char *infile, const char *define, int extend,
+ const char *outfile)
+{
+ definition *def;
+ int foundprogram = 0;
+ const char *outfilename;
+
+ open_input(infile, define);
+ outfilename = extend ? extendfile(infile, outfile) : outfile;
+ open_output(infile, outfilename);
+ add_warning();
+ while ((def = get_definition())!=NULL) {
+ foundprogram |= (def->def_kind == DEF_PROGRAM);
+ }
+ if (extend && !foundprogram) {
+ (void) unlink(outfilename);
+ return;
+ }
+ write_tables();
+}
+
+/* sample routine for the server template */
+static void
+svc_output(const char *infile, const char *define, int extend,
+ const char *outfile)
+{
+ definition *def;
+ char *include;
+ const char *outfilename;
+ long tell;
+
+ open_input(infile, define);
+ outfilename = extend ? extendfile(infile, outfile) : outfile;
+ checkfiles(infile,outfilename); /*check if outfile already exists.
+ if so, print an error message and exit*/
+ open_output(infile, outfilename);
+ add_sample_msg();
+
+ if (infile && (include = extendfile(infile, ".h"))) {
+ f_print(fout, "#include \"%s\"\n", include);
+ free(include);
+ } else
+ f_print(fout, "#include <rpc/rpc.h>\n");
+
+ tell = ftell(fout);
+ while ((def = get_definition())!=NULL) {
+ write_sample_svc(def);
+ }
+ if (extend && tell == ftell(fout)) {
+ (void) unlink(outfilename);
+ }
+}
+
+
+/* sample main routine for client */
+static void
+clnt_output(const char *infile, const char *define, int extend,
+ const char *outfile)
+{
+ definition *def;
+ char *include;
+ const char *outfilename;
+ long tell;
+ int has_program = 0;
+ open_input(infile, define);
+ outfilename = extend ? extendfile(infile, outfile) : outfile;
+ checkfiles(infile,outfilename); /*check if outfile already exists.
+ if so, print an error message and exit*/
+
+ open_output(infile, outfilename);
+ add_sample_msg();
+ if (infile && (include = extendfile(infile, ".h"))) {
+ f_print(fout, "#include \"%s\"\n", include);
+ free(include);
+ } else
+ f_print(fout, "#include <rpc/rpc.h>\n");
+ tell = ftell(fout);
+ while ((def = get_definition())!=NULL) {
+ has_program += write_sample_clnt(def);
+ }
+
+ if( has_program )
+ write_sample_clnt_main();
+
+ if (extend && tell == ftell(fout)) {
+ (void) unlink(outfilename);
+ }
+}
+
+/*
+ * Perform registrations for service output
+ * Return 0 if failed; 1 otherwise.
+ */
+static int do_registers(int argc, const char *argv[])
{
int i;
- for (i = 1; i < argc; i++) {
- if (streq(argv[i], "-s")) {
- write_register(argv[i + 1]);
- i++;
+ if ( inetdflag || !tirpcflag) {
+ for (i = 1; i < argc; i++) {
+ if (streq(argv[i], "-s")) {
+ if(!check_nettype( argv[i + 1], valid_i_nettypes ))
+ return 0;
+ write_inetd_register(argv[i + 1]);
+ i++;
+ }
}
+ } else {
+ for (i = 1; i < argc; i++)
+ if (streq(argv[i], "-s")) {
+ if(!check_nettype( argv[i + 1], valid_ti_nettypes ))
+ return 0;
+ write_nettype_register(argv[i + 1]);
+ i++;
+ } else if (streq(argv[i], "-n")) {
+ write_netid_register(argv[i + 1]);
+ i++;
+ }
}
+ return 1;
}
/*
- * Parse command line arguments
+ * Add another argument to the arg list
*/
-static
-parseargs(argc, argv, cmd)
- int argc;
- char *argv[];
- struct commandline *cmd;
+static void
+addarg(const char *cp)
+{
+ if (argcount >= ARGLISTLEN) {
+ f_print(stderr, "rpcgen: too many defines\n");
+ crash();
+ /*NOTREACHED*/
+ }
+ arglist[argcount++] = cp;
+
+}
+
+static void
+putarg(int whereto, const char *cp)
+{
+ if (whereto >= ARGLISTLEN) {
+ f_print(stderr, "rpcgen: arglist coding error\n");
+ crash();
+ /*NOTREACHED*/
+ }
+ arglist[whereto] = cp;
+}
+/*
+ * if input file is stdin and an output file is specified then complain
+ * if the file already exists. Otherwise the file may get overwritten
+ * If input file does not exist, exit with an error
+ */
+
+static void
+checkfiles(const char *infile, const char *outfile)
+{
+
+ struct stat buf;
+
+ if(infile) /* infile ! = NULL */
+ if(stat(infile,&buf) < 0)
+ {
+ perror(infile);
+ crash();
+ };
+ if (outfile) {
+ if (stat(outfile, &buf) < 0)
+ return; /* file does not exist */
+ else {
+ f_print(stderr,
+ "file '%s' already exists and may be overwritten\n", outfile);
+ crash();
+ }
+ }
+}
+
+/*
+ * Parse command line arguments
+ */
+static int
+parseargs(int argc, const char *argv[], struct commandline *cmd)
{
int i;
int j;
- char c;
+ int c;
char flag[(1 << 8 * sizeof(char))];
int nflags;
if (argc < 2) {
return (0);
}
+ allfiles = 0;
flag['c'] = 0;
flag['h'] = 0;
- flag['s'] = 0;
- flag['o'] = 0;
flag['l'] = 0;
flag['m'] = 0;
+ flag['o'] = 0;
+ flag['s'] = 0;
+ flag['n'] = 0;
+ flag['t'] = 0;
+ flag['S'] = 0;
+ flag['C'] = 0;
for (i = 1; i < argc; i++) {
if (argv[i][0] != '-') {
if (cmd->infile) {
+ f_print( stderr, "Cannot specify more than one input file!\n");
+
return (0);
}
cmd->infile = argv[i];
for (j = 1; argv[i][j] != 0; j++) {
c = argv[i][j];
switch (c) {
+ case 'a':
+ allfiles = 1;
+ break;
case 'c':
case 'h':
case 'l':
case 'm':
+ case 't':
if (flag[c]) {
return (0);
}
flag[c] = 1;
break;
+ case 'S':
+ /* sample flag: Ss or Sc.
+ Ss means set flag['S'];
+ Sc means set flag['C']; */
+ c = argv[i][++j]; /* get next char */
+ if( c == 's' )
+ c = 'S';
+ else if( c == 'c' )
+ c = 'C';
+ else
+ return( 0 );
+
+ if (flag[c]) {
+ return (0);
+ }
+ flag[c] = 1;
+ break;
+ case 'C': /* ANSI C syntax */
+ Cflag = 1;
+ break;
+
+#ifdef __GNU_LIBRARY__
+ case 'k': /* K&R C syntax */
+ Cflag = 0;
+ break;
+
+#endif
+ case 'b': /* turn TIRPC flag off for
+ generating backward compatible
+ */
+ tirpcflag = 0;
+ break;
+
+#ifdef __GNU_LIBRARY__
+ case '5': /* turn TIRPC flag on for
+ generating SysVr4 compatible
+ */
+ tirpcflag = 1;
+ break;
+
+#endif
+ case 'I':
+ inetdflag = 1;
+ break;
+ case 'N':
+ newstyle = 1;
+ break;
+ case 'L':
+ logflag = 1;
+ break;
+ case 'K':
+ if (++i == argc) {
+ return (0);
+ }
+ svcclosetime = argv[i];
+ goto nextarg;
+ case 'T':
+ tblflag = 1;
+ break;
+ case 'i' :
+ if (++i == argc) {
+ return (0);
+ }
+ inlineflag = atoi(argv[i]);
+ goto nextarg;
+ case 'n':
case 'o':
case 's':
if (argv[i][j - 1] != '-' ||
cmd->outfile = argv[i];
}
goto nextarg;
+ case 'D':
+ if (argv[i][j - 1] != '-') {
+ return (0);
+ }
+ (void) addarg(argv[i]);
+ goto nextarg;
+ case 'Y':
+ if (++i == argc) {
+ return (0);
+ }
+ (void) strcpy(pathbuf, argv[i]);
+ (void) strcat(pathbuf, "/cpp");
+ CPP = pathbuf;
+ cppDefined = 1;
+ goto nextarg;
+
+
default:
return (0);
;
}
}
+
cmd->cflag = flag['c'];
cmd->hflag = flag['h'];
- cmd->sflag = flag['s'];
cmd->lflag = flag['l'];
cmd->mflag = flag['m'];
- nflags = cmd->cflag + cmd->hflag + cmd->sflag + cmd->lflag + cmd->mflag;
+ cmd->nflag = flag['n'];
+ cmd->sflag = flag['s'];
+ cmd->tflag = flag['t'];
+ cmd->Ssflag = flag['S'];
+ cmd->Scflag = flag['C'];
+
+ if( tirpcflag ) {
+ pmflag = inetdflag ? 0 : 1; /* pmflag or inetdflag is always TRUE */
+ if( (inetdflag && cmd->nflag)) { /* netid not allowed with inetdflag */
+ f_print(stderr, "Cannot use netid flag with inetd flag!\n");
+ return (0);
+ }
+ } else { /* 4.1 mode */
+ pmflag = 0; /* set pmflag only in tirpcmode */
+#ifndef __GNU_LIBRARY__
+ inetdflag = 1; /* inetdflag is TRUE by default */
+#endif
+ if( cmd->nflag ) { /* netid needs TIRPC */
+ f_print( stderr, "Cannot use netid flag without TIRPC!\n");
+ return( 0 );
+ }
+ }
+
+ if( newstyle && ( tblflag || cmd->tflag) ) {
+ f_print( stderr, "Cannot use table flags with newstyle!\n");
+ return( 0 );
+ }
+
+ /* check no conflicts with file generation flags */
+ nflags = cmd->cflag + cmd->hflag + cmd->lflag + cmd->mflag +
+ cmd->sflag + cmd->nflag + cmd->tflag + cmd->Ssflag + cmd->Scflag;
+
if (nflags == 0) {
if (cmd->outfile != NULL || cmd->infile == NULL) {
return (0);
}
} else if (nflags > 1) {
+ f_print( stderr, "Cannot have more than one file generation flag!\n");
return (0);
}
return (1);
}
+
+static void
+usage(void)
+{
+ f_print(stderr, "usage: %s infile\n", cmdname);
+ f_print(stderr, "\t%s [-a][-b][-C][-Dname[=value]] -i size [-I [-K seconds]] [-L][-N][-T] infile\n",
+ cmdname);
+ f_print(stderr, "\t%s [-c | -h | -l | -m | -t | -Sc | -Ss] [-o outfile] [infile]\n",
+ cmdname);
+ f_print(stderr, "\t%s [-s nettype]* [-o outfile] [infile]\n", cmdname);
+ f_print(stderr, "\t%s [-n netid]* [-o outfile] [infile]\n", cmdname);
+ options_usage();
+ exit(1);
+}
+
+static void
+options_usage(void)
+{
+ f_print(stderr, "options:\n");
+ f_print(stderr, "-a\t\tgenerate all files, including samples\n");
+ f_print(stderr, "-b\t\tbackward compatibility mode (generates code for SunOS 4.1)\n");
+ f_print(stderr, "-c\t\tgenerate XDR routines\n");
+ f_print(stderr, "-C\t\tANSI C mode\n");
+ f_print(stderr, "-Dname[=value]\tdefine a symbol (same as #define)\n");
+ f_print(stderr, "-h\t\tgenerate header file\n");
+ f_print(stderr, "-i size\t\tsize at which to start generating inline code\n");
+ f_print(stderr, "-I\t\tgenerate code for inetd support in server (for SunOS 4.1)\n");
+ f_print(stderr, "-K seconds\tserver exits after K seconds of inactivity\n");
+ f_print(stderr, "-l\t\tgenerate client side stubs\n");
+ f_print(stderr, "-L\t\tserver errors will be printed to syslog\n");
+ f_print(stderr, "-m\t\tgenerate server side stubs\n");
+ f_print(stderr, "-n netid\tgenerate server code that supports named netid\n");
+ f_print(stderr, "-N\t\tsupports multiple arguments and call-by-value\n");
+ f_print(stderr, "-o outfile\tname of the output file\n");
+ f_print(stderr, "-s nettype\tgenerate server code that supports named nettype\n");
+ f_print(stderr, "-Sc\t\tgenerate sample client code that uses remote procedures\n");
+ f_print(stderr, "-Ss\t\tgenerate sample server code that defines remote procedures\n");
+ f_print(stderr, "-t\t\tgenerate RPC dispatch table\n");
+ f_print(stderr, "-T\t\tgenerate code to support RPC dispatch tables\n");
+ f_print(stderr, "-Y path\t\tdirectory name to find C preprocessor (cpp)\n");
+
+ exit(1);
+}
-/* @(#)rpc_parse.c 2.1 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
*
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#ifndef lint
-static char sccsid[] = "@(#)rpc_parse.c 1.4 87/04/28 (C) 1987 SMI";
-#endif
/*
- * rpc_parse.c, Parser for the RPC protocol compiler
+ * From: @(#)rpc_parse.c 1.8 89/02/22 (C) 1987 SMI
+ */
+char parse_rcsid[] =
+ "$Id$";
+
+/*
+ * rpc_parse.c, Parser for the RPC protocol compiler
* Copyright (C) 1987 Sun Microsystems, Inc.
*/
#include <stdio.h>
-#include "rpc_util.h"
+#include <string.h>
+#include "rpc/types.h"
#include "rpc_scan.h"
#include "rpc_parse.h"
+#include "rpc_util.h"
+#include "proto.h"
+
+#define ARGNAME "arg"
+
+static void isdefined(definition *defp);
+static void def_struct(definition *defp);
+static void def_program(definition *defp);
+static void def_enum(definition *defp);
+static void def_const(definition *defp);
+static void def_union(definition *defp);
+static void check_type_name(const char *name, int new_type);
+static void def_typedef(definition *defp);
+static void get_declaration(declaration *dec, defkind dkind);
+static void get_prog_declaration(declaration *dec, defkind dkind, int num);
+static void get_type(const char **prefixp, const char **typep, defkind dkind);
+static void unsigned_dec(const char **typep);
/*
* return the next definition you see
*/
definition *
-get_definition()
+get_definition(void)
{
definition *defp;
token tok;
break;
case TOK_EOF:
return (NULL);
- break;
default:
- error(_("definition keyword expected"));
+ error("definition keyword expected");
}
scan(TOK_SEMICOLON, &tok);
isdefined(defp);
return (defp);
}
-static
-isdefined(defp)
- definition *defp;
+static void
+isdefined(definition *defp)
{
STOREVAL(&defined, defp);
}
-
-static
-def_struct(defp)
- definition *defp;
+static void
+def_struct(definition *defp)
{
token tok;
declaration dec;
*tailp = NULL;
}
-static
-def_program(defp)
- definition *defp;
+static void
+def_program(definition *defp)
{
token tok;
+ declaration dec;
+ decl_list *decls;
+ decl_list **tailp;
version_list *vlist;
version_list **vtailp;
proc_list *plist;
proc_list **ptailp;
-
+ int num_args;
+ bool_t isvoid = FALSE; /* whether first argument is void */
defp->def_kind = DEF_PROGRAM;
scan(TOK_IDENT, &tok);
defp->def_name = tok.str;
scan(TOK_LBRACE, &tok);
vtailp = &defp->def.pr.versions;
+ tailp = &defp->def.st.decls;
scan(TOK_VERSION, &tok);
do {
scan(TOK_IDENT, &tok);
scan(TOK_LBRACE, &tok);
ptailp = &vlist->procs;
do {
+ /* get result type */
plist = ALLOC(proc_list);
- get_type(&plist->res_prefix, &plist->res_type, DEF_PROGRAM);
+ get_type(&plist->res_prefix, &plist->res_type,
+ DEF_PROGRAM);
if (streq(plist->res_type, "opaque")) {
- error(_("illegal result type"));
+ error("illegal result type");
}
scan(TOK_IDENT, &tok);
plist->proc_name = tok.str;
scan(TOK_LPAREN, &tok);
- get_type(&plist->arg_prefix, &plist->arg_type, DEF_PROGRAM);
- if (streq(plist->arg_type, "opaque")) {
- error("illegal argument type");
+ /* get args - first one*/
+ num_args = 1;
+ isvoid = FALSE;
+ /* type of DEF_PROGRAM in the first
+ * get_prog_declaration and DEF_STURCT in the next
+ * allows void as argument if it is the only argument
+ */
+ get_prog_declaration(&dec, DEF_PROGRAM, num_args);
+ if (streq(dec.type, "void"))
+ isvoid = TRUE;
+ decls = ALLOC(decl_list);
+ plist->args.decls = decls;
+ decls->decl = dec;
+ tailp = &decls->next;
+ /* get args */
+ while(peekscan(TOK_COMMA, &tok)) {
+ num_args++;
+ get_prog_declaration(&dec, DEF_STRUCT,
+ num_args);
+ decls = ALLOC(decl_list);
+ decls->decl = dec;
+ *tailp = decls;
+ if (streq(dec.type, "void"))
+ isvoid = TRUE;
+ tailp = &decls->next;
+ }
+ /* multiple arguments are only allowed in newstyle */
+ if( !newstyle && num_args > 1 ) {
+ error("only one argument is allowed" );
+ }
+ if (isvoid && num_args > 1) {
+ error("illegal use of void in program definition");
}
+ *tailp = NULL;
scan(TOK_RPAREN, &tok);
scan(TOK_EQUAL, &tok);
scan_num(&tok);
scan(TOK_SEMICOLON, &tok);
plist->proc_num = tok.str;
+ plist->arg_num = num_args;
*ptailp = plist;
ptailp = &plist->next;
peek(&tok);
} while (tok.kind != TOK_RBRACE);
+ *ptailp = NULL;
*vtailp = vlist;
vtailp = &vlist->next;
scan(TOK_RBRACE, &tok);
scan(TOK_EQUAL, &tok);
scan_num(&tok);
vlist->vers_num = tok.str;
+ /* make the argument structure name for each arg*/
+ for(plist = vlist->procs; plist != NULL;
+ plist = plist->next) {
+ plist->args.argname = make_argname(plist->proc_name,
+ vlist->vers_num);
+ /* free the memory ??*/
+ }
scan(TOK_SEMICOLON, &tok);
scan2(TOK_VERSION, TOK_RBRACE, &tok);
} while (tok.kind == TOK_VERSION);
*vtailp = NULL;
}
-static
-def_enum(defp)
- definition *defp;
+
+static void
+def_enum(definition *defp)
{
token tok;
enumval_list *elist;
*tailp = NULL;
}
-static
-def_const(defp)
- definition *defp;
+static void
+def_const(definition *defp)
{
token tok;
defp->def.co = tok.str;
}
-static
-def_union(defp)
- definition *defp;
+static void
+def_union(definition *defp)
{
- token tok;
- declaration dec;
- case_list *cases;
- case_list **tailp;
+ token tok;
+ declaration dec;
+ case_list *cases;
+/* case_list *tcase; */
+ case_list **tailp;
+ int flag;
- defp->def_kind = DEF_UNION;
- scan(TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan(TOK_SWITCH, &tok);
- scan(TOK_LPAREN, &tok);
- get_declaration(&dec, DEF_UNION);
- defp->def.un.enum_decl = dec;
- tailp = &defp->def.un.cases;
- scan(TOK_RPAREN, &tok);
- scan(TOK_LBRACE, &tok);
- scan(TOK_CASE, &tok);
- while (tok.kind == TOK_CASE) {
- scan(TOK_IDENT, &tok);
- cases = ALLOC(case_list);
- cases->case_name = tok.str;
- scan(TOK_COLON, &tok);
- get_declaration(&dec, DEF_UNION);
- cases->case_decl = dec;
- *tailp = cases;
- tailp = &cases->next;
- scan(TOK_SEMICOLON, &tok);
- scan3(TOK_CASE, TOK_DEFAULT, TOK_RBRACE, &tok);
- }
- *tailp = NULL;
- if (tok.kind == TOK_DEFAULT) {
- scan(TOK_COLON, &tok);
- get_declaration(&dec, DEF_UNION);
- defp->def.un.default_decl = ALLOC(declaration);
- *defp->def.un.default_decl = dec;
- scan(TOK_SEMICOLON, &tok);
- scan(TOK_RBRACE, &tok);
- } else {
- defp->def.un.default_decl = NULL;
- }
+ defp->def_kind = DEF_UNION;
+ scan(TOK_IDENT, &tok);
+ defp->def_name = tok.str;
+ scan(TOK_SWITCH, &tok);
+ scan(TOK_LPAREN, &tok);
+ get_declaration(&dec, DEF_UNION);
+ defp->def.un.enum_decl = dec;
+ tailp = &defp->def.un.cases;
+ scan(TOK_RPAREN, &tok);
+ scan(TOK_LBRACE, &tok);
+ scan(TOK_CASE, &tok);
+ while (tok.kind == TOK_CASE) {
+ scan2(TOK_IDENT, TOK_CHARCONST, &tok);
+ cases = ALLOC(case_list);
+ cases->case_name = tok.str;
+ scan(TOK_COLON, &tok);
+ /* now peek at next token */
+ flag=0;
+ if(peekscan(TOK_CASE,&tok))
+ {
+
+ do
+ {
+ scan2(TOK_IDENT, TOK_CHARCONST, &tok);
+ cases->contflag=1; /* continued case statement */
+ *tailp = cases;
+ tailp = &cases->next;
+ cases = ALLOC(case_list);
+ cases->case_name = tok.str;
+ scan(TOK_COLON, &tok);
+
+ }while(peekscan(TOK_CASE,&tok));
+ }
+ else
+ if(flag)
+ {
+
+ *tailp = cases;
+ tailp = &cases->next;
+ cases = ALLOC(case_list);
+ };
+
+ get_declaration(&dec, DEF_UNION);
+ cases->case_decl = dec;
+ cases->contflag=0; /* no continued case statement */
+ *tailp = cases;
+ tailp = &cases->next;
+ scan(TOK_SEMICOLON, &tok);
+
+ scan3(TOK_CASE, TOK_DEFAULT, TOK_RBRACE, &tok);
+ }
+ *tailp = NULL;
+ if (tok.kind == TOK_DEFAULT) {
+ scan(TOK_COLON, &tok);
+ get_declaration(&dec, DEF_UNION);
+ defp->def.un.default_decl = ALLOC(declaration);
+ *defp->def.un.default_decl = dec;
+ scan(TOK_SEMICOLON, &tok);
+ scan(TOK_RBRACE, &tok);
+ } else {
+ defp->def.un.default_decl = NULL;
+ }
}
+static const char *reserved_words[] =
+{
+ "array",
+ "bytes",
+ "destroy",
+ "free",
+ "getpos",
+ "inline",
+ "pointer",
+ "reference",
+ "setpos",
+ "sizeof",
+ "union",
+ "vector",
+ NULL
+ };
-static
-def_typedef(defp)
- definition *defp;
+static const char *reserved_types[] =
+{
+ "opaque",
+ "string",
+ NULL
+ };
+
+/*
+ * check that the given name is not one that would eventually result in
+ * xdr routines that would conflict with internal XDR routines.
+ */
+static void check_type_name(const char *name, int new_type)
+{
+ int i;
+ char tmp[100];
+
+ for( i = 0; reserved_words[i] != NULL; i++ ) {
+ if( strcmp( name, reserved_words[i] ) == 0 ) {
+ sprintf(tmp,
+ "illegal (reserved) name :\'%s\' in type definition", name );
+ error(tmp);
+ }
+ }
+ if( new_type ) {
+ for( i = 0; reserved_types[i] != NULL; i++ ) {
+ if( strcmp( name, reserved_types[i] ) == 0 ) {
+ sprintf(tmp,
+ "illegal (reserved) name :\'%s\' in type definition", name );
+ error(tmp);
+ }
+ }
+ }
+}
+
+
+
+static void
+def_typedef(definition *defp)
{
declaration dec;
defp->def_kind = DEF_TYPEDEF;
get_declaration(&dec, DEF_TYPEDEF);
defp->def_name = dec.name;
+ check_type_name(dec.name, 1);
defp->def.ty.old_prefix = dec.prefix;
defp->def.ty.old_type = dec.type;
defp->def.ty.rel = dec.rel;
defp->def.ty.array_max = dec.array_max;
}
-
-static
-get_declaration(dec, dkind)
- declaration *dec;
- defkind dkind;
+static void
+get_declaration(declaration *dec, defkind dkind)
{
token tok;
if (streq(dec->type, "void")) {
return;
}
+
+ check_type_name(dec->type, 0);
+
scan2(TOK_STAR, TOK_IDENT, &tok);
if (tok.kind == TOK_STAR) {
dec->rel = REL_POINTER;
dec->name = tok.str;
if (peekscan(TOK_LBRACKET, &tok)) {
if (dec->rel == REL_POINTER) {
- error(_("no array-of-pointer declarations -- use typedef"));
+ error("no array-of-pointer declarations -- use typedef");
}
dec->rel = REL_VECTOR;
scan_num(&tok);
scan(TOK_RBRACKET, &tok);
} else if (peekscan(TOK_LANGLE, &tok)) {
if (dec->rel == REL_POINTER) {
- error(_("no array-of-pointer declarations -- use typedef"));
+ error("no array-of-pointer declarations -- use typedef");
}
dec->rel = REL_ARRAY;
if (peekscan(TOK_RANGLE, &tok)) {
}
if (streq(dec->type, "opaque")) {
if (dec->rel != REL_ARRAY && dec->rel != REL_VECTOR) {
- error(_("array declaration expected"));
+ error("array declaration expected");
}
} else if (streq(dec->type, "string")) {
if (dec->rel != REL_ARRAY) {
- error(_("variable-length array declaration expected"));
+ error("variable-length array declaration expected");
}
}
}
-static
-get_type(prefixp, typep, dkind)
- char **prefixp;
- char **typep;
- defkind dkind;
+static void
+get_prog_declaration(declaration *dec, defkind dkind, int num /* arg number */)
+{
+ token tok;
+ char name[10]; /* argument name */
+
+ if (dkind == DEF_PROGRAM) {
+ peek(&tok);
+ if (tok.kind == TOK_RPAREN) { /* no arguments */
+ dec->rel = REL_ALIAS;
+ dec->type = "void";
+ dec->prefix = NULL;
+ dec->name = NULL;
+ return;
+ }
+ }
+ get_type(&dec->prefix, &dec->type, dkind);
+ dec->rel = REL_ALIAS;
+ if (peekscan(TOK_IDENT, &tok)) /* optional name of argument */
+ strcpy(name, tok.str);
+ else
+ sprintf(name, "%s%d", ARGNAME, num); /* default name of argument */
+
+ dec->name = (char *) strdup(name);
+
+ if (streq(dec->type, "void")) {
+ return;
+ }
+
+ if (streq(dec->type, "opaque")) {
+ error("opaque -- illegal argument type");
+ }
+ if (peekscan(TOK_STAR, &tok)) {
+ if (streq(dec->type, "string")) {
+ error("pointer to string not allowed in program arguments\n");
+ }
+ dec->rel = REL_POINTER;
+ if (peekscan(TOK_IDENT, &tok)) /* optional name of argument */
+ dec->name = strdup(tok.str);
+ }
+ if (peekscan(TOK_LANGLE, &tok)) {
+ if (!streq(dec->type, "string")) {
+ error("arrays cannot be declared as arguments to procedures -- use typedef");
+ }
+ dec->rel = REL_ARRAY;
+ if (peekscan(TOK_RANGLE, &tok)) {
+ dec->array_max = "~0";/* unspecified size, use max */
+ } else {
+ scan_num(&tok);
+ dec->array_max = tok.str;
+ scan(TOK_RANGLE, &tok);
+ }
+ }
+ if (streq(dec->type, "string")) {
+ if (dec->rel != REL_ARRAY) { /* .x specifies just string as
+ * type of argument
+ * - make it string<>
+ */
+ dec->rel = REL_ARRAY;
+ dec->array_max = "~0";/* unspecified size, use max */
+ }
+ }
+}
+
+
+
+static void
+get_type(const char **prefixp, const char **typep, defkind dkind)
{
token tok;
break;
case TOK_VOID:
if (dkind != DEF_UNION && dkind != DEF_PROGRAM) {
- error(_("voids allowed only inside union and program definitions"));
+ error("voids allowed only inside union and program definitions with one argument");
}
*typep = tok.str;
break;
*typep = tok.str;
break;
default:
- error(_("expected type specifier"));
+ error("expected type specifier");
}
}
-
-static
-unsigned_dec(typep)
- char **typep;
+static void
+unsigned_dec(const char **typep)
{
token tok;
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
+ *
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
+ *
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
- *
+ *
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
- *
+ *
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
- *
+ *
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-/* @(#)rpc_parse.h 1.3 87/03/09 (C) 1987 SMI */
+
+/* @(#)rpc_parse.h 1.3 90/08/29 (C) 1987 SMI */
/*
* rpc_parse.h, Definitions for the RPCL parser
- * Copyright (C) 1987, Sun Microsystems, Inc.
*/
enum defkind {
};
typedef enum defkind defkind;
-typedef char *const_def;
+typedef const char *const_def;
enum relation {
REL_VECTOR, /* fixed length array */
typedef enum relation relation;
struct typedef_def {
- char *old_prefix;
- char *old_type;
+ const char *old_prefix;
+ const char *old_type;
relation rel;
- char *array_max;
+ const char *array_max;
};
typedef struct typedef_def typedef_def;
-
struct enumval_list {
- char *name;
- char *assignment;
+ const char *name;
+ const char *assignment;
struct enumval_list *next;
};
typedef struct enumval_list enumval_list;
};
typedef struct enum_def enum_def;
-
struct declaration {
- char *prefix;
- char *type;
- char *name;
+ const char *prefix;
+ const char *type;
+ const char *name;
relation rel;
- char *array_max;
+ const char *array_max;
};
typedef struct declaration declaration;
-
struct decl_list {
declaration decl;
struct decl_list *next;
};
typedef struct struct_def struct_def;
-
struct case_list {
- char *case_name;
+ const char *case_name;
+ int contflag;
declaration case_decl;
struct case_list *next;
};
};
typedef struct union_def union_def;
-
+struct arg_list {
+ const char *argname; /* name of struct for arg*/
+ decl_list *decls;
+};
+
+typedef struct arg_list arg_list;
struct proc_list {
- char *proc_name;
- char *proc_num;
- char *arg_type;
- char *arg_prefix;
- char *res_type;
- char *res_prefix;
+ const char *proc_name;
+ const char *proc_num;
+ arg_list args;
+ int arg_num;
+ const char *res_type;
+ const char *res_prefix;
struct proc_list *next;
};
typedef struct proc_list proc_list;
-
struct version_list {
- char *vers_name;
- char *vers_num;
+ const char *vers_name;
+ const char *vers_num;
proc_list *procs;
struct version_list *next;
};
typedef struct version_list version_list;
struct program_def {
- char *prog_num;
+ const char *prog_num;
version_list *versions;
};
typedef struct program_def program_def;
struct definition {
- char *def_name;
+ const char *def_name;
defkind def_kind;
union {
const_def co;
};
typedef struct definition definition;
-/* @(#)rpc_parse.h 2.1 88/08/01 4.0 RPCSRC */
-definition *get_definition();
+definition *get_definition(void);
+
+
+struct bas_type
+{
+ const char *name;
+ int length;
+ struct bas_type *next;
+};
+
+typedef struct bas_type bas_type;
--- /dev/null
+/*
+ * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
+ * unrestricted use provided that this legend is included on all tape
+ * media and as a part of the software program in whole or part. Users
+ * may copy or modify Sun RPC without charge, but are not authorized
+ * to license or distribute it to anyone else except as part of a product or
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
+ *
+ * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
+ * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun RPC is provided with no support and without any obligation on the
+ * part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ */
+
+/*
+ * From: @(#)rpc_sample.c 1.1 90/08/30 (C) 1987 SMI
+ */
+char sample_rcsid[] =
+ "$Id$";
+
+/*
+ * rpc_sample.c, Sample client-server code outputter for the RPC protocol compiler
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "rpc_parse.h"
+#include "rpc_util.h"
+#include "proto.h"
+
+
+static char RQSTP[] = "rqstp";
+
+static void write_sample_client(const char *program_name, version_list *vp);
+static void write_sample_server(definition *def);
+static void return_type(proc_list *plist);
+
+
+void
+write_sample_svc(definition *def)
+{
+
+ if (def->def_kind != DEF_PROGRAM)
+ return;
+ write_sample_server(def);
+}
+
+
+int
+write_sample_clnt(definition *def)
+{
+ version_list *vp;
+ int count = 0;
+
+ if (def->def_kind != DEF_PROGRAM)
+ return( 0 );
+ /* generate sample code for each version */
+ for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
+ write_sample_client(def->def_name, vp );
+ ++count;
+ }
+ return( count );
+}
+
+
+static void
+write_sample_client(const char *program_name, version_list *vp)
+{
+ proc_list *proc;
+ int i;
+ decl_list *l;
+
+ f_print(fout, "\n\nvoid\n" );
+ pvname( program_name, vp->vers_num );
+ if( Cflag )
+ f_print(fout,"( char* host )\n{\n" );
+ else
+ f_print(fout, "(host)\nchar *host;\n{\n" );
+ f_print(fout, "\tCLIENT *clnt;\n");
+
+ i = 0;
+ for (proc = vp->procs; proc != NULL; proc = proc->next) {
+ f_print(fout, "\t");
+ ptype(proc->res_prefix, proc->res_type, 1);
+ f_print(fout, " *result_%d;\n",++i);
+ /* print out declarations for arguments */
+ if( proc->arg_num < 2 && !newstyle) {
+ f_print( fout, "\t" );
+ if( !streq( proc->args.decls->decl.type, "void") )
+ ptype(proc->args.decls->decl.prefix, proc->args.decls->decl.type, 1);
+ else
+ f_print(fout, "char* "); /* cannot have "void" type */
+ f_print(fout, " ");
+ pvname( proc->proc_name, vp->vers_num );
+ f_print(fout, "_arg;\n");
+ } else if (!streq( proc->args.decls->decl.type, "void")) {
+ for (l = proc->args.decls; l != NULL; l = l->next) {
+ f_print( fout, "\t" );
+ ptype(l->decl.prefix, l->decl.type, 1);
+ f_print( fout, " ");
+ pvname( proc->proc_name, vp->vers_num );
+ f_print(fout, "_%s;\n", l->decl.name );
+/* pdeclaration(proc->args.argname, &l->decl, 1, ";\n" );*/
+ }
+ }
+ }
+
+ /* generate creation of client handle */
+ f_print(fout, "\tclnt = clnt_create(host, %s, %s, \"%s\");\n",
+ program_name, vp->vers_name, tirpcflag? "netpath" : "udp");
+ f_print(fout, "\tif (clnt == NULL) {\n");
+ f_print(fout, "\t\tclnt_pcreateerror(host);\n");
+ f_print(fout, "\t\texit(1);\n\t}\n");
+
+ /* generate calls to procedures */
+ i = 0;
+ for (proc = vp->procs; proc != NULL; proc = proc->next) {
+ f_print(fout, "\tresult_%d = ",++i);
+ pvname(proc->proc_name, vp->vers_num);
+ if (proc->arg_num < 2 && !newstyle) {
+ f_print(fout, "(" );
+ if( streq( proc->args.decls->decl.type, "void") ) /* cast to void* */
+ f_print(fout, "(void*)");
+ f_print(fout, "&" );
+ pvname(proc->proc_name, vp->vers_num );
+ f_print(fout, "_arg, clnt);\n");
+ } else if (streq( proc->args.decls->decl.type, "void")) {
+ f_print(fout, "(clnt);\n");
+ }
+ else {
+ f_print(fout, "(");
+ for (l = proc->args.decls; l != NULL; l = l->next) {
+ pvname( proc->proc_name, vp->vers_num );
+ f_print(fout, "_%s, ", l->decl.name);
+ }
+ f_print(fout, "clnt);\n");
+ }
+ f_print(fout, "\tif (result_%d == NULL) {\n", i);
+ f_print(fout, "\t\tclnt_perror(clnt, \"call failed:\");\n");
+ f_print(fout, "\t}\n");
+ }
+
+ f_print(fout, "\tclnt_destroy( clnt );\n" );
+ f_print(fout, "}\n");
+}
+
+static void
+write_sample_server(definition *def)
+{
+ version_list *vp;
+ proc_list *proc;
+
+ for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
+ for (proc = vp->procs; proc != NULL; proc = proc->next) {
+ f_print(fout, "\n");
+/* if( Cflag )
+ f_print( fout, "extern \"C\"{\n");
+*/
+ return_type(proc);
+ f_print(fout, "* \n");
+ if( Cflag )
+ pvname_svc(proc->proc_name, vp->vers_num);
+ else
+ pvname(proc->proc_name, vp->vers_num);
+ printarglist( proc, RQSTP, "struct svc_req *" );
+
+ f_print(fout, "{\n");
+ f_print(fout, "\n\tstatic ");
+ if( !streq( proc->res_type, "void") )
+ return_type(proc);
+ else
+ f_print(fout, "char*" ); /* cannot have void type */
+ f_print(fout, " result;\n" /*, proc->res_type*/ /*?*/);
+ f_print(fout,
+ "\n\t/*\n\t * insert server code here\n\t */\n\n");
+ if( !streq( proc->res_type, "void") )
+ f_print(fout, "\treturn(&result);\n}\n");
+ else /* cast back to void * */
+ f_print(fout, "\treturn((void*) &result);\n}\n");
+/* if( Cflag)
+ f_print( fout, "};\n");
+*/
+
+ }
+ }
+}
+
+
+
+static void
+return_type(proc_list *plist)
+{
+ ptype( plist->res_prefix, plist->res_type, 1 );
+}
+
+void
+add_sample_msg(void)
+{
+ f_print(fout, "/*\n");
+ f_print(fout, " * This is sample code generated by rpcgen.\n");
+ f_print(fout, " * These are only templates and you can use them\n");
+ f_print(fout, " * as a guideline for developing your own functions.\n");
+ f_print(fout, " */\n\n");
+}
+
+void
+write_sample_clnt_main(void)
+{
+ list *l;
+ definition *def;
+ version_list *vp;
+
+ f_print(fout, "\n\n" );
+ if( Cflag )
+ f_print(fout,"main( int argc, char* argv[] )\n{\n" );
+ else
+ f_print(fout, "main(argc, argv)\nint argc;\nchar *argv[];\n{\n" );
+
+ f_print(fout, "\tchar *host;");
+ f_print(fout, "\n\n\tif(argc < 2) {");
+ f_print(fout, "\n\t\tprintf(\"usage: %%s server_host\\n\", argv[0]);\n" );
+ f_print(fout, "\t\texit(1);\n\t}");
+ f_print(fout, "\n\thost = argv[1];\n");
+
+ for (l = defined; l != NULL; l = l->next) {
+ def = l->val;
+ if (def->def_kind != DEF_PROGRAM) {
+ continue;
+ }
+ for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
+ f_print( fout, "\t" );
+ pvname(def->def_name, vp->vers_num);
+ f_print( fout, "( host );\n" );
+ }
+ }
+ f_print(fout, "}\n");
+}
-/* @(#)rpc_scan.c 2.1 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
*
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#ifndef lint
-static char sccsid[] = "@(#)rpc_scan.c 1.6 87/06/24 (C) 1987 SMI";
-#endif
/*
- * rpc_scan.c, Scanner for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsystems, Inc.
+ * From: @(#)rpc_scan.c 1.11 89/02/22 (C) 1987 SMI
+ */
+char scan_rcsid[] =
+ "$Id$";
+
+/*
+ * rpc_scan.c, Scanner for the RPC protocol compiler
+ * Copyright (C) 1987, Sun Microsystems, Inc.
*/
#include <stdio.h>
#include <ctype.h>
-#include <strings.h>
+#include <string.h>
#include "rpc_scan.h"
+#include "rpc_parse.h"
#include "rpc_util.h"
+#include "proto.h"
#define startcomment(where) (where[0] == '/' && where[1] == '*')
#define endcomment(where) (where[-1] == '*' && where[0] == '/')
static int pushed = 0; /* is a token pushed */
static token lasttok; /* last token, if pushed */
+static void unget_token(token *tokp);
+static void findstrconst(const char **str, const char **val);
+static void findchrconst(const char **str, const char **val);
+static void findconst(const char **str, const char **val);
+static void findkind(const char **mark, token *tokp);
+static int cppline(const char *line);
+static int directive(const char *line);
+static void printdirective(const char *line);
+static void docppline(const char *line, int *lineno, const char **fname);
+
/*
- * scan expecting 1 given token
+ * scan expecting 1 given token
*/
void
-scan(expect, tokp)
- tok_kind expect;
- token *tokp;
+scan(tok_kind expect, token *tokp)
{
get_token(tokp);
if (tokp->kind != expect) {
}
/*
- * scan expecting 2 given tokens
+ * scan expecting any of the 2 given tokens
*/
void
-scan2(expect1, expect2, tokp)
- tok_kind expect1;
- tok_kind expect2;
- token *tokp;
+scan2(tok_kind expect1, tok_kind expect2, token *tokp)
{
get_token(tokp);
if (tokp->kind != expect1 && tokp->kind != expect2) {
}
/*
- * scan expecting 3 given token
+ * scan expecting any of the 3 given token
*/
void
-scan3(expect1, expect2, expect3, tokp)
- tok_kind expect1;
- tok_kind expect2;
- tok_kind expect3;
- token *tokp;
+scan3(tok_kind expect1, tok_kind expect2, tok_kind expect3, token *tokp)
{
get_token(tokp);
if (tokp->kind != expect1 && tokp->kind != expect2
}
}
-
/*
- * scan expecting a constant, possibly symbolic
+ * scan expecting a constant, possibly symbolic
*/
void
-scan_num(tokp)
- token *tokp;
+scan_num(token *tokp)
{
get_token(tokp);
switch (tokp->kind) {
case TOK_IDENT:
break;
default:
- error(_("constant or identifier expected"));
+ error("constant or identifier expected");
}
}
-
/*
- * Peek at the next token
+ * Peek at the next token
*/
void
-peek(tokp)
- token *tokp;
+peek(token *tokp)
{
get_token(tokp);
unget_token(tokp);
}
-
/*
- * Peek at the next token and scan it if it matches what you expect
+ * Peek at the next token and scan it if it matches what you expect
*/
int
-peekscan(expect, tokp)
- tok_kind expect;
- token *tokp;
+peekscan(tok_kind expect, token *tokp)
{
peek(tokp);
if (tokp->kind == expect) {
return (0);
}
-
-
/*
- * Get the next token, printing out any directive that are encountered.
+ * Get the next token, printing out any directive that are encountered.
*/
void
-get_token(tokp)
- token *tokp;
+get_token(token *tokp)
{
int commenting;
for (;;) {
if (!fgets(curline, MAXLINESIZE, fin)) {
tokp->kind = TOK_EOF;
- *where = 0;
+ *curline = 0;
+ where = curline;
return;
}
linenum++;
if (commenting) {
break;
} else if (cppline(curline)) {
- docppline(curline, &linenum,
+ docppline(curline, &linenum,
&infilename);
} else if (directive(curline)) {
printdirective(curline);
where++; /* eat */
}
} else if (commenting) {
- where++;
- if (endcomment(where)) {
- where++;
- commenting--;
+ for (where++; *where; where++) {
+ if (endcomment(where)) {
+ where++;
+ commenting--;
+ break;
+ }
}
} else if (startcomment(where)) {
where += 2;
}
/*
- * 'where' is not whitespace, comment or directive Must be a token!
+ * 'where' is not whitespace, comment or directive Must be a token!
*/
switch (*where) {
case ':':
tokp->kind = TOK_STRCONST;
findstrconst(&where, &tokp->str);
break;
+ case '\'':
+ tokp->kind = TOK_CHARCONST;
+ findchrconst(&where, &tokp->str);
+ break;
case '-':
case '0':
findconst(&where, &tokp->str);
break;
-
default:
if (!(isalpha(*where) || *where == '_')) {
char buf[100];
char *p;
- s_print(buf, _("illegal character in file: "));
+ s_print(buf, "illegal character in file: ");
p = buf + strlen(buf);
if (isprint(*where)) {
s_print(p, "%c", *where);
}
}
-
-
-static
-unget_token(tokp)
- token *tokp;
+static void
+unget_token(token *tokp)
{
lasttok = *tokp;
pushed = 1;
}
-
-static
-findstrconst(str, val)
- char **str;
- char **val;
+static void
+findstrconst(const char **str, const char **val)
{
- char *p;
+ const char *p;
+ char *tmp;
int size;
p = *str;
do {
- *p++;
+ p++;
} while (*p && *p != '"');
if (*p == 0) {
- error(_("unterminated string constant"));
+ error("unterminated string constant");
}
p++;
size = p - *str;
- *val = alloc(size + 1);
- (void) strncpy(*val, *str, size);
- (*val)[size] = 0;
+ tmp = alloc(size + 1);
+ strncpy(tmp, *str, size);
+ tmp[size] = 0;
+ *val = tmp;
*str = p;
}
-static
-findconst(str, val)
- char **str;
- char **val;
+static void
+findchrconst(const char **str, const char **val)
{
- char *p;
+ const char *p;
+ char *tmp;
+ int size;
+
+ p = *str;
+ do {
+ p++;
+ } while (*p && *p != '\'');
+ if (*p == 0) {
+ error("unterminated string constant");
+ }
+ p++;
+ size = p - *str;
+ if (size != 3) {
+ error("empty char string");
+ }
+ tmp = alloc(size + 1);
+ strncpy(tmp, *str, size);
+ tmp[size] = 0;
+ *val = tmp;
+ *str = p;
+}
+
+static void
+findconst(const char **str, const char **val)
+{
+ const char *p;
+ char *tmp;
int size;
p = *str;
} while (isdigit(*p));
}
size = p - *str;
- *val = alloc(size + 1);
- (void) strncpy(*val, *str, size);
- (*val)[size] = 0;
+ tmp = alloc(size + 1);
+ strncpy(tmp, *str, size);
+ tmp[size] = 0;
+ *val = tmp;
*str = p;
}
-
-
static token symbols[] = {
{TOK_CONST, "const"},
{TOK_UNION, "union"},
{TOK_EOF, "??????"},
};
-
-static
-findkind(mark, tokp)
- char **mark;
- token *tokp;
+static void
+findkind(const char **mark, token *tokp)
{
-
int len;
token *s;
- char *str;
+ const char *str;
+ char *tmp;
str = *mark;
for (s = symbols; s->kind != TOK_EOF; s++) {
}
tokp->kind = TOK_IDENT;
for (len = 0; isalnum(str[len]) || str[len] == '_'; len++);
- tokp->str = alloc(len + 1);
- (void) strncpy(tokp->str, str, len);
- tokp->str[len] = 0;
+ tmp = alloc(len + 1);
+ strncpy(tmp, str, len);
+ tmp[len] = 0;
+ tokp->str = tmp;
*mark = str + len;
}
-static
-cppline(line)
- char *line;
+static int
+cppline(const char *line)
{
return (line == curline && *line == '#');
}
-static
-directive(line)
- char *line;
+static int
+directive(const char *line)
{
return (line == curline && *line == '%');
}
-static
-printdirective(line)
- char *line;
+static void
+printdirective(const char *line)
{
f_print(fout, "%s", line + 1);
}
-static
-docppline(line, lineno, fname)
- char *line;
- int *lineno;
- char **fname;
+static void
+docppline(const char *line, int *lineno, const char **fname)
{
char *file;
int num;
line++;
}
if (*line != '"') {
- error(_("preprocessor error"));
+ error("preprocessor error");
}
line++;
p = file = alloc(strlen(line) + 1);
*p++ = *line++;
}
if (*line == 0) {
- error(_("preprocessor error"));
+ error("preprocessor error");
}
*p = 0;
if (*file == 0) {
-/* @(#)rpc_scan.h 2.1 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
+ *
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
+ *
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
- *
+ *
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
- *
+ *
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
- *
+ *
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-/* @(#)rpc_scan.h 1.3 87/03/09 (C) 1987 SMI */
+
+/* @(#)rpc_scan.h 1.3 90/08/29 (C) 1987 SMI */
/*
* rpc_scan.h, Definitions for the RPCL scanner
- * Copyright (C) 1987, Sun Microsystems, Inc.
*/
/*
*/
enum tok_kind {
TOK_IDENT,
+ TOK_CHARCONST,
TOK_STRCONST,
TOK_LPAREN,
TOK_RPAREN,
*/
struct token {
tok_kind kind;
- char *str;
+ const char *str;
};
typedef struct token token;
/*
* routine interface
*/
-void scanprint();
-void scan();
-void scan2();
-void scan3();
-void scan_num();
-void peek();
-int peekscan();
-void get_token();
+void scan(tok_kind expect, token *tokp);
+void scan2(tok_kind expect1, tok_kind expect2, token *tokp);
+void scan3(tok_kind expect1, tok_kind expect2, tok_kind expect3, token *tokp);
+void scan_num(token *tokp);
+void peek(token *tokp);
+int peekscan(tok_kind expect, token *tokp);
+void get_token(token *tokp);
+void expected1(tok_kind exp1);
+void expected2(tok_kind exp1, tok_kind exp2);
+void expected3(tok_kind exp1, tok_kind exp2, tok_kind exp3);
+
-/* @(#)rpc_svcout.c 2.1 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
+ *
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
+ *
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
- *
+ *
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
- *
+ *
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
- *
+ *
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#ifndef lint
-static char sccsid[] = "@(#)rpc_svcout.c 1.6 87/06/24 (C) 1987 SMI";
-#endif
+
+/*
+ * From: @(#)rpc_svcout.c 1.29 89/03/30 (C) 1987 SMI
+ */
+char svcout_rcsid[] =
+ "$Id$";
/*
* rpc_svcout.c, Server-skeleton outputter for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsytsems, Inc.
*/
#include <stdio.h>
-#include <strings.h>
+#include <string.h>
#include "rpc_parse.h"
#include "rpc_util.h"
+#include "proto.h"
static char RQSTP[] = "rqstp";
static char TRANSP[] = "transp";
static char RESULT[] = "result";
static char ROUTINE[] = "local";
+char _errbuf[256]; /* For all messages */
+
+static void internal_proctype(proc_list *plist);
+static void p_xdrfunc(const char *rname, const char *typename);
+static void write_real_program(definition *def);
+static void write_program(definition *def, const char *storage);
+static void printerr(const char *err, const char *transp);
+static void printif(const char *proc, const char *transp,
+ const char *prefix, const char *arg);
+static void write_inetmost(const char *infile);
+static void print_return(const char *space);
+static void print_pmapunset(const char *space);
+static void print_err_message(const char *space);
+static void write_timeout_func(void);
+static void write_pm_most(const char *infile, int netflag);
+static void write_rpc_svc_fg(const char *infile, const char *sp);
+static void open_log_file(const char *infile, const char *sp);
+
+static void
+p_xdrfunc(const char *rname, const char *typename)
+{
+ if( Cflag )
+ f_print(fout, "\t\txdr_%s = (xdrproc_t) xdr_%s;\n", rname,
+ stringfix(typename) );
+ else
+ f_print(fout, "\t\txdr_%s = xdr_%s;\n", rname, stringfix(typename) );
+}
+
+void
+internal_proctype(proc_list *plist)
+{
+ f_print(fout, "static ");
+ ptype( plist->res_prefix, plist->res_type, 1 );
+ f_print( fout, "*" );
+}
+
/*
- * write most of the service, that is, everything but the registrations.
+ * write most of the service, that is, everything but the registrations.
*/
void
-write_most()
+write_most(const char *infile /* our name */, int netflag, int nomain)
+{
+ if (inetdflag || pmflag) {
+ const char *var_type;
+#ifdef __GNU_LIBRARY__
+ /* WHY? */
+ var_type = (nomain? "extern" : "");
+#else
+ var_type = (nomain? "extern" : "static");
+#endif
+ f_print(fout, "%s int _rpcpmstart;", var_type );
+ f_print(fout, "\t\t/* Started by a port monitor ? */\n");
+ f_print(fout, "%s int _rpcfdtype;", var_type );
+ f_print(fout, "\t\t/* Whether Stream or Datagram ? */\n");
+ if (timerflag) {
+ f_print(fout, "%s int _rpcsvcdirty;", var_type );
+ f_print(fout, "\t/* Still serving ? */\n");
+ }
+ write_svc_aux( nomain );
+ }
+ /* write out dispatcher and stubs */
+ write_programs(nomain ? NULL : "static");
+
+ if( nomain )
+ return;
+
+#ifdef __GNU_LIBRARY__
+ if (Cflag)
+ f_print(fout, "\nint\nmain(int argc, char **argv)\n");
+ else {
+ f_print(fout, "\nint\nmain(argc, argv)\n");
+ f_print(fout, "\tint argc;\n");
+ f_print(fout, "\tchar **argv;\n");
+ }
+#else
+ f_print(fout, "\nmain()\n");
+#endif
+ f_print(fout, "{\n");
+ if (inetdflag) {
+ write_inetmost(infile); /* Includes call to write_rpc_svc_fg() */
+ } else {
+ if( tirpcflag ) {
+ if (netflag) {
+ f_print(fout, "\tregister SVCXPRT *%s;\n", TRANSP);
+ f_print(fout, "\tstruct netconfig *nconf = NULL;\n");
+ }
+ f_print(fout, "\tpid_t pid;\n");
+ f_print(fout, "\tint i;\n");
+ f_print(fout, "\tchar mname[FMNAMESZ + 1];\n\n");
+ write_pm_most(infile, netflag);
+ f_print(fout, "\telse {\n");
+ write_rpc_svc_fg(infile, "\t\t");
+ f_print(fout, "\t}\n");
+ } else {
+ f_print(fout, "\tregister SVCXPRT *%s;\n", TRANSP);
+ f_print(fout, "\n");
+ print_pmapunset("\t");
+ }
+ }
+
+ if (logflag && !inetdflag) {
+ open_log_file(infile, "\t");
+ }
+}
+
+/*
+ * write a registration for the given transport
+ */
+void
+write_netid_register(const char *transp)
{
list *l;
definition *def;
version_list *vp;
+ const char *sp;
+ char tmpbuf[32];
- for (l = defined; l != NULL; l = l->next) {
- def = (definition *) l->val;
- if (def->def_kind == DEF_PROGRAM) {
- for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- f_print(fout, "\nstatic void ");
- pvname(def->def_name, vp->vers_num);
- f_print(fout, "();");
- }
- }
- }
- f_print(fout, "\n\n");
- f_print(fout, "main()\n");
- f_print(fout, "{\n");
- f_print(fout, "\tSVCXPRT *%s;\n", TRANSP);
+ sp = "";
f_print(fout, "\n");
+ f_print(fout, "%s\tnconf = getnetconfigent(\"%s\");\n", sp, transp);
+ f_print(fout, "%s\tif (nconf == NULL) {\n", sp);
+ (void) sprintf(_errbuf, "cannot find %s netid.", transp);
+ sprintf(tmpbuf, "%s\t\t", sp);
+ print_err_message(tmpbuf);
+ f_print(fout, "%s\t\texit(1);\n", sp);
+ f_print(fout, "%s\t}\n", sp);
+ f_print(fout, "%s\t%s = svc_tli_create(RPC_ANYFD, nconf, 0, 0, 0);\n",
+ sp, TRANSP /*, transp*/ /* ?!?... */ );
+ f_print(fout, "%s\tif (%s == NULL) {\n", sp, TRANSP);
+ (void) sprintf(_errbuf, "cannot create %s service.", transp);
+ print_err_message(tmpbuf);
+ f_print(fout, "%s\t\texit(1);\n", sp);
+ f_print(fout, "%s\t}\n", sp);
+
for (l = defined; l != NULL; l = l->next) {
def = (definition *) l->val;
if (def->def_kind != DEF_PROGRAM) {
continue;
}
for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- f_print(fout, "\t(void)pmap_unset(%s, %s);\n", def->def_name, vp->vers_name);
+ f_print(fout,
+ "%s\t(void) rpcb_unset(%s, %s, nconf);\n",
+ sp, def->def_name, vp->vers_name);
+ f_print(fout,
+ "%s\tif (!svc_reg(%s, %s, %s, ",
+ sp, TRANSP, def->def_name, vp->vers_name);
+ pvname(def->def_name, vp->vers_num);
+ f_print(fout, ", nconf)) {\n");
+ (void) sprintf(_errbuf, "unable to register (%s, %s, %s).",
+ def->def_name, vp->vers_name, transp);
+ print_err_message(tmpbuf);
+ f_print(fout, "%s\t\texit(1);\n", sp);
+ f_print(fout, "%s\t}\n", sp);
}
}
+ f_print(fout, "%s\tfreenetconfigent(nconf);\n", sp);
}
-
/*
- * write a registration for the given transport
+ * write a registration for the given transport for TLI
*/
void
-write_register(transp)
- char *transp;
+write_nettype_register(const char *transp)
{
list *l;
definition *def;
version_list *vp;
- f_print(fout, "\n");
- f_print(fout, "\t%s = svc%s_create(RPC_ANYSOCK", TRANSP, transp);
- if (streq(transp, "tcp")) {
- f_print(fout, ", 0, 0");
- }
- f_print(fout, ");\n");
- f_print(fout, "\tif (%s == NULL) {\n", TRANSP);
- f_print(fout, "\t\t(void)fprintf(stderr, \"cannot create %s service.\\n\");\n", transp);
- f_print(fout, "\t\texit(1);\n");
- f_print(fout, "\t}\n");
-
for (l = defined; l != NULL; l = l->next) {
def = (definition *) l->val;
if (def->def_kind != DEF_PROGRAM) {
continue;
}
for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- f_print(fout,
- "\tif (!svc_register(%s, %s, %s, ",
- TRANSP, def->def_name, vp->vers_name);
+ f_print(fout, "\tif (!svc_create(");
pvname(def->def_name, vp->vers_num);
- f_print(fout, ", IPPROTO_%s)) {\n",
- streq(transp, "udp") ? "UDP" : "TCP");
- f_print(fout,
- "\t\t(void)fprintf(stderr, \"unable to register (%s, %s, %s).\\n\");\n",
+ f_print(fout, ", %s, %s, \"%s\")) {\n ",
def->def_name, vp->vers_name, transp);
+ (void) sprintf(_errbuf,
+ "unable to create (%s, %s) for %s.",
+ def->def_name, vp->vers_name, transp);
+ print_err_message("\t\t");
f_print(fout, "\t\texit(1);\n");
f_print(fout, "\t}\n");
}
}
}
-
/*
- * write the rest of the service
+ * write the rest of the service
*/
void
-write_rest()
+write_rest(void)
{
+ f_print(fout, "\n");
+ if (inetdflag) {
+ f_print(fout, "\tif (%s == (SVCXPRT *)NULL) {\n", TRANSP);
+ (void) sprintf(_errbuf, "could not create a handle");
+ print_err_message("\t\t");
+ f_print(fout, "\t\texit(1);\n");
+ f_print(fout, "\t}\n");
+ if (timerflag) {
+ f_print(fout, "\tif (_rpcpmstart) {\n");
+ f_print(fout,
+ "\t\t(void) signal(SIGALRM, %s closedown);\n",
+ Cflag? "(SIG_PF)" : "(void(*)())" );
+ f_print(fout, "\t\t(void) alarm(_RPCSVC_CLOSEDOWN);\n");
+ f_print(fout, "\t}\n");
+ }
+ }
f_print(fout, "\tsvc_run();\n");
- f_print(fout, "\t(void)fprintf(stderr, \"svc_run returned\\n\");\n");
+ (void) sprintf(_errbuf, "svc_run returned");
+ print_err_message("\t");
f_print(fout, "\texit(1);\n");
+ f_print(fout, "\t/* NOTREACHED */\n");
f_print(fout, "}\n");
}
void
-write_programs(storage)
- char *storage;
+write_programs(const char *storage)
{
list *l;
definition *def;
+ /* write out stubs for procedure definitions */
+ for (l = defined; l != NULL; l = l->next) {
+ def = (definition *) l->val;
+ if (def->def_kind == DEF_PROGRAM) {
+ write_real_program(def);
+ }
+ }
+
+ /* write out dispatcher for each program */
for (l = defined; l != NULL; l = l->next) {
def = (definition *) l->val;
if (def->def_kind == DEF_PROGRAM) {
write_program(def, storage);
}
}
+
+
}
+/* write out definition of internal function (e.g. _printmsg_1(...))
+ which calls server's defintion of actual function (e.g. printmsg_1(...)).
+ Unpacks single user argument of printmsg_1 to call-by-value format
+ expected by printmsg_1. */
+static void
+write_real_program(definition *def)
+{
+ version_list *vp;
+ proc_list *proc;
+ decl_list *l;
-static
-write_program(def, storage)
- definition *def;
- char *storage;
+ if( !newstyle ) return; /* not needed for old style */
+ for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
+ for (proc = vp->procs; proc != NULL; proc = proc->next) {
+ f_print(fout, "\n");
+ internal_proctype(proc);
+ f_print(fout, "\n_");
+ pvname(proc->proc_name, vp->vers_num);
+ if( Cflag ) {
+ f_print(fout, "(" );
+ /* arg name */
+ if (proc->arg_num > 1)
+ f_print(fout, proc->args.argname);
+ else
+ ptype(proc->args.decls->decl.prefix,
+ proc->args.decls->decl.type, 0);
+ f_print(fout, " *argp, struct svc_req *%s)\n",
+ RQSTP);
+ } else {
+ f_print(fout, "(argp, %s)\n", RQSTP );
+ /* arg name */
+ if (proc->arg_num > 1)
+ f_print(fout, "\t%s *argp;\n", proc->args.argname);
+ else {
+ f_print(fout, "\t");
+ ptype(proc->args.decls->decl.prefix,
+ proc->args.decls->decl.type, 0);
+ f_print(fout, " *argp;\n");
+ }
+ f_print(fout, " struct svc_req *%s;\n", RQSTP);
+ }
+
+ f_print(fout, "{\n");
+ f_print(fout, "\treturn(");
+ if( Cflag )
+ pvname_svc(proc->proc_name, vp->vers_num);
+ else
+ pvname(proc->proc_name, vp->vers_num);
+ f_print(fout, "(");
+ if (proc->arg_num < 2) { /* single argument */
+ if (!streq( proc->args.decls->decl.type, "void"))
+ f_print(fout, "*argp, "); /* non-void */
+ } else {
+ for (l = proc->args.decls; l != NULL; l = l->next)
+ f_print(fout, "argp->%s, ", l->decl.name);
+ }
+ f_print(fout, "%s));\n}\n", RQSTP);
+ }
+ }
+}
+
+static void
+write_program(definition *def, const char *storage)
{
version_list *vp;
proc_list *proc;
}
f_print(fout, "void\n");
pvname(def->def_name, vp->vers_num);
- f_print(fout, "(%s, %s)\n", RQSTP, TRANSP);
- f_print(fout, " struct svc_req *%s;\n", RQSTP);
- f_print(fout, " SVCXPRT *%s;\n", TRANSP);
+
+ if (Cflag) {
+ f_print(fout, "(struct svc_req *%s, ", RQSTP);
+ f_print(fout, "register SVCXPRT *%s)\n", TRANSP);
+ } else {
+ f_print(fout, "(%s, %s)\n", RQSTP, TRANSP);
+ f_print(fout, " struct svc_req *%s;\n", RQSTP);
+ f_print(fout, " register SVCXPRT *%s;\n", TRANSP);
+ }
+
f_print(fout, "{\n");
filled = 0;
f_print(fout, "\tunion {\n");
for (proc = vp->procs; proc != NULL; proc = proc->next) {
- if (streq(proc->arg_type, "void")) {
- continue;
+ if (proc->arg_num < 2) { /* single argument */
+ if (streq(proc->args.decls->decl.type,
+ "void")) {
+ continue;
+ }
+ filled = 1;
+ f_print(fout, "\t\t");
+ ptype(proc->args.decls->decl.prefix,
+ proc->args.decls->decl.type, 0);
+ pvname(proc->proc_name, vp->vers_num);
+ f_print(fout, "_arg;\n");
+
+ }
+ else {
+ filled = 1;
+ f_print(fout, "\t\t%s", proc->args.argname);
+ f_print(fout, " ");
+ pvname(proc->proc_name, vp->vers_num);
+ f_print(fout, "_arg;\n");
}
- filled = 1;
- f_print(fout, "\t\t");
- ptype(proc->arg_prefix, proc->arg_type, 0);
- pvname(proc->proc_name, vp->vers_num);
- f_print(fout, "_arg;\n");
}
if (!filled) {
f_print(fout, "\t\tint fill;\n");
}
f_print(fout, "\t} %s;\n", ARG);
f_print(fout, "\tchar *%s;\n", RESULT);
- f_print(fout, "\tbool_t (*xdr_%s)(), (*xdr_%s)();\n", ARG, RESULT);
- f_print(fout, "\tchar *(*%s)();\n", ROUTINE);
+
+ if (Cflag) {
+ f_print(fout, "\txdrproc_t xdr_%s, xdr_%s;\n", ARG, RESULT);
+ f_print(fout,
+ "\tchar *(*%s)(char *, struct svc_req *);\n",
+ ROUTINE);
+ } else {
+ f_print(fout, "\tbool_t (*xdr_%s)(), (*xdr_%s)();\n", ARG, RESULT);
+ f_print(fout, "\tchar *(*%s)();\n", ROUTINE);
+ }
+
f_print(fout, "\n");
- f_print(fout, "\tswitch (%s->rq_proc) {\n", RQSTP);
+ if (timerflag)
+ f_print(fout, "\t_rpcsvcdirty = 1;\n");
+ f_print(fout, "\tswitch (%s->rq_proc) {\n", RQSTP);
if (!nullproc(vp->procs)) {
f_print(fout, "\tcase NULLPROC:\n");
- f_print(fout, "\t\t(void)svc_sendreply(%s, xdr_void, (char *)NULL);\n", TRANSP);
- f_print(fout, "\t\treturn;\n\n");
+ f_print(fout,
+ Cflag
+ ? "\t\t(void) svc_sendreply(%s, (xdrproc_t) xdr_void, (char *)NULL);\n"
+ : "\t\t(void) svc_sendreply(%s, xdr_void, (char *)NULL);\n",
+ TRANSP);
+ print_return("\t\t");
+ f_print(fout, "\n");
}
for (proc = vp->procs; proc != NULL; proc = proc->next) {
f_print(fout, "\tcase %s:\n", proc->proc_name);
- f_print(fout, "\t\txdr_%s = xdr_%s;\n", ARG,
- stringfix(proc->arg_type));
- f_print(fout, "\t\txdr_%s = xdr_%s;\n", RESULT,
- stringfix(proc->res_type));
- f_print(fout, "\t\t%s = (char *(*)()) ", ROUTINE);
- pvname(proc->proc_name, vp->vers_num);
+ if (proc->arg_num < 2) { /* single argument */
+ p_xdrfunc( ARG, proc->args.decls->decl.type);
+ } else {
+ p_xdrfunc( ARG, proc->args.argname);
+ }
+ p_xdrfunc( RESULT, proc->res_type);
+ if( Cflag )
+ f_print(fout,
+ "\t\t%s = (char *(*)(char *, struct svc_req *)) ",
+ ROUTINE);
+ else
+ f_print(fout, "\t\t%s = (char *(*)()) ", ROUTINE);
+
+ if (newstyle) { /* new style: calls internal routine */
+ f_print(fout,"_");
+ }
+ if( Cflag && !newstyle )
+ pvname_svc(proc->proc_name, vp->vers_num);
+ else
+ pvname(proc->proc_name, vp->vers_num);
f_print(fout, ";\n");
f_print(fout, "\t\tbreak;\n\n");
}
f_print(fout, "\tdefault:\n");
printerr("noproc", TRANSP);
- f_print(fout, "\t\treturn;\n");
+ print_return("\t\t");
f_print(fout, "\t}\n");
- f_print(fout, "\tbzero((char *)&%s, sizeof(%s));\n", ARG, ARG);
- printif("getargs", TRANSP, "&", ARG);
+ f_print(fout, "\t(void) memset((char *)&%s, 0, sizeof (%s));\n", ARG, ARG);
+ if (Cflag)
+ printif("getargs", TRANSP, "(caddr_t) &", ARG);
+ else
+ printif("getargs", TRANSP, "&", ARG);
printerr("decode", TRANSP);
- f_print(fout, "\t\treturn;\n");
+ print_return("\t\t");
f_print(fout, "\t}\n");
- f_print(fout, "\t%s = (*%s)(&%s, %s);\n", RESULT, ROUTINE, ARG,
- RQSTP);
- f_print(fout,
+ if (Cflag)
+ f_print(fout, "\t%s = (*%s)((char *)&%s, %s);\n",
+ RESULT, ROUTINE, ARG, RQSTP);
+ else
+ f_print(fout, "\t%s = (*%s)(&%s, %s);\n",
+ RESULT, ROUTINE, ARG, RQSTP);
+ f_print(fout,
"\tif (%s != NULL && !svc_sendreply(%s, xdr_%s, %s)) {\n",
RESULT, TRANSP, RESULT, RESULT);
printerr("systemerr", TRANSP);
f_print(fout, "\t}\n");
- printif("freeargs", TRANSP, "&", ARG);
- f_print(fout, "\t\t(void)fprintf(stderr, \"unable to free arguments\\n\");\n");
+ if (Cflag)
+ printif("freeargs", TRANSP, "(caddr_t) &", ARG);
+ else
+ printif("freeargs", TRANSP, "&", ARG);
+ (void) sprintf(_errbuf, "unable to free arguments");
+ print_err_message("\t\t");
f_print(fout, "\t\texit(1);\n");
f_print(fout, "\t}\n");
-
- f_print(fout, "}\n\n");
+ print_return("\t");
+ f_print(fout, "}\n");
}
}
-static
-printerr(err, transp)
- char *err;
- char *transp;
+static void
+printerr(const char *err, const char *transp)
{
f_print(fout, "\t\tsvcerr_%s(%s);\n", err, transp);
}
-static
-printif(proc, transp, prefix, arg)
- char *proc;
- char *transp;
- char *prefix;
- char *arg;
+static void
+printif(const char *proc, const char *transp, const char *prefix,
+ const char *arg)
{
f_print(fout, "\tif (!svc_%s(%s, xdr_%s, %s%s)) {\n",
proc, transp, arg, prefix, arg);
}
-
-nullproc(proc)
- proc_list *proc;
+int
+nullproc(proc_list *proc)
{
for (; proc != NULL; proc = proc->next) {
if (streq(proc->proc_num, "0")) {
}
return (0);
}
+
+static void
+write_inetmost(const char *infile)
+{
+ f_print(fout, "\tregister SVCXPRT *%s;\n", TRANSP);
+ f_print(fout, "\tint sock;\n");
+ f_print(fout, "\tint proto;\n");
+ f_print(fout, "\tstruct sockaddr_in saddr;\n");
+ f_print(fout, "\tint asize = sizeof (saddr);\n");
+ f_print(fout, "\n");
+ f_print(fout,
+ "\tif (getsockname(0, (struct sockaddr *)&saddr, &asize) == 0) {\n");
+ f_print(fout, "\t\tint ssize = sizeof (int);\n\n");
+ f_print(fout, "\t\tif (saddr.sin_family != AF_INET)\n");
+ f_print(fout, "\t\t\texit(1);\n");
+ f_print(fout, "\t\tif (getsockopt(0, SOL_SOCKET, SO_TYPE,\n");
+ f_print(fout, "\t\t\t\t(char *)&_rpcfdtype, &ssize) == -1)\n");
+ f_print(fout, "\t\t\texit(1);\n");
+ f_print(fout, "\t\tsock = 0;\n");
+ f_print(fout, "\t\t_rpcpmstart = 1;\n");
+ f_print(fout, "\t\tproto = 0;\n");
+ open_log_file(infile, "\t\t");
+ f_print(fout, "\t} else {\n");
+ write_rpc_svc_fg(infile, "\t\t");
+ f_print(fout, "\t\tsock = RPC_ANYSOCK;\n");
+ print_pmapunset("\t\t");
+ f_print(fout, "\t}\n");
+}
+
+static void
+print_return(const char *space)
+{
+ if (exitnow)
+ f_print(fout, "%sexit(0);\n", space);
+ else {
+ if (timerflag)
+ f_print(fout, "%s_rpcsvcdirty = 0;\n", space);
+ f_print(fout, "%sreturn;\n", space);
+ }
+}
+
+static void
+print_pmapunset(const char *space)
+{
+ list *l;
+ definition *def;
+ version_list *vp;
+
+ for (l = defined; l != NULL; l = l->next) {
+ def = (definition *) l->val;
+ if (def->def_kind == DEF_PROGRAM) {
+ for (vp = def->def.pr.versions; vp != NULL;
+ vp = vp->next) {
+ f_print(fout, "%s(void) pmap_unset(%s, %s);\n",
+ space, def->def_name, vp->vers_name);
+ }
+ }
+ }
+}
+
+static void
+print_err_message(const char *space)
+{
+ if (logflag)
+ f_print(fout, "%ssyslog(LOG_ERR, \"%s\");\n", space, _errbuf);
+ else if (inetdflag || pmflag)
+ f_print(fout, "%s_msgout(\"%s\");\n", space, _errbuf);
+ else
+ f_print(fout, "%sfprintf(stderr, \"%s\");\n", space, _errbuf);
+}
+
+/*
+ * Write the server auxiliary function ( _msgout, timeout)
+ */
+void
+write_svc_aux(int nomain)
+{
+ if (!logflag)
+ write_msg_out();
+ if( !nomain )
+ write_timeout_func();
+}
+
+/*
+ * Write the _msgout function
+ */
+
+void
+write_msg_out(void)
+{
+ f_print(fout, "\n");
+ f_print(fout, "static\n");
+ if( !Cflag ) {
+ f_print(fout, "void _msgout(msg)\n");
+ f_print(fout, "\tchar *msg;\n");
+ } else {
+ f_print(fout, "void _msgout(char* msg)\n");
+ }
+ f_print(fout, "{\n");
+ f_print(fout, "#ifdef RPC_SVC_FG\n");
+ if (inetdflag || pmflag)
+ f_print(fout, "\tif (_rpcpmstart)\n");
+ f_print(fout, "\t\tsyslog(LOG_ERR, msg);\n");
+ f_print(fout, "\telse\n");
+ f_print(fout, "\t\t(void) fprintf(stderr, \"%%s\\n\", msg);\n");
+ f_print(fout, "#else\n");
+ f_print(fout, "\tsyslog(LOG_ERR, msg);\n");
+ f_print(fout, "#endif\n");
+ f_print(fout, "}\n");
+}
+
+/*
+ * Write the timeout function
+ */
+static void
+write_timeout_func(void)
+{
+ if (!timerflag)
+ return;
+ f_print(fout, "\n");
+ f_print(fout, "static void\n");
+#ifdef __GNU_LIBRARY__
+ if (Cflag)
+ f_print(fout, "closedown(int sig)\n");
+ else
+ f_print(fout, "closedown(sig)\n\tint sig;\n");
+#else
+ f_print(fout, "closedown()\n");
+#endif
+ f_print(fout, "{\n");
+#ifdef __GNU_LIBRARY__
+ f_print(fout, "\t(void) signal(sig, %s closedown);\n",
+ Cflag? "(SIG_PF)" : "(void(*)())" );
+#endif
+ f_print(fout, "\tif (_rpcsvcdirty == 0) {\n");
+ f_print(fout, "\t\textern fd_set svc_fdset;\n");
+ f_print(fout, "\t\tstatic int size;\n");
+ f_print(fout, "\t\tint i, openfd;\n");
+ if (tirpcflag && pmflag) {
+ f_print(fout, "\t\tstruct t_info tinfo;\n\n");
+ f_print(fout, "\t\tif (!t_getinfo(0, &tinfo) && (tinfo.servtype == T_CLTS))\n");
+ } else {
+ f_print(fout, "\n\t\tif (_rpcfdtype == SOCK_DGRAM)\n");
+ }
+ f_print(fout, "\t\t\texit(0);\n");
+ f_print(fout, "\t\tif (size == 0) {\n");
+ if( tirpcflag ) {
+ f_print(fout, "\t\t\tstruct rlimit rl;\n\n");
+ f_print(fout, "\t\t\trl.rlim_max = 0;\n");
+ f_print(fout, "\t\t\tgetrlimit(RLIMIT_NOFILE, &rl);\n");
+ f_print(fout, "\t\t\tif ((size = rl.rlim_max) == 0)\n");
+ f_print(fout, "\t\t\t\treturn;\n");
+ } else {
+ f_print(fout, "\t\t\tsize = getdtablesize();\n");
+ }
+ f_print(fout, "\t\t}\n");
+ f_print(fout, "\t\tfor (i = 0, openfd = 0; i < size && openfd < 2; i++)\n");
+ f_print(fout, "\t\t\tif (FD_ISSET(i, &svc_fdset))\n");
+ f_print(fout, "\t\t\t\topenfd++;\n");
+ f_print(fout, "\t\tif (openfd <= 1)\n");
+ f_print(fout, "\t\t\texit(0);\n");
+ f_print(fout, "\t}\n");
+ f_print(fout, "\t(void) alarm(_RPCSVC_CLOSEDOWN);\n");
+ f_print(fout, "}\n");
+}
+
+/*
+ * Write the most of port monitor support
+ */
+static void
+write_pm_most(const char *infile, int netflag)
+{
+ list *l;
+ definition *def;
+ version_list *vp;
+
+ f_print(fout, "\tif (!ioctl(0, I_LOOK, mname) &&\n");
+ f_print(fout, "\t\t(!strcmp(mname, \"sockmod\") ||");
+ f_print(fout, " !strcmp(mname, \"timod\"))) {\n");
+ f_print(fout, "\t\tchar *netid;\n");
+ if (!netflag) { /* Not included by -n option */
+ f_print(fout, "\t\tstruct netconfig *nconf = NULL;\n");
+ f_print(fout, "\t\tSVCXPRT *%s;\n", TRANSP);
+ }
+ if( timerflag )
+ f_print(fout, "\t\tint pmclose;\n");
+/* not necessary, defined in /usr/include/stdlib */
+/* f_print(fout, "\t\textern char *getenv();\n");*/
+ f_print(fout, "\n");
+ f_print(fout, "\t\t_rpcpmstart = 1;\n");
+ if (logflag)
+ open_log_file(infile, "\t\t");
+ f_print(fout, "\t\tif ((netid = getenv(\"NLSPROVIDER\")) == NULL) {\n");
+ sprintf(_errbuf, "cannot get transport name");
+ print_err_message("\t\t\t");
+ f_print(fout, "\t\t} else if ((nconf = getnetconfigent(netid)) == NULL) {\n");
+ sprintf(_errbuf, "cannot get transport info");
+ print_err_message("\t\t\t");
+ f_print(fout, "\t\t}\n");
+ /*
+ * A kludgy support for inetd services. Inetd only works with
+ * sockmod, and RPC works only with timod, hence all this jugglery
+ */
+ f_print(fout, "\t\tif (strcmp(mname, \"sockmod\") == 0) {\n");
+ f_print(fout, "\t\t\tif (ioctl(0, I_POP, 0) || ioctl(0, I_PUSH, \"timod\")) {\n");
+ sprintf(_errbuf, "could not get the right module");
+ print_err_message("\t\t\t\t");
+ f_print(fout, "\t\t\t\texit(1);\n");
+ f_print(fout, "\t\t\t}\n");
+ f_print(fout, "\t\t}\n");
+ if( timerflag )
+ f_print(fout, "\t\tpmclose = (t_getstate(0) != T_DATAXFER);\n");
+ f_print(fout, "\t\tif ((%s = svc_tli_create(0, nconf, NULL, 0, 0)) == NULL) {\n",
+ TRANSP);
+ sprintf(_errbuf, "cannot create server handle");
+ print_err_message("\t\t\t");
+ f_print(fout, "\t\t\texit(1);\n");
+ f_print(fout, "\t\t}\n");
+ f_print(fout, "\t\tif (nconf)\n");
+ f_print(fout, "\t\t\tfreenetconfigent(nconf);\n");
+ for (l = defined; l != NULL; l = l->next) {
+ def = (definition *) l->val;
+ if (def->def_kind != DEF_PROGRAM) {
+ continue;
+ }
+ for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
+ f_print(fout,
+ "\t\tif (!svc_reg(%s, %s, %s, ",
+ TRANSP, def->def_name, vp->vers_name);
+ pvname(def->def_name, vp->vers_num);
+ f_print(fout, ", 0)) {\n");
+ (void) sprintf(_errbuf, "unable to register (%s, %s).",
+ def->def_name, vp->vers_name);
+ print_err_message("\t\t\t");
+ f_print(fout, "\t\t\texit(1);\n");
+ f_print(fout, "\t\t}\n");
+ }
+ }
+ if (timerflag) {
+ f_print(fout, "\t\tif (pmclose) {\n");
+ f_print(fout, "\t\t\t(void) signal(SIGALRM, %s closedown);\n",
+ Cflag? "(SIG_PF)" : "(void(*)())" );
+ f_print(fout, "\t\t\t(void) alarm(_RPCSVC_CLOSEDOWN);\n");
+ f_print(fout, "\t\t}\n");
+ }
+ f_print(fout, "\t\tsvc_run();\n");
+ f_print(fout, "\t\texit(1);\n");
+ f_print(fout, "\t\t/* NOTREACHED */\n");
+ f_print(fout, "\t}\n");
+}
+
+/*
+ * Support for backgrounding the server if self started.
+ */
+static void
+write_rpc_svc_fg(const char *infile, const char *sp)
+{
+ f_print(fout, "#ifndef RPC_SVC_FG\n");
+ f_print(fout, "%sint size;\n", sp);
+ if( tirpcflag )
+ f_print(fout, "%sstruct rlimit rl;\n", sp);
+ if (inetdflag)
+ f_print(fout, "%sint pid, i;\n\n", sp);
+ f_print(fout, "%spid = fork();\n", sp);
+ f_print(fout, "%sif (pid < 0) {\n", sp);
+ f_print(fout, "%s\tperror(\"cannot fork\");\n", sp);
+ f_print(fout, "%s\texit(1);\n", sp);
+ f_print(fout, "%s}\n", sp);
+ f_print(fout, "%sif (pid)\n", sp);
+ f_print(fout, "%s\texit(0);\n", sp);
+ /* get number of file descriptors */
+ if( tirpcflag ) {
+ f_print(fout, "%srl.rlim_max = 0;\n", sp);
+ f_print(fout, "%sgetrlimit(RLIMIT_NOFILE, &rl);\n", sp);
+ f_print(fout, "%sif ((size = rl.rlim_max) == 0)\n", sp);
+ f_print(fout, "%s\texit(1);\n", sp);
+ } else {
+ f_print(fout, "%ssize = getdtablesize();\n", sp);
+ }
+
+ f_print(fout, "%sfor (i = 0; i < size; i++)\n", sp);
+ f_print(fout, "%s\t(void) close(i);\n", sp);
+ /* Redirect stderr and stdout to console */
+ f_print(fout, "%si = open(\"/dev/console\", 2);\n", sp);
+ f_print(fout, "%s(void) dup2(i, 1);\n", sp);
+ f_print(fout, "%s(void) dup2(i, 2);\n", sp);
+ /* This removes control of the controlling terminal */
+ if( tirpcflag )
+ f_print(fout, "%ssetsid();\n", sp);
+ else {
+ f_print(fout, "%si = open(\"/dev/tty\", 2);\n", sp);
+ f_print(fout, "%sif (i >= 0) {\n", sp);
+ f_print(fout, "%s\t(void) ioctl(i, TIOCNOTTY, (char *)NULL);\n", sp);;
+ f_print(fout, "%s\t(void) close(i);\n", sp);
+ f_print(fout, "%s}\n", sp);
+ }
+ if (!logflag)
+ open_log_file(infile, sp);
+ f_print(fout, "#endif\n");
+ if (logflag)
+ open_log_file(infile, sp);
+}
+
+static void
+open_log_file(const char *infile, const char *sp)
+{
+ char *s;
+
+ s = strrchr(infile, '.');
+ if (s)
+ *s = '\0';
+ f_print(fout,"%sopenlog(\"%s\", LOG_PID, LOG_DAEMON);\n", sp, infile);
+ if (s)
+ *s = '.';
+}
+
+
+
+
+/*
+ * write a registration for the given transport for Inetd
+ */
+void
+write_inetd_register(const char *transp)
+{
+ list *l;
+ definition *def;
+ version_list *vp;
+ const char *sp;
+ int isudp;
+ char tmpbuf[32];
+
+ if (inetdflag)
+ sp = "\t";
+ else
+ sp = "";
+ if (streq(transp, "udp"))
+ isudp = 1;
+ else
+ isudp = 0;
+ f_print(fout, "\n");
+ if (inetdflag) {
+ f_print(fout, "\tif ((_rpcfdtype == 0) || (_rpcfdtype == %s)) {\n",
+ isudp ? "SOCK_DGRAM" : "SOCK_STREAM");
+ }
+ f_print(fout, "%s\t%s = svc%s_create(%s",
+ sp, TRANSP, transp, inetdflag? "sock": "RPC_ANYSOCK");
+ if (!isudp)
+ f_print(fout, ", 0, 0");
+ f_print(fout, ");\n");
+ f_print(fout, "%s\tif (%s == NULL) {\n", sp, TRANSP);
+ (void) sprintf(_errbuf, "cannot create %s service.", transp);
+ (void) sprintf(tmpbuf, "%s\t\t", sp);
+ print_err_message(tmpbuf);
+ f_print(fout, "%s\t\texit(1);\n", sp);
+ f_print(fout, "%s\t}\n", sp);
+
+ if (inetdflag) {
+ f_print(fout, "%s\tif (!_rpcpmstart)\n\t", sp);
+ f_print(fout, "%s\tproto = IPPROTO_%s;\n",
+ sp, isudp ? "UDP": "TCP");
+ }
+ for (l = defined; l != NULL; l = l->next) {
+ def = (definition *) l->val;
+ if (def->def_kind != DEF_PROGRAM) {
+ continue;
+ }
+ for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
+ f_print(fout, "%s\tif (!svc_register(%s, %s, %s, ",
+ sp, TRANSP, def->def_name, vp->vers_name);
+ pvname(def->def_name, vp->vers_num);
+ if (inetdflag)
+ f_print(fout, ", proto)) {\n");
+ else
+ f_print(fout, ", IPPROTO_%s)) {\n",
+ isudp ? "UDP": "TCP");
+ (void) sprintf(_errbuf, "unable to register (%s, %s, %s).",
+ def->def_name, vp->vers_name, transp);
+ print_err_message(tmpbuf);
+ f_print(fout, "%s\t\texit(1);\n", sp);
+ f_print(fout, "%s\t}\n", sp);
+ }
+ }
+ if (inetdflag)
+ f_print(fout, "\t}\n");
+}
--- /dev/null
+/*
+ * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
+ * unrestricted use provided that this legend is included on all tape
+ * media and as a part of the software program in whole or part. Users
+ * may copy or modify Sun RPC without charge, but are not authorized
+ * to license or distribute it to anyone else except as part of a product or
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
+ *
+ * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
+ * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun RPC is provided with no support and without any obligation on the
+ * part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ */
+
+/*
+ * From: @(#)rpc_tblout.c 1.4 89/02/22 (C) 1988 SMI
+ */
+char tblout_rcsid[] =
+ "$Id$";
+
+/*
+ * rpc_tblout.c, Dispatch table outputter for the RPC protocol compiler
+ */
+#include <stdio.h>
+#include <string.h>
+#include "rpc_parse.h"
+#include "rpc_util.h"
+#include "proto.h"
+
+#define TABSIZE 8
+#define TABCOUNT 5
+#define TABSTOP (TABSIZE*TABCOUNT)
+
+static char tabstr[TABCOUNT+1] = "\t\t\t\t\t";
+
+static char tbl_hdr[] = "struct rpcgen_table %s_table[] = {\n";
+static char tbl_end[] = "};\n";
+
+static char null_entry[] = "\n\t(char *(*)())0,\n\
+ \t(xdrproc_t) xdr_void,\t\t\t0,\n\
+ \t(xdrproc_t) xdr_void,\t\t\t0,\n";
+
+
+static char tbl_nproc[] = "int %s_nproc =\n\tsizeof(%s_table)/sizeof(%s_table[0]);\n\n";
+
+static void write_table(const definition *def);
+static void printit(const char *prefix, const char *type);
+
+void
+write_tables(void)
+{
+ list *l;
+ definition *def;
+
+ f_print(fout, "\n");
+ for (l = defined; l != NULL; l = l->next) {
+ def = (definition *) l->val;
+ if (def->def_kind == DEF_PROGRAM) {
+ write_table(def);
+ }
+ }
+}
+
+static void
+write_table(const definition *def)
+{
+ version_list *vp;
+ proc_list *proc;
+ int current;
+ int expected;
+ char progvers[100];
+ int warning;
+
+ for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
+ warning = 0;
+ s_print(progvers, "%s_%s",
+ locase(def->def_name), vp->vers_num);
+ /* print the table header */
+ f_print(fout, tbl_hdr, progvers);
+
+ if (nullproc(vp->procs)) {
+ expected = 0;
+ }
+ else {
+ expected = 1;
+ f_print(fout, null_entry);
+ }
+ for (proc = vp->procs; proc != NULL; proc = proc->next) {
+ current = atoi(proc->proc_num);
+ if (current != expected++) {
+ f_print(fout,
+ "\n/*\n * WARNING: table out of order\n */\n");
+ if (warning == 0) {
+ f_print(stderr,
+ "WARNING %s table is out of order\n",
+ progvers);
+ warning = 1;
+ nonfatalerrors = 1;
+ }
+ expected = current + 1;
+ }
+ f_print(fout, "\n\t(char *(*)())RPCGEN_ACTION(");
+
+ /* routine to invoke */
+ if( Cflag && !newstyle )
+ pvname_svc(proc->proc_name, vp->vers_num);
+ else {
+ if( newstyle )
+ f_print( fout, "_"); /* calls internal func */
+ pvname(proc->proc_name, vp->vers_num);
+ }
+ f_print(fout, "),\n");
+
+ /* argument info */
+ if( proc->arg_num > 1 )
+ printit((char*) NULL, proc->args.argname );
+ else
+ /* do we have to do something special for newstyle */
+ printit( proc->args.decls->decl.prefix,
+ proc->args.decls->decl.type );
+ /* result info */
+ printit(proc->res_prefix, proc->res_type);
+ }
+
+ /* print the table trailer */
+ f_print(fout, tbl_end);
+ f_print(fout, tbl_nproc, progvers, progvers, progvers);
+ }
+}
+
+static void
+printit(const char *prefix, const char *type)
+{
+ int len;
+ int tabs;
+
+
+ len = fprintf(fout, "\txdr_%s,", stringfix(type));
+ /* account for leading tab expansion */
+ len += TABSIZE - 1;
+ /* round up to tabs required */
+ tabs = (TABSTOP - len + TABSIZE - 1)/TABSIZE;
+ f_print(fout, "%s", &tabstr[TABCOUNT-tabs]);
+
+ if (streq(type, "void")) {
+ f_print(fout, "0");
+ } else {
+ f_print(fout, "sizeof ( ");
+ /* XXX: should "follow" be 1 ??? */
+ ptype(prefix, type, 0);
+ f_print(fout, ")");
+ }
+ f_print(fout, ",\n");
+}
-/* @(#)rpc_util.c 2.1 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
*
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#ifndef lint
-static char sccsid[] = "@(#)rpc_util.c 1.5 87/06/24 (C) 1987 SMI";
-#endif
+
+/*
+ * From: @(#)rpc_util.c 1.11 89/02/22 (C) 1987 SMI
+ */
+char util_rcsid[] =
+ "$Id$";
/*
- * rpc_util.c, Utility routines for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsystems, Inc.
+ * rpc_util.c, Utility routines for the RPC protocol compiler
*/
#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
#include "rpc_scan.h"
#include "rpc_parse.h"
#include "rpc_util.h"
+#include "proto.h"
+
+#define ARGEXT "argument"
char curline[MAXLINESIZE]; /* current read line */
-char *where = curline; /* current point in line */
-int linenum = 0; /* current line number */
+const char *where = curline; /* current point in line */
+int linenum = 0; /* current line number */
-char *infilename; /* input filename */
+const char *infilename; /* input filename */
-#define NFILES 4
-char *outfiles[NFILES]; /* output file names */
+#define NFILES 7
+const char *outfiles[NFILES]; /* output file names */
int nfiles;
-FILE *fout; /* file pointer of current output */
-FILE *fin; /* file pointer of current input */
+FILE *fout; /* file pointer of current output */
+FILE *fin; /* file pointer of current input */
-list *defined; /* list of defined things */
+list *defined; /* list of defined things */
+
+static int findit(const definition *def, const char *type);
+static const char *fixit(const char *type, const char *orig);
+static int typedefed(const definition *def, const char *type);
+static const char *toktostr(tok_kind kind);
+static void printbuf(void);
+static void printwhere(void);
/*
- * Reinitialize the world
+ * Reinitialize the world
*/
-reinitialize()
+void
+reinitialize(void)
{
- bzero(curline, MAXLINESIZE);
+ memset(curline, 0, MAXLINESIZE);
where = curline;
linenum = 0;
defined = NULL;
}
/*
- * string equality
+ * string equality
*/
-streq(a, b)
- char *a;
- char *b;
+int
+streq(const char *a, const char *b)
{
return (strcmp(a, b) == 0);
}
/*
- * find a value in a list
+ * find a value in a list
*/
-char *
-findval(lst, val, cmp)
- list *lst;
- char *val;
- int (*cmp) ();
-
+definition *
+findval(list *lst, const char *val,
+ int (*cmp)(const definition *, const char *))
{
+
for (; lst != NULL; lst = lst->next) {
- if ((*cmp) (lst->val, val)) {
+ if (cmp(lst->val, val)) {
return (lst->val);
}
}
- return (NULL);
+ return NULL;
}
/*
- * store a value in a list
+ * store a value in a list
*/
void
-storeval(lstp, val)
- list **lstp;
- char *val;
+storeval(list **lstp, definition *val)
{
list **l;
list *lst;
+
for (l = lstp; *l != NULL; l = (list **) & (*l)->next);
lst = ALLOC(list);
lst->val = val;
*l = lst;
}
-
-static
-findit(def, type)
- definition *def;
- char *type;
+static int
+findit(const definition *def, const char *type)
{
return (streq(def->def_name, type));
}
-
-static char *
-fixit(type, orig)
- char *type;
- char *orig;
+static const char *
+fixit(const char *type, const char *orig)
{
definition *def;
- def = (definition *) FINDVAL(defined, type, findit);
+ def = findval(defined, type, findit);
if (def == NULL || def->def_kind != DEF_TYPEDEF) {
return (orig);
}
}
}
-char *
-fixtype(type)
- char *type;
+const char *
+fixtype(const char *type)
{
return (fixit(type, type));
}
-char *
-stringfix(type)
- char *type;
+const char *
+stringfix(const char *type)
{
if (streq(type, "string")) {
- return ("wrapstring");
- } else {
- return (type);
+ return "wrapstring";
+ }
+ else {
+ return type;
}
}
void
-ptype(prefix, type, follow)
- char *prefix;
- char *type;
- int follow;
+ptype(const char *prefix, const char *type, int follow)
{
if (prefix != NULL) {
if (streq(prefix, "enum")) {
}
}
-
-static
-typedefed(def, type)
- definition *def;
- char *type;
+static int
+typedefed(const definition *def, const char *type)
{
if (def->def_kind != DEF_TYPEDEF || def->def.ty.old_prefix != NULL) {
return (0);
}
}
-isvectordef(type, rel)
- char *type;
- relation rel;
+int
+isvectordef(const char *type, relation rel)
{
definition *def;
case REL_POINTER:
return (0);
case REL_ALIAS:
- def = (definition *) FINDVAL(defined, type, typedefed);
+ def = findval(defined, type, typedefed);
if (def == NULL) {
return (0);
}
}
}
-
-static char *
-locase(str)
- char *str;
+char *
+locase(const char *str)
{
char c;
static char buf[100];
char *p = buf;
- while (c = *str++) {
+ while ((c = *str++)!=0) {
*p++ = (c >= 'A' && c <= 'Z') ? (c - 'A' + 'a') : c;
}
*p = 0;
return (buf);
}
+void
+pvname_svc(const char *pname, const char *vnum)
+{
+ f_print(fout, "%s_%s_svc", locase(pname), vnum);
+}
void
-pvname(pname, vnum)
- char *pname;
- char *vnum;
+pvname(const char *pname, const char *vnum)
{
f_print(fout, "%s_%s", locase(pname), vnum);
}
-
/*
- * print a useful (?) error message, and then die
+ * print a useful (?) error message, and then die
*/
void
-error(msg)
- char *msg;
+error(const char *msg)
{
printwhere();
- f_print(stderr, _("%s, line %d: "), infilename, linenum);
+ f_print(stderr, "%s, line %d: ", infilename, linenum);
f_print(stderr, "%s\n", msg);
crash();
}
/*
* Something went wrong, unlink any files that we may have created and then
- * die.
+ * die.
*/
-crash()
+void
+crash(void)
{
int i;
exit(1);
}
-
void
-record_open(file)
- char *file;
+record_open(const char *file)
{
if (nfiles < NFILES) {
outfiles[nfiles++] = file;
- } else {
- f_print(stderr, _("too many files!\n"));
+ }
+ else {
+ f_print(stderr, "too many files!\n");
crash();
}
}
static char expectbuf[100];
-static char *toktostr();
/*
- * error, token encountered was not the expected one
+ * error, token encountered was not the expected one
*/
void
-expected1(exp1)
- tok_kind exp1;
+expected1(tok_kind exp1)
{
- s_print(expectbuf, _("expected '%s'"),
+ s_print(expectbuf, "expected '%s'",
toktostr(exp1));
error(expectbuf);
}
/*
- * error, token encountered was not one of two expected ones
+ * error, token encountered was not one of two expected ones
*/
void
-expected2(exp1, exp2)
- tok_kind exp1, exp2;
+expected2(tok_kind exp1, tok_kind exp2)
{
- s_print(expectbuf, _("expected '%s' or '%s'"),
+ s_print(expectbuf, "expected '%s' or '%s'",
toktostr(exp1),
toktostr(exp2));
error(expectbuf);
}
/*
- * error, token encountered was not one of 3 expected ones
+ * error, token encountered was not one of 3 expected ones
*/
void
-expected3(exp1, exp2, exp3)
- tok_kind exp1, exp2, exp3;
+expected3(tok_kind exp1, tok_kind exp2, tok_kind exp3)
{
- s_print(expectbuf, _("expected '%s', '%s' or '%s'"),
+ s_print(expectbuf, "expected '%s', '%s' or '%s'",
toktostr(exp1),
toktostr(exp2),
toktostr(exp3));
}
void
-tabify(f, tab)
- FILE *f;
- int tab;
+tabify(FILE *f, int tab)
{
while (tab--) {
(void) fputc('\t', f);
}
-
static token tokstrings[] = {
{TOK_IDENT, "identifier"},
{TOK_CONST, "const"},
{TOK_EOF, "??????"}
};
-static char *
-toktostr(kind)
- tok_kind kind;
+static const char *
+toktostr(tok_kind kind)
{
token *sp;
return (sp->str);
}
-
-
-static
-printbuf()
+static void
+printbuf(void)
{
char c;
int i;
# define TABSIZE 4
- for (i = 0; c = curline[i]; i++) {
+ for (i = 0; (c = curline[i])!=0; i++) {
if (c == '\t') {
cnt = 8 - (i % TABSIZE);
c = ' ';
}
}
-
-static
-printwhere()
+static void
+printwhere(void)
{
int i;
char c;
}
(void) fputc('\n', stderr);
}
+
+char *
+make_argname(const char *pname, const char *vname)
+{
+ char *name;
+
+ name = malloc(strlen(pname) + strlen(vname) + strlen(ARGEXT) + 3);
+ if (!name) {
+ fprintf(stderr, "failed in malloc");
+ exit(1);
+ }
+ sprintf(name, "%s_%s_%s", locase(pname), vname, ARGEXT);
+ return name;
+}
+
+bas_type *typ_list_h;
+bas_type *typ_list_t;
+
+void
+add_type(int len, const char *type)
+{
+ bas_type *ptr;
+
+
+ if ((ptr = malloc(sizeof(bas_type))) == NULL) {
+ fprintf(stderr, "failed in malloc");
+ exit(1);
+ }
+
+ ptr->name=type;
+ ptr->length=len;
+ ptr->next=NULL;
+ if(typ_list_t == NULL)
+ {
+
+ typ_list_t=ptr;
+ typ_list_h=ptr;
+ }
+ else
+ {
+
+ typ_list_t->next=ptr;
+ typ_list_t=ptr;
+ }
+
+}
+
+
+bas_type *find_type(const char *type)
+{
+ bas_type *ptr;
+
+ ptr=typ_list_h;
+
+
+ while(ptr != NULL)
+ {
+ if(strcmp(ptr->name,type) == 0)
+ return(ptr);
+ else
+ ptr=ptr->next;
+ };
+return(NULL);
+}
+
-/* @(#)rpc_util.h 2.1 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
+ *
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
+ *
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
- *
+ *
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
- *
+ *
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
- *
+ *
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-/* @(#)rpc_util.h 1.6 87/06/24 (C) 1987 SMI */
+
+/* @(#)rpc_util.h 1.5 90/08/29 (C) 1987 SMI */
/*
* rpc_util.h, Useful definitions for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsystems, Inc.
*/
-extern char *malloc();
+
+#include <stdlib.h>
#define alloc(size) malloc((unsigned)(size))
#define ALLOC(object) (object *) malloc(sizeof(object))
-/* extern char *sprintf(); --roland@gnu */
-
#define s_print (void) sprintf
#define f_print (void) fprintf
struct list {
- char *val;
+ definition *val;
struct list *next;
};
typedef struct list list;
+#define PUT 1
+#define GET 2
+
/*
* Global variables
*/
#define MAXLINESIZE 1024
extern char curline[MAXLINESIZE];
-extern char *where;
+extern const char *where;
extern int linenum;
-extern char *infilename;
+extern const char *infilename;
extern FILE *fout;
extern FILE *fin;
extern list *defined;
+
+extern bas_type *typ_list_h;
+extern bas_type *typ_list_t;
+
/*
- * rpc_util routines
+ * All the option flags
*/
-void storeval();
+extern int inetdflag;
+extern int pmflag;
+extern int tblflag;
+extern int logflag;
+extern int newstyle;
+extern int Cflag; /* C++ flag */
+extern int tirpcflag; /* flag for generating tirpc code */
+extern int inlineflag; /* if this is 0, then do not generate inline code */
-#define STOREVAL(list,item) \
- storeval(list,(char *)item)
+/*
+ * Other flags related with inetd jumpstart.
+ */
+extern int indefinitewait;
+extern int exitnow;
+extern int timerflag;
-char *findval();
+extern int nonfatalerrors;
-#define FINDVAL(list,item,finder) \
- findval(list, (char *) item, finder)
+/*
+ * rpc_util routines
+ */
+void storeval(list **lstp, definition *val);
+#define STOREVAL(list,item) storeval(list,item)
+
+definition *findval(list *lst, const char *val,
+ int (*cmp)(const definition *, const char *));
+#define FINDVAL(list,item,finder) findval(list, item, finder)
+
+const char *fixtype(const char *type);
+const char *stringfix(const char *type);
+char *locase(const char *str);
+void pvname_svc(const char *pname, const char *vnum);
+void pvname(const char *pname, const char *vnum);
+void ptype(const char *prefix, const char *type, int follow);
+int isvectordef(const char *type, relation rel);
+int streq(const char *a, const char *b);
+void error(const char *msg);
+void tabify(FILE *f, int tab);
+void record_open(const char *file);
+bas_type *find_type(const char *type);
-char *fixtype();
-char *stringfix();
-void pvname();
-void ptype();
-int isvectordef();
-int streq();
-void error();
-void expected1();
-void expected2();
-void expected3();
-void tabify();
-void record_open();
/*
* rpc_cout routines
*/
-void cprint();
-void emit();
+void emit(definition *def);
/*
* rpc_hout routines
*/
-void print_datadef();
+void print_datadef(definition *def);
+void print_funcdef(definition *def);
/*
* rpc_svcout routines
*/
-void write_most();
-void write_register();
-void write_rest();
-void write_programs();
-
+void write_most(const char *infile, int netflag, int nomain);
+void write_register(void);
+void write_rest(void);
+void write_programs(const char *storage);
+void write_svc_aux(int nomain);
+void write_inetd_register(const char *transp);
+void write_netid_register(const char *);
+void write_nettype_register(const char *);
/*
* rpc_clntout routines
*/
-void write_stubs();
+void write_stubs(void);
+
+/*
+ * rpc_tblout routines
+ */
+void write_tables(void);
je L2 /* yes => return */
incl %eax /* increment pointer */
- xorl $3, %edx /* was alignment = 3? */
-
- jz L1 /* yes => now it is aligned and start loop */
+ cmpb %dh, (%eax) /* is byte NUL? */
-L0: cmpb %dh, (%eax) /* is byte NUL? */
je L2 /* yes => return */
incl %eax /* increment pointer */
+ xorl $2, %edx
- cmpb %dh, (%eax) /* is byte NUL? */
+ jz L1
+
+L0: cmpb %dh, (%eax) /* is byte NUL? */
je L2 /* yes => return */
incl %eax /* increment pointer */
#else
jmp C_SYMBOL_NAME (__sigsetjmp)
#endif
+PSEUDO_END (_setjmp)
#else
jmp C_SYMBOL_NAME (__sigsetjmp)
#endif
+PSEUDO_END (setjmp)
-# Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
# $(BUILD_CFLAGS) needs to come last because it contains unwanted -Is.
$(common-objpfx)mk-stdiolim: $(sysdep_dir)/posix/mk-stdiolim.c \
posix1_lim.h local_lim.h
- cwd=`pwd`; cd $(common-objdir); \
+ cwd=`pwd`; cd $(objpfx).; \
$(BUILD_CC) $(cded-objdir-includes) $(BUILD_CFLAGS) \
- $$cwd/$< -o $(patsubst $(common-objpfx)%,%,$@)
+ $$cwd/$< -o $(patsubst $(common-objpfx)%,$(..)%,$@)
common-generated := $(common-generated) stdio_lim.h mk-stdiolim
dirp->fd = fd;
- __libc_lock_init (dirp->lock)
+ __libc_lock_init (dirp->lock);
return dirp;
}
jz thread_start
ret
- .size __clone,.-__clone
+PSEUDO_END (__clone)
SYSCALL_ERROR_HANDLER
subl %ebp,%ebp /* terminate the stack frame */
call *%ebx
pushl %eax
-#ifdef PIC
- call _exit@PLT
-#else
- call _exit
-#endif
+ call JUMPTARGET (_exit)
weak_alias(__clone, clone)
.text
ENTRY (__clone)
+ CALL_MCOUNT
+
/* Sanity check arguments. */
movel #-EINVAL, %d0
movel 4(%sp), %a0 /* no NULL function pointers */
#else
jbsr _exit
#endif
+PSEUDO_END (__clone)
weak_alias (__clone, clone)
SYSCALL_ERROR_HANDLER
ENTRY (__mmap)
+ CALL_MCOUNT
move.l #SYS_ify (mmap), %d0 /* System call number in %d0. */
mmap is declared to return a pointer. */
move.l %d0, %a0
rts
+PSEUDO_END (__mmap)
weak_alias (__mmap, mmap)
+++ /dev/null
-/* Structure describing state saved while handling a signal. Linux/m68k version.
-Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
-
-/* State of this thread when the signal was taken. */
-struct sigcontext
-{
- __sigset_t sc_mask;
- unsigned long sc_usp;
- unsigned long sc_d0;
- unsigned long sc_d1;
- unsigned long sc_a0;
- unsigned long sc_a1;
- unsigned short sc_sr;
- unsigned long sc_pc;
-};
.text
ENTRY (__sigreturn)
+ CALL_MCOUNT
+
addq.l #4, %sp /* Pop the return PC. */
DO_CALL (#SYS_ify (sigreturn), 0)
/* Do the system call; it never returns. */
/* NOTREACHED */
+PSEUDO_END (__sigreturn)
weak_alias (__sigreturn, sigreturn)
.globl P(__,socket)
ENTRY (P(__,socket))
+ CALL_MCOUNT
/* Save registers. */
move.l %d2, %a0
/* Successful; return the syscall's value. */
rts
+PSEUDO_END (P(__,socket))
weak_alias (P(__,socket), socket)
#include <sysdep.h>
+/* Please consult the file sysdeps/unix/sysv/linux/m68k/sysdep.h for
+ more information about the value -128 used below.*/
+
.text
SYSCALL_ERROR_HANDLER
ENTRY (syscall)
- move.l (%sp)+, %a0 /* Pop return address. */
- DO_CALL ((%sp), 5) /* Frob the args and do the system call. */
- tst.l %d0 /* Check %d0 for error. */
- jmi error /* Jump to error handler if negative. */
- jmp (%a0) /* Return to caller. */
+ CALL_MCOUNT
-error: pea (%a0)
- jra syscall_error
+ move.l 4(%sp), %d0 /* Load syscall number. */
+ _DOARGS_5 (24) /* Frob arguments. */
+ trap &0 /* Do the system call. */
+ UNDOARGS_5 /* Unfrob arguments. */
+ moveq.l &-128, %d1
+ cmp.l %d1, %d0 /* Check %d0 for error. */
+ jcc syscall_error /* Jump to error handler if negative. */
+ rts /* Return to caller. */
+PSEUDO_END (syscall)
/* The syscall stubs jump here when they detect an error. */
-ENTRY(__syscall_error)
+ENTRY (__syscall_error)
neg.l %d0
move.l %d0, errno
#ifdef _LIBC_REENTRANT
return a pointer. */
move.l %d0, %a0
rts
- .size __syscall_error, . - __syscall_error
+PSEUDO_END (__syscall_error)
#endif /* PIC */
-ERRNO(__errno_location)
+ENTRY (__errno_location)
+ CALL_MCOUNT
#ifdef PIC
move.l (%pc, errno@GOTPC), %a0
#else
lea errno, %a0
#endif
rts
- .size __errno_location, . - __errno_location
+PSEUDO_END (__errno_location)
#ifdef ASSEMBLER
-#define POUND #
-
/* Define an entry point visible from C. */
#define ENTRY(name) \
.globl name; \
#define syscall_error __syscall_error
/* Linux uses a negative return value to indicate syscall errors, unlike
- most Unices, which use the condition codes' carry flag. */
+ most Unices, which use the condition codes' carry flag.
+
+ Since version 2.1 the return value of a system call might be negative
+ even if the call succeeded. E.g., the `lseek' system call might return
+ a large offset. Therefore we must not anymore test for < 0, but test
+ for a real error by making sure the value in %d0 is a real error
+ number. For now (as of 2.1.1) 122 is the largest defined error number.
+ We allow for a bit of room for development and treat -128 to -1 as
+ error values. */
#define PSEUDO(name, syscall_name, args) \
.text; \
SYSCALL_ERROR_HANDLER \
ENTRY (name) \
- DO_CALL (POUND SYS_ify (syscall_name), args); \
- tst.l %d0; \
- jmi syscall_error;
+ DO_CALL (&SYS_ify (syscall_name), args); \
+ moveq.l &-128, %d1; \
+ cmp.l %d1, %d0; \
+ jcc syscall_error
+
+#undef PSEUDO_END
+#define PSEUDO_END(name) .size name, . - name
#ifdef PIC
/* Store (- %d0) into errno through the GOT. */
move.l %d0, -(%sp); \
jbsr __errno_location@PLTPC; \
move.l (%sp)+, (%a0); \
- move.l POUND -1, %d0; \
+ move.l &-1, %d0; \
/* Copy return value to %a0 for syscalls that are declared to return \
a pointer (e.g., mmap). */ \
move.l %d0, %a0; \
move.l (errno@GOTPC, %pc), %a0; \
neg.l %d0; \
move.l %d0, (%a0); \
- move.l POUND -1, %d0; \
+ move.l &-1, %d0; \
/* Copy return value to %a0 for syscalls that are declared to return \
a pointer (e.g., mmap). */ \
move.l %d0, %a0; \
#define DO_CALL(syscall, args) \
move.l syscall, %d0; \
DOARGS_##args \
- trap POUND 0; \
+ trap &0; \
UNDOARGS_##args
#define DOARGS_0 /* No arguments to frob. */
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#include <unistd.h>
+#include <sys/reboot.h>
extern int __syscall_reboot (int magic, int magic_too, int flag);
Boston, MA 02111-1307, USA. */
#include <time.h>
+#include <unistd.h>
unsigned int
sleep (unsigned int seconds)
getpgid - getpgid 1 __getpgid getpgid
getpgrp - getpgrp 0 getpgrp
getppid - getppid 0 __getppid getppid
+getresuid - getresuid 3 getresuid
getsid - getsid 1 getsid
init_module EXTRA init_module 5 init_module
ioperm - ioperm 3 ioperm
setfsgid EXTRA setfsgid 1 setfsgid
setfsuid EXTRA setfsuid 1 setfsuid
setpgid - setpgid 2 __setpgid setpgid
+setresuid - setresuid 3 setresuid
sigpending - sigpending 1 sigpending
sigprocmask - sigprocmask 3 __sigprocmask sigprocmask
s_sysctl sysctl _sysctl 1 __syscall__sysctl
__END_DECLS
+#ifdef __USE_BSD
+/* Set an alarm to go off (generating a SIGALRM signal) in VALUE
+ microseconds. If INTERVAL is nonzero, when the alarm goes off, the
+ timer is reset to go off every INTERVAL microseconds thereafter.
+ Returns the number of microseconds remaining before the alarm. */
+extern unsigned int ualarm __P ((unsigned int __value,
+ unsigned int __interval));
+#endif
+
#endif /* sys/time.h */