shlibafssetpag-20051015
authorRuss Allbery <rra@stanford.edu>
Sat, 15 Oct 2005 17:25:21 +0000 (17:25 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sat, 15 Oct 2005 17:25:21 +0000 (17:25 +0000)
FIXES 18745

implement {sh,}libafssetpag

src/cf/osconf.m4
src/libafsauthent/Makefile.in
src/shlibafsauthent/Makefile.in
src/sys/.cvsignore
src/sys/Makefile.in
src/sys/afssetpag.exp [new file with mode: 0644]
src/sys/afssetpag.map [new file with mode: 0644]
src/sys/afssyscalls.c
src/sys/afssyscalls.h
src/sys/glue.c [new file with mode: 0644]
src/sys/setpag.c [new file with mode: 0644]

index 97b20bd..6adde05 100644 (file)
@@ -402,6 +402,7 @@ case $AFS_SYSNAME in
                LEX="lex -l"
                REGEX_OBJ="regex.o"
                XCFLAGS="-traditional-cpp"
+               SHLIB_LINKER="${MT_CC} -dynamiclib"
                ;;
 
        ppc_darwin_13)
@@ -410,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_14)
@@ -418,6 +420,7 @@ case $AFS_SYSNAME in
                LWP_OPTMZ="-O2"
                REGEX_OBJ="regex.o"
                XCFLAGS="-no-cpp-precomp"
+               SHLIB_LINKER="${MT_CC} -dynamiclib"
                ;;
 
        ppc_darwin_60)
@@ -427,6 +430,7 @@ case $AFS_SYSNAME in
                REGEX_OBJ="regex.o"
                XCFLAGS="-no-cpp-precomp"
                TXLIBS="-lncurses"
+               SHLIB_LINKER="${MT_CC} -dynamiclib"
                ;;
 
        ppc_darwin_70)
@@ -440,6 +444,7 @@ case $AFS_SYSNAME in
                XCFLAGS="-no-cpp-precomp"
                TXLIBS="-lncurses"
                EXTRA_VLIBOBJS="fstab.o"
+               SHLIB_LINKER="${MT_CC} -dynamiclib"
                ;;
 
        *_darwin_80)
@@ -453,6 +458,7 @@ case $AFS_SYSNAME in
                XCFLAGS="-no-cpp-precomp"
                TXLIBS="-lncurses"
                EXTRA_VLIBOBJS="fstab.o"
+               SHLIB_LINKER="${MT_CC} -dynamiclib"
                ;;
 
        ppc_linux*)
index a6b25ed..f8eb58b 100644 (file)
@@ -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*
 
index 329c4ee..c2482bb 100644 (file)
@@ -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*
 
index 8489fed..d1a117f 100644 (file)
@@ -1,7 +1,9 @@
 AFS_component_version_number.c
 Makefile
+libafssetpag.*
 pagsh
 pagsh.krb
+picobj
 rmtsys.cs.c
 rmtsys.h
 rmtsys.ss.c
index 456a0fb..e74258a 100644 (file)
@@ -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 (file)
index 0000000..65b79ae
--- /dev/null
@@ -0,0 +1 @@
+lsetpag
diff --git a/src/sys/afssetpag.map b/src/sys/afssetpag.map
new file mode 100644 (file)
index 0000000..e565257
--- /dev/null
@@ -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:
+        *;
+};
index bb50ba3..cd44fbd 100644 (file)
@@ -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
@@ -206,12 +205,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)
 {
     return (syscall(AFS_PIOCTL, path, cmd, cmarg, 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)
index 4adebcd..368c753 100644 (file)
@@ -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 (file)
index 0000000..fd6cec6
--- /dev/null
@@ -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 <afsconfig.h>
+#include <afs/param.h>
+
+RCSID
+    ("$Header$");
+
+#include <afs/afs_args.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
+#if defined(AFS_SUN_ENV) && !defined(AFS_SUN5_ENV)
+#include <unistd.h>
+#else
+#include <stdio.h>
+#endif
+#ifdef AFS_SUN5_ENV
+#include <fcntl.h>
+#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 (file)
index 0000000..3e2e8c8
--- /dev/null
@@ -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 <afsconfig.h>
+#include <afs/param.h>
+
+RCSID
+    ("$Header$");
+
+#include <afs/afs_args.h>
+#if defined(AFS_SUN_ENV) && !defined(AFS_SUN5_ENV)
+#include <unistd.h>
+#else
+#include <stdio.h>
+#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 */