[lockdev-devel] [PATCH 12/19] don't use inline functions in library interface

Ludwig Nussel ludwig.nussel at suse.de
Thu Feb 25 10:02:09 UTC 2010


---
 Makefile      |    3 +-
 src/baudboy.h |  115 ++++--------------------------------------------
 src/lockdev.c |  135 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/ttylock.h |   37 ++--------------
 4 files changed, 150 insertions(+), 140 deletions(-)

diff --git a/Makefile b/Makefile
index 41e2609..655aa27 100644
--- a/Makefile
+++ b/Makefile
@@ -27,6 +27,7 @@ CC	= gcc
 CFLAGS	= -g -O2 -Wall -pipe -fPIC 
 LCFLAGS	= ${CFLAGS} -D_REENTRANT
 LDLIBS	= -llockdev
+CPPFLAGS = -I$(srcdir)/src
 
 .PHONY: shared static perl-lib
 ALL:	shared static lockdev perl-lib
@@ -38,7 +39,7 @@ shared ${shared}:	${objs}
 	${CC} ${LCFLAGS} -shared -Wl,-soname,${soname} $^ -lc -o ${shared}
 
 lockdev.o: ${lockdev}
-	${CC} ${CFLAGS} -I./src -o $@ -c $^
+	${CC} ${CFLAGS} ${CPPFLAGS} -o $@ -c $^
 
 lockdev: lockdev.o ${static}
 	${CC} -o $@ $^
diff --git a/src/baudboy.h b/src/baudboy.h
index 55fcf9d..6e41afd 100644
--- a/src/baudboy.h
+++ b/src/baudboy.h
@@ -19,116 +19,21 @@
 #ifndef _BAUDBOY_H_
 #define _BAUDBOY_H_
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-#include <sys/wait.h>
-#include <sys/types.h>
-#include <errno.h>
-#include <unistd.h>
-#include <fcntl.h>
-
 #ifdef	__cplusplus
 extern "C" {
 #endif
 
-#define	LOCKDEV_PATH	"/usr/sbin/lockdev"
-
-static inline int _doit(const char * argv[])
-{
-    pid_t child;
-    int status;
-    void (*osig) (int) = signal(SIGCHLD, SIG_DFL);
-    int rc;
-
-    if (!(child = fork())) {
-	int fd;
-        /* these have to be open to something */
-	if ((fd = open("/dev/null", 2)) < 0)
-	    exit(-1);
-	dup2(fd, 0);
-	dup2(fd, 1);
-	dup2(fd, 2);
-	close(fd);
-	/* Swap egid and gid for lockdev's access(2) device check. */
-	setregid(getegid(), getgid());
-	execv(argv[0], (char *const *)argv);
-	exit(-1);
-    }
-
-    rc = (int) waitpid(child, &status, 0);
-    signal(SIGCHLD, osig);
-    if (rc == child && WIFEXITED(status)) {
-	/*
-	 * Exit		dev_lock	dev_unlock	dev_testlock
-	 *	  0	OK		OK		not locked
-	 *	  1	locked other	locked other	locked
-	 *	  2	EACCES
-	 *	  3	EROFS
-	 *	  4	EFAULT
-	 *	  5	EINVAL
-	 *	  6	ENAMETOOLONG
-	 *	  7	ENOENT
-	 *	  8	ENOTDIR
-	 *	  9	ENOMEM
-	 *	 10	ELOOP
-	 *	 11	EIO
-	 *	255	error		error		error
-	 */
-	rc = WEXITSTATUS(status);
-	switch(rc) {
-	case  0:	rc = 0;		break;
-	default:
-	case  1:	rc = -EPERM;	break;
-	case  2:	rc = -EACCES;	break;
-	case  3:	rc = -EROFS;	break;
-	case  4:	rc = -EFAULT;	break;
-	case  5:	rc = -EINVAL;	break;
-	case  6:	rc = -ENAMETOOLONG;	break;
-	case  7:	rc = -ENOENT;	break;
-	case  8:	rc = -ENOTDIR;	break;
-	case  9:	rc = -ENOMEM;	break;
-	case 10:	rc = -ELOOP;	break;
-	case 11:	rc = -EIO;	break;
-	}
-    } else if (rc == -1)
-	rc = -errno;
-    else
-	rc = -ECHILD;
-
-    return rc;
+int ttylock_helper (const char * devname);
+int ttywait_helper (const char * devname);
+int ttyunlock_helper (const char * devname);
+int ttylocked_helper (const char * devname);
 
-}
-
-static inline int ttylock(const char * devname)
-{
-    const char * argv[] = { LOCKDEV_PATH, "-l", NULL, NULL};
-    argv[2] = devname;
-    return _doit(argv);
-}
-
-static inline int ttyunlock(const char * devname)
-{
-    const char * argv[] = { LOCKDEV_PATH, "-u", NULL, NULL};
-    argv[2] = devname;
-    return _doit(argv);
-}
-
-static inline int ttylocked(const char * devname)
-{
-    const char * argv[] = { LOCKDEV_PATH, NULL, NULL};
-    argv[1] = devname;
-    return _doit(argv);
-}
-
-static inline int ttywait(const char * devname)
-{
-    int rc;
-    while((rc = ttylocked(devname)) == 0)
-	sleep(1);
-    return rc;
-}
+#ifndef _LIBLOCKDEV_NO_BAUDBOY_DEFINES
+#define ttylock(devname) ttylock_helper(devname)
+#define ttywait(devname) ttywait_helper(devname)
+#define ttyunlock(devname) ttyunlock_helper(devname)
+#define ttylocked(devname) ttylocked_helper(devname)
+#endif
 
 #ifdef	__cplusplus
 };
diff --git a/src/lockdev.c b/src/lockdev.c
index 786ef3d..c45a1dd 100644
--- a/src/lockdev.c
+++ b/src/lockdev.c
@@ -123,9 +123,12 @@
 #include <sys/param.h>
 #include <sys/stat.h>
 #include <sys/file.h>
-#define _BSD_SOURCE
 #include <sys/types.h>
+#include <sys/wait.h>
 #include "lockdev.h"
+#include "ttylock.h"
+#define _LIBLOCKDEV_NO_BAUDBOY_DEFINES
+#include "baudboy.h"
 
 /*
  *	PROTOTYPES for internal functions
@@ -900,3 +903,133 @@ dev_unlock (const char *devname,
 	close_n_return( 0);	/* successfully unlocked */
 }
 
+
+int
+ttylock(const char *devname)
+{
+	/* should set errno ? */
+	return dev_lock( devname) == 0 ? 0 : -1;
+}
+
+int
+ttyunlock (const char *devname)
+{
+	return dev_unlock(devname, 0);
+}
+
+int
+ttylocked(const char *devname)
+{
+	return dev_testlock( devname) == 0 ? 0 : -1;
+}
+
+int
+ttywait (const char *devname)
+{
+
+	int rc;
+	while((rc = ttylocked(devname)) == 0)
+		sleep(1);
+	return rc;
+}
+
+#define	LOCKDEV_PATH	"/usr/sbin/lockdev"
+
+static int _spawn_helper(const char * argv[])
+{
+    pid_t child;
+    int status;
+    void (*osig) (int) = signal(SIGCHLD, SIG_DFL);
+    int rc;
+
+    if (!(child = fork())) {
+	int fd;
+        /* these have to be open to something */
+	if ((fd = open("/dev/null", 2)) < 0)
+	    exit(-1);
+	dup2(fd, 0);
+	dup2(fd, 1);
+	dup2(fd, 2);
+	close(fd);
+	/* Swap egid and gid for lockdev's access(2) device check. */
+	setregid(getegid(), getgid());
+	execv(argv[0], (char *const *)argv);
+	exit(-1);
+    }
+
+    rc = (int) waitpid(child, &status, 0);
+    signal(SIGCHLD, osig);
+    if (rc == child && WIFEXITED(status)) {
+	/*
+	 * Exit		dev_lock	dev_unlock	dev_testlock
+	 *	  0	OK		OK		not locked
+	 *	  1	locked other	locked other	locked
+	 *	  2	EACCES
+	 *	  3	EROFS
+	 *	  4	EFAULT
+	 *	  5	EINVAL
+	 *	  6	ENAMETOOLONG
+	 *	  7	ENOENT
+	 *	  8	ENOTDIR
+	 *	  9	ENOMEM
+	 *	 10	ELOOP
+	 *	 11	EIO
+	 *	255	error		error		error
+	 */
+	rc = WEXITSTATUS(status);
+	switch(rc) {
+	case  0:	rc = 0;		break;
+	default:
+	case  1:	rc = -EPERM;	break;
+	case  2:	rc = -EACCES;	break;
+	case  3:	rc = -EROFS;	break;
+	case  4:	rc = -EFAULT;	break;
+	case  5:	rc = -EINVAL;	break;
+	case  6:	rc = -ENAMETOOLONG;	break;
+	case  7:	rc = -ENOENT;	break;
+	case  8:	rc = -ENOTDIR;	break;
+	case  9:	rc = -ENOMEM;	break;
+	case 10:	rc = -ELOOP;	break;
+	case 11:	rc = -EIO;	break;
+	}
+    } else if (rc == -1)
+	rc = -errno;
+    else
+	rc = -ECHILD;
+
+    return rc;
+
+}
+
+int
+ttylock_helper(const char * devname)
+{
+    const char * argv[] = { LOCKDEV_PATH, "-l", NULL, NULL};
+    argv[2] = devname;
+    return _spawn_helper(argv);
+}
+
+int
+ttyunlock_helper(const char * devname)
+{
+    const char * argv[] = { LOCKDEV_PATH, "-u", NULL, NULL};
+    argv[2] = devname;
+    return _spawn_helper(argv);
+}
+
+int
+ttylocked_helper(const char * devname)
+{
+    const char * argv[] = { LOCKDEV_PATH, NULL, NULL};
+    argv[1] = devname;
+    return _spawn_helper(argv);
+}
+
+int
+ttywait_helper(const char * devname)
+{
+    int rc;
+    while((rc = ttylocked_helper(devname)) == 0)
+	sleep(1);
+    return rc;
+}
diff --git a/src/ttylock.h b/src/ttylock.h
index 5274a50..c36ebe2 100644
--- a/src/ttylock.h
+++ b/src/ttylock.h
@@ -36,39 +36,10 @@ extern "C" {
 
 /* API of the library */
 
-int ttylock (char * devname);
-int ttywait (char * devname);
-int ttyunlock (char * devname);
-int ttylocked (char * devname);
-
-
-static inline int
-ttylock(char *devname)
-{
-	/* should set errno ? */
-	return dev_lock( devname) == 0 ? 0 : -1;
-}
-
-static inline int
-ttyunlock (char *devname)
-{
-	return dev_unlock(devname, 0);
-}
-
-static inline int
-ttylocked(char *devname)
-{
-	return dev_testlock( devname) == 0 ? 0 : -1;
-}
-
-static inline int
-ttywait (char *devname)
-{
-	while( dev_testlock( devname)) {
-		sleep(1);
-	}
-}
-
+int ttylock (const char * devname);
+int ttywait (const char * devname);
+int ttyunlock (const char * devname);
+int ttylocked (const char * devname);
 
 #ifdef	__cplusplus
 };
-- 
1.6.4.2




More information about the lockdev-devel mailing list