From 77fc484e851b8f4136bb601ac2bc4a1b06f891a7 Mon Sep 17 00:00:00 2001 From: Russ Allbery Date: Sat, 15 Oct 2005 17:26:32 +0000 Subject: [PATCH] STABLE14-shlibafssetpag-20051015 FIXES 18745 implement {sh,}libafssetpag --- src/cf/osconf.m4 | 6 +++ src/libafsauthent/Makefile.in | 10 ++++- src/shlibafsauthent/Makefile.in | 10 ++++- src/sys/.cvsignore | 2 + src/sys/Makefile.in | 65 +++++++++++++++++++++++++++++++- src/sys/afssetpag.exp | 1 + src/sys/afssetpag.map | 10 +++++ src/sys/afssyscalls.c | 50 ------------------------- src/sys/afssyscalls.h | 6 +++ src/sys/glue.c | 55 +++++++++++++++++++++++++++ src/sys/setpag.c | 66 +++++++++++++++++++++++++++++++++ 11 files changed, 227 insertions(+), 54 deletions(-) create mode 100644 src/sys/afssetpag.exp create mode 100644 src/sys/afssetpag.map create mode 100644 src/sys/glue.c create mode 100644 src/sys/setpag.c diff --git a/src/cf/osconf.m4 b/src/cf/osconf.m4 index 94c0238f9..1db1ed95f 100644 --- a/src/cf/osconf.m4 +++ b/src/cf/osconf.m4 @@ -393,6 +393,7 @@ case $AFS_SYSNAME in LEX="lex -l" REGEX_OBJ="regex.o" XCFLAGS="-traditional-cpp" + SHLIB_LINKER="${MT_CC} -dynamiclib" ;; ppc_darwin_13) @@ -401,6 +402,7 @@ case $AFS_SYSNAME in LWP_OPTMZ="-O2" REGEX_OBJ="regex.o" XCFLAGS="-no-cpp-precomp" + SHLIB_LINKER="${MT_CC} -dynamiclib" ;; ppc_darwin_14) @@ -409,6 +411,7 @@ case $AFS_SYSNAME in LWP_OPTMZ="-O2" REGEX_OBJ="regex.o" XCFLAGS="-no-cpp-precomp" + SHLIB_LINKER="${MT_CC} -dynamiclib" ;; ppc_darwin_60) @@ -418,6 +421,7 @@ case $AFS_SYSNAME in REGEX_OBJ="regex.o" XCFLAGS="-no-cpp-precomp" TXLIBS="-lncurses" + SHLIB_LINKER="${MT_CC} -dynamiclib" ;; ppc_darwin_70) @@ -444,6 +448,8 @@ case $AFS_SYSNAME in XCFLAGS="-no-cpp-precomp" TXLIBS="-lncurses" EXTRA_VLIBOBJS="fstab.o" + SHLIB_LINKER="${MT_CC} -dynamiclib" + SHLIB_LINKER="${MT_CC} -dynamiclib" ;; ppc_linux*) diff --git a/src/libafsauthent/Makefile.in b/src/libafsauthent/Makefile.in index a6b25ed01..f8eb58bfa 100644 --- a/src/libafsauthent/Makefile.in +++ b/src/libafsauthent/Makefile.in @@ -70,7 +70,9 @@ SYSOBJS = \ rmtsys.xdr.o \ rmtsys.cs.o \ afssyscalls.o \ - rmtsysnet.o + rmtsysnet.o \ + glue.o \ + setpag.o PTSERVEROBJS = \ ptclient.o \ @@ -244,6 +246,12 @@ afssyscalls.o: ${SYS}/afssyscalls.c rmtsysnet.o: ${SYS}/rmtsysnet.c ${CCRULE} +glue.o: ${SYS}/glue.c + ${CCRULE} + +setpag.o: ${SYS}/setpag.c + ${CCRULE} + clean: $(RM) -f *.o *.a libafsauthent* diff --git a/src/shlibafsauthent/Makefile.in b/src/shlibafsauthent/Makefile.in index 329c4ee61..c2482bb66 100644 --- a/src/shlibafsauthent/Makefile.in +++ b/src/shlibafsauthent/Makefile.in @@ -75,7 +75,9 @@ SYSOBJS = \ rmtsys.xdr.o \ rmtsys.cs.o \ afssyscalls.o \ - rmtsysnet.o + rmtsysnet.o \ + glue.o \ + setpag.o PTSERVEROBJS = \ ptclient.o \ @@ -260,6 +262,12 @@ afssyscalls.o: ${SYS}/afssyscalls.c rmtsysnet.o: ${SYS}/rmtsysnet.c ${CCRULE} +glue.o: ${SYS}/glue.c + ${CCRULE} + +setpag.o: ${SYS}/setpag.c + ${CCRULE} + clean: $(RM) -f *.o *.a libafsauthent* diff --git a/src/sys/.cvsignore b/src/sys/.cvsignore index 8489fedb0..d1a117f66 100644 --- a/src/sys/.cvsignore +++ b/src/sys/.cvsignore @@ -1,7 +1,9 @@ AFS_component_version_number.c Makefile +libafssetpag.* pagsh pagsh.krb +picobj rmtsys.cs.c rmtsys.h rmtsys.ss.c diff --git a/src/sys/Makefile.in b/src/sys/Makefile.in index 456a0fb44..e74258a4e 100644 --- a/src/sys/Makefile.in +++ b/src/sys/Makefile.in @@ -1,3 +1,8 @@ +# API version. When something changes, increment as appropriate. +# Ignore at your own risk. +LIBAFSSETPAGMAJOR=1 +LIBAFSSETPAGMINOR=0 + # Copyright 2000, International Business Machines Corporation and others. # All Rights Reserved. # @@ -14,9 +19,12 @@ CFLAGS=-I. -I${srcdir} ${DBUG} -I${TOP_OBJDIR}/src/config -I${TOP_INCDIR} ${XCF SFLAGS=-P -I${TOP_INCDIR} LIBS=libsys.a ${TOP_LIBDIR}/librx.a libsys.a ${TOP_LIBDIR}/liblwp.a ${TOP_LIBDIR}/util.a ${XLIBS} -OBJECTS= afssyscalls.o syscall.o +OBJECTS= afssyscalls.o setpag.o glue.o syscall.o +SHLIBOBJS = picobj/setpag.o picobj/glue.o syscall.o RMTOBJS=rmtsysnet.o rmtsysc.o rmtsys.cs.o rmtsys.xdr.o rmtsys.ss.o rmtsyss.o +LIBAFSSETPAG = libafssetpag.${SHLIB_SUFFIX}.${LIBAFSSETPAGMAJOR}.${LIBAFSSETPAGMINOR} + all: \ rmtsysd \ pagsh \ @@ -26,6 +34,7 @@ all: \ ${TOP_INCDIR}/afs/xfsattrs.h \ ${TOP_LIBDIR}/afs.exp \ ${TOP_LIBDIR}/libsys.a \ + ${TOP_LIBDIR}/${LIBAFSSETPAG} \ ${KERNELDIR}/afs \ ${KERNELDIR}/afs/xfsattrs.h \ ${UKERNELDIR}/afs \ @@ -41,6 +50,22 @@ libsys.a: ${OBJECTS} ${RMTOBJS} afsl.exp AFS_component_version_number.o $(AR) crv $@ afsl.exp;; \ esac +${LIBAFSSETPAG}: ${SHLIBOBJS} + case ${SYS_NAME} in \ + *_linux*) \ + ${SHLIB_LINKER} -Wl,-h,libafssetpag.so.${LIBAFSSETPAGMAJOR} \ + -o ${LIBAFSSETPAG} -Wl,--version-script=afssetpag.map \ + ${SHLIBOBJS};; \ + rs_aix4*) \ + ${SHLIB_LINKER} -o ${LIBAFSSETPAG} ${SHLIBOBJS} \ + -bE:afssetpag.exp;; \ + sun*_5*) \ + ${SHLIB_LINKER} -h libafssetpag.so.${LIBAFSSETPAGMAJOR} \ + -Wl,-M afssetpag.map -o ${LIBAFSSETPAG} ${SHLIBOBJS};; \ + *) \ + ${SHLIB_LINKER} -o ${LIBAFSSETPAG} ${SHLIBOBJS};; \ + esac + tests: pagsh pagsh.krb fixit iinc idec icreate iopen istat rmtsysd syscall.o: syscall.s @@ -68,6 +93,26 @@ syscall.o: syscall.s afssyscalls.o: afssyscalls.c afssyscalls.h ${CCOBJ} ${CFLAGS} -c ${srcdir}/afssyscalls.c +glue.o: glue.c afssyscalls.h + ${CCOBJ} ${CFLAGS} -c ${srcdir}/glue.c + +setpag.o: setpag.c afssyscalls.h + ${CCOBJ} ${CFLAGS} -c ${srcdir}/setpag.c + +picobj: afssyscalls.h + mkdir -p picobj + cp ${srcdir}/afssyscalls.h picobj/afssyscalls.h + +picobj/glue.o: picobj glue.c afssyscalls.h + rm -f picobj/glue.c + cp ${srcdir}/glue.c picobj/glue.c + cd picobj && ${CCOBJ} ${CFLAGS} ${SHLIB_CFLAGS} -c glue.c + +picobj/setpag.o: picobj setpag.c afssyscalls.h + rm -f picobj/setpag.c + cp ${srcdir}/setpag.c picobj/setpag.c + cd picobj && ${CCOBJ} ${CFLAGS} ${SHLIB_CFLAGS} -c setpag.c + rmtsysnet.o rmtsysc.o rmtsyss.o rmtsysd.o: rmtsys.h rmtsysd: AFS_component_version_number.o afs.exp afsl.exp @@ -129,6 +174,12 @@ xfsinode: xfsinode.c AFS_component_version_number.c $(CC) -o xfsinode ${CFLAGS} ${srcdir}/xfsinode.c ${LIBS} esac +${TOP_LIBDIR}/${LIBAFSSETPAG}: ${LIBAFSSETPAG} + ${INSTALL} ${LIBAFSSETPAG} ${TOP_LIBDIR}/${LIBAFSSETPAG} + -ln -f -s ${LIBAFSSETPAG} ${TOP_LIBDIR}/libafssetpag.${SHLIB_SUFFIX} + -ln -f -s ${LIBAFSSETPAG} ${TOP_LIBDIR}/libafssetpag.${SHLIB_SUFFIX}.${LIBAFSSETPAGMAJOR} + + afs.exp: ${srcdir}/afs4.exp ${srcdir}/afs5.exp case ${SYS_NAME} in \ rs_aix5* ) \ @@ -198,6 +249,7 @@ depinstall: \ install: \ ${DESTDIR}${libdir}/afs/libsys.a \ + ${DESTDIR}${libdir}/${LIBAFSSETPAG} \ ${DESTDIR}${sbindir}/rmtsysd \ ${DESTDIR}${includedir}/afs/afssyscalls.h \ ${DESTDIR}${bindir}/pagsh \ @@ -208,6 +260,13 @@ install: \ ${DESTDIR}${libdir}/afs/libsys.a: libsys.a ${INSTALL} $? $@ +${DESTDIR}${libdir}/${LIBAFSSETPAG}: ${LIBAFSSETPAG} + ${INSTALL} ${LIBAFSSETPAG} ${DESTDIR}${libdir}/${LIBAFSSETPAG} + -ln -f -s ${LIBAFSSETPAG} \ + ${DESTDIR}${libdir}/libafssetpag.${SHLIB_SUFFIX} + -ln -f -s ${LIBAFSSETPAG} \ + ${DESTDIR}${libdir}/libafssetpag.${SHLIB_SUFFIX}.${LIBAFSSETPAGMAJOR} + ${DESTDIR}${sbindir}/rmtsysd: rmtsysd ${INSTALL} -s $? $@ @@ -231,6 +290,7 @@ ${DESTDIR}${includedir}/afs/xfsattrs.h: xfsattrs.h dest: \ ${DEST}/lib/afs/libsys.a \ + ${TOP_LIBDIR}/${LIBAFSSETPAG} \ ${DEST}/etc/rmtsysd \ ${DEST}/bin/pagsh \ ${DEST}/bin/pagsh.krb \ @@ -271,4 +331,5 @@ clean: $(RM) -f *.o libsys.a xfsinode iinc idec icreate iopen istat core \ rmtsysc rmtsyss *.o rmtsys.ss.c rmtsys.cs.c rmtsys.xdr.c rmtsys.h \ rmtsysd AFS_component_version_number.c pagsh pagsh.krb \ - afs.exp afsl.exp + afs.exp afsl.exp libafssetpag.* + $(RM) -rf picobj diff --git a/src/sys/afssetpag.exp b/src/sys/afssetpag.exp new file mode 100644 index 000000000..65b79aed0 --- /dev/null +++ b/src/sys/afssetpag.exp @@ -0,0 +1 @@ +lsetpag diff --git a/src/sys/afssetpag.map b/src/sys/afssetpag.map new file mode 100644 index 000000000..e56525739 --- /dev/null +++ b/src/sys/afssetpag.map @@ -0,0 +1,10 @@ +# Export map for libafssetpag, used on Linux and Solaris to restrict +# exports from the shared libraries to just the public ABI. Add symbol +# versioning while we're at it, just in case. + +AFSSETPAG_1.0 { + global: + lsetpag; + local: + *; +}; diff --git a/src/sys/afssyscalls.c b/src/sys/afssyscalls.c index bb50ba3c0..cd44fbdc2 100644 --- a/src/sys/afssyscalls.c +++ b/src/sys/afssyscalls.c @@ -59,7 +59,6 @@ static void check_iops(int index, char *fun, char *file, int line); #pragma weak xiinc = iinc #pragma weak xidec = idec #pragma weak xiopen = iopen -#pragma weak xlsetpag = lsetpag #pragma weak xlpioctl = lpioctl #ifdef notdef #pragma weak xiread = iread @@ -205,12 +204,6 @@ iwrite(int dev, int inode, int inode_p1, unsigned int offset, char *cbuf, } #endif /* notdef */ -int -lsetpag(void) -{ - return (syscall(AFS_SETPAG)); -} - int lpioctl(char *path, int cmd, char *cmarg, int follow) { @@ -340,49 +333,6 @@ int ioctl_afs_syscall(long syscall, long param1, long param2, long param3, return 0; } #endif -#if defined(AFS_LINUX20_ENV) -int proc_afs_syscall(long syscall, long param1, long param2, long param3, - long param4, int *rval) { - struct afsprocdata syscall_data; - int fd = open(PROC_SYSCALL_FNAME, O_RDWR); - if(fd < 0) - fd = open(PROC_SYSCALL_ARLA_FNAME, O_RDWR); - if(fd < 0) - return -1; - - syscall_data.syscall = syscall; - syscall_data.param1 = param1; - syscall_data.param2 = param2; - syscall_data.param3 = param3; - syscall_data.param4 = param4; - - *rval = ioctl(fd, VIOC_SYSCALL, &syscall_data); - - close(fd); - - return 0; -} -#endif - -int -lsetpag(void) -{ - int errcode, rval; - -#if defined(AFS_LINUX20_ENV) - rval = proc_afs_syscall(AFSCALL_SETPAG,0,0,0,0,&errcode); - - if(rval) - errcode = syscall(AFS_SYSCALL, AFSCALL_SETPAG); -#elif defined(AFS_DARWIN80_ENV) - if (ioctl_afs_syscall(AFSCALL_SETPAG,0,0,0,0,0,0,&errcode)) - errcode=ENOSYS; -#else - errcode = syscall(AFS_SYSCALL, AFSCALL_SETPAG); -#endif - - return (errcode); -} int lpioctl(char *path, int cmd, char *cmarg, int follow) diff --git a/src/sys/afssyscalls.h b/src/sys/afssyscalls.h index 4adebcd5c..368c75328 100644 --- a/src/sys/afssyscalls.h +++ b/src/sys/afssyscalls.h @@ -39,6 +39,12 @@ extern FILE *inode_debug_log; #define AFS_DEBUG_IOPS_LOG(F) #endif +/* Glue layer. */ +#ifdef AFS_LINUX20_ENV +int proc_afs_syscall(long syscall, long param1, long param2, long param3, + long param4, int *rval); +#endif + /* Declarations for inode system calls. */ #ifdef AFS_SGI_XFS_IOPS_ENV extern uint64_t icreatename64(int dev, char *partname, int p0, int p1, int p2, diff --git a/src/sys/glue.c b/src/sys/glue.c new file mode 100644 index 000000000..fd6cec6fe --- /dev/null +++ b/src/sys/glue.c @@ -0,0 +1,55 @@ +/* + * Copyright 2000, International Business Machines Corporation and others. + * All Rights Reserved. + * + * This software has been released under the terms of the IBM Public + * License. For details, see the LICENSE file in the top-level source + * directory or online at http://www.openafs.org/dl/license10.html + * + * This file contains any necessary C glue to allow programs to communicate + * with the AFS kernel module. The necessary lower-level glue is defined in + * syscall.s. + */ + +#include +#include + +RCSID + ("$Header$"); + +#include +#include +#include +#if defined(AFS_SUN_ENV) && !defined(AFS_SUN5_ENV) +#include +#else +#include +#endif +#ifdef AFS_SUN5_ENV +#include +#endif +#include "afssyscalls.h" + +#ifdef AFS_LINUX20_ENV +int proc_afs_syscall(long syscall, long param1, long param2, long param3, + long param4, int *rval) { + struct afsprocdata syscall_data; + int fd = open(PROC_SYSCALL_FNAME, O_RDWR); + if(fd < 0) + fd = open(PROC_SYSCALL_ARLA_FNAME, O_RDWR); + if(fd < 0) + return -1; + + syscall_data.syscall = syscall; + syscall_data.param1 = param1; + syscall_data.param2 = param2; + syscall_data.param3 = param3; + syscall_data.param4 = param4; + + *rval = ioctl(fd, VIOC_SYSCALL, &syscall_data); + + close(fd); + + return 0; +} +#endif diff --git a/src/sys/setpag.c b/src/sys/setpag.c new file mode 100644 index 000000000..3e2e8c827 --- /dev/null +++ b/src/sys/setpag.c @@ -0,0 +1,66 @@ +/* + * Copyright 2000, International Business Machines Corporation and others. + * All Rights Reserved. + * + * This software has been released under the terms of the IBM Public + * License. For details, see the LICENSE file in the top-level source + * directory or online at http://www.openafs.org/dl/license10.html + * + * This file contains the lsetpag system call. (setpag is handled by the + * rmtsys layer and turned into either setpag or a remote call as is + * appropriate.) It is kept separate to allow for the creation of a simple + * shared library containing only setpag. + */ + +#include +#include + +RCSID + ("$Header$"); + +#include +#if defined(AFS_SUN_ENV) && !defined(AFS_SUN5_ENV) +#include +#else +#include +#endif +#include "afssyscalls.h" + +#ifdef AFS_AIX32_ENV +/* + * in VRMIX, system calls look just like function calls, so we don't + * need to do anything! + */ + +#else +#if defined(AFS_SGI_ENV) + +#pragma weak xlsetpag = lsetpag + +int +lsetpag(void) +{ + return (syscall(AFS_SETPAG)); +} + +#else /* AFS_SGI_ENV */ + +int +lsetpag(void) +{ + int errcode, rval; + +#ifdef AFS_LINUX20_ENV + rval = proc_afs_syscall(AFSCALL_SETPAG,0,0,0,0,&errcode); + + if(rval) + errcode = syscall(AFS_SYSCALL, AFSCALL_SETPAG); +#else + errcode = syscall(AFS_SYSCALL, AFSCALL_SETPAG); +#endif + + return (errcode); +} + +#endif /* !AFS_SGI_ENV */ +#endif /* !AFS_AIX32_ENV */ -- 2.39.5