[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