diff options
-rw-r--r-- | NEWS | 7 | ||||
-rw-r--r-- | doc/index.html | 2 | ||||
-rw-r--r-- | doc/libstddjb/djbunix.html | 45 | ||||
-rw-r--r-- | doc/license.html | 2 | ||||
-rw-r--r-- | doc/upgrade.html | 4 | ||||
-rw-r--r-- | package/deps.mak | 11 | ||||
-rw-r--r-- | package/info | 2 | ||||
-rw-r--r-- | src/include/skalibs/djbunix.h | 12 | ||||
-rw-r--r-- | src/include/skalibs/exec.h | 2 | ||||
-rw-r--r-- | src/libstddjb/fd_islocked.c | 17 | ||||
-rw-r--r-- | src/libstddjb/fd_lock.c | 25 | ||||
-rw-r--r-- | src/libstddjb/fd_unlock.c | 20 | ||||
-rw-r--r-- | src/libstddjb/ipc_bind_reuse_lock.c | 6 | ||||
-rw-r--r-- | src/libstddjb/lock_ex.c | 34 | ||||
-rw-r--r-- | src/libstddjb/lock_exnb.c | 35 | ||||
-rw-r--r-- | src/libstddjb/lock_sh.c | 34 | ||||
-rw-r--r-- | src/libstddjb/lock_shnb.c | 35 | ||||
-rw-r--r-- | src/libstddjb/lock_un.c | 34 | ||||
-rw-r--r-- | src/libstddjb/lock_unx.c | 11 |
19 files changed, 101 insertions, 237 deletions
@@ -1,14 +1,15 @@ Changelog for skalibs. -In 2.9.4.0 ----------- +In 2.10.0.0 +----------- - New openc_* functions. - New function: ipc_bind_reuse_lock(), taking a lock before unconditionally deleting the socket. - ipc_bind_reuse() rewritten to use ipc_bind_reuse_lock(), so it does the right thing instead of clobbering sockets. - - Complete revamping of the pathexec functions, see exec.h + - Complete revamping of the pathexec functions, see exec.h. + - Revamping of the locking functions. In 2.9.3.0 diff --git a/doc/index.html b/doc/index.html index c7cb59c..66095a2 100644 --- a/doc/index.html +++ b/doc/index.html @@ -60,7 +60,7 @@ with a standard C development environment </li> <h3> Download </h3> <ul> - <li> The current released version of skalibs is <a href="skalibs-2.9.4.0.tar.gz">2.9.4.0</a>. </li> + <li> The current released version of skalibs is <a href="skalibs-2.10.0.0.tar.gz">2.10.0.0</a>. </li> <li> Alternatively, you can checkout a copy of the <a href="//git.skarnet.org/cgi-bin/cgit.cgi/skalibs/">skalibs git repository</a>: diff --git a/doc/libstddjb/djbunix.html b/doc/libstddjb/djbunix.html index e70fe4f..54aaf50 100644 --- a/doc/libstddjb/djbunix.html +++ b/doc/libstddjb/djbunix.html @@ -202,45 +202,26 @@ with errno saved, used essentially to isolate application code from </p> <p> -<code> int lock_ex (int fd) </code> <br /> -Gets an exclusive advisory lock on <em>fd</em>. <em>fd</em> must point to -a regular file, open for writing. Blocks until the lock can be obtained. -Returns 0 if it succeeds, or -1 (and sets errno) if it fails. -</p> - -<p> -<code> int lock_exnb (int fd) </code> <br /> -Gets an exclusive advisory lock on <em>fd</em>. <em>fd</em> must point to -a regular file, open for writing. -Returns 0 if it succeeds, or -1 (and sets errno) if it fails. If the lock -is held and the function would block, it immediately returns with -1 EWOULDBLOCK. -</p> - -<p> -<code> int lock_sh (int fd) </code> <br /> -Gets a shared advisory lock on <em>fd</em>. <em>fd</em> must point to -a regular file, open for reading. Blocks until the lock can be obtained. -Returns 0 if it succeeds, or -1 (and sets errno) if it fails. -</p> - -<p> -<code> int lock_shnb (int fd) </code> <br /> -Gets a shared advisory lock on <em>fd</em>. <em>fd</em> must point to -a regular file, open for reading. -Returns 0 if it succeeds, or -1 (and sets errno) if it fails. If the lock -is held and the function would block, it immediately returns with -1 EWOULDBLOCK. +<code> int fd_lock (int fd, int w, int nb) </code> <br /> +Gets an advisory lock on <em>fd</em>: shared if <em>w</em> is +zero, exclusive otherwise. <em>fd</em> must point to +a regular file, open for writing or reading depending on whether +you want an exclusive lock or not. If <em>nb</em> is zero, the +function blocks until the lock can be obtained; otherwise it +returns 0 immediately. On success, the function returns 1 ; it +returns 0 if it cannot take the lock, or -1 (and sets errno) if +an error occurs. </p> <p> -<code> int lock_un (int fd) </code> <br /> +<code> void fd_unlock (int fd) </code> <br /> Releases a previously held lock on <em>fd</em>. -Returns 0 if it succeeds, or -1 (and sets errno) if it fails. </p> <p> -<code> void lock_unx (int fd) </code> <br /> -Like <tt>lock_un</tt>, but without a return code and without -modifying errno. +<code> int fd_islocked (int fd) </code> <br /> +Returns 1 if a lock is currently held on fd, 0 otherwise. +Returns -1 (and sets errno) if an error occurs. </p> <p> diff --git a/doc/license.html b/doc/license.html index 9aae77e..bfc1d5f 100644 --- a/doc/license.html +++ b/doc/license.html @@ -74,7 +74,7 @@ color, or different text font. </li> <p> <em>I am aware that the previous restrictions sound completely ridiculous while the official skalibs documentation is incomplete. -As of 2.9.4.0, I'm not going to enforce those restrictions, but if you're +As of 2.10.0.0, I'm not going to enforce those restrictions, but if you're going to provide documentation for skalibs, don't keep it to yourself, please send it to me instead. :-) </em> </p> diff --git a/doc/upgrade.html b/doc/upgrade.html index da2185c..8a87d7d 100644 --- a/doc/upgrade.html +++ b/doc/upgrade.html @@ -16,7 +16,7 @@ <a href="//skarnet.org/">skarnet.org</a> </p> -<h2> in 2.9.4.0 </h2> +<h2> in 2.10.0.0 </h2> <ul> <li> New <tt>openc_*</tt> functions, which are O_CLOEXEC versions of the @@ -25,6 +25,8 @@ deleting a Unix domain socket. The <tt>ipc_bind_reuse()</tt> function now uses it, so it won't unconditionally clobber sockets in the filesystem anymore. </li> <li> Complete revamping of the pathexec functions, see <tt>exec.h</tt>. </li> + <li> Revamping of the locking functions, see +<a href="libstddjb/djbunix.html>djbunix.h</a>. </li> </ul> <h2> in 2.9.3.0 </h2> diff --git a/package/deps.mak b/package/deps.mak index 7326f76..ae9f340 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -19,7 +19,7 @@ src/include/skalibs/cdb.h: src/include/skalibs/gccattributes.h src/include/skalibs/cdb_make.h: src/include/skalibs/allreadwrite.h src/include/skalibs/buffer.h src/include/skalibs/diuint32.h src/include/skalibs/genalloc.h src/include/skalibs/datastruct.h: src/include/skalibs/avlnode.h src/include/skalibs/avltree.h src/include/skalibs/avltreen.h src/include/skalibs/bigkv.h src/include/skalibs/genqdyn.h src/include/skalibs/genset.h src/include/skalibs/gensetdyn.h src/include/skalibs/djbtime.h: src/include/skalibs/tai.h src/include/skalibs/uint64.h -src/include/skalibs/djbunix.h: src/include/skalibs/exec.h src/include/skalibs/gccattributes.h src/include/skalibs/stralloc.h +src/include/skalibs/djbunix.h: src/include/skalibs/gccattributes.h src/include/skalibs/stralloc.h src/include/skalibs/env.h: src/include/skalibs/gccattributes.h src/include/skalibs/stralloc.h src/include/skalibs/envalloc.h: src/include/skalibs/genalloc.h src/include/skalibs/environ.h: src/include/skalibs/posixplz.h @@ -349,6 +349,8 @@ src/libstddjb/fd_close.o src/libstddjb/fd_close.lo: src/libstddjb/fd_close.c src src/libstddjb/fd_copy.o src/libstddjb/fd_copy.lo: src/libstddjb/fd_copy.c src/include/skalibs/djbunix.h src/libstddjb/fd_copy2.o src/libstddjb/fd_copy2.lo: src/libstddjb/fd_copy2.c src/include/skalibs/djbunix.h src/libstddjb/fd_ensure_open.o src/libstddjb/fd_ensure_open.lo: src/libstddjb/fd_ensure_open.c src/include/skalibs/djbunix.h +src/libstddjb/fd_islocked.o src/libstddjb/fd_islocked.lo: src/libstddjb/fd_islocked.c src/include/skalibs/djbunix.h +src/libstddjb/fd_lock.o src/libstddjb/fd_lock.lo: src/libstddjb/fd_lock.c src/include/skalibs/djbunix.h src/include/skalibs/error.h src/libstddjb/fd_move.o src/libstddjb/fd_move.lo: src/libstddjb/fd_move.c src/include/skalibs/djbunix.h src/libstddjb/fd_move2.o src/libstddjb/fd_move2.lo: src/libstddjb/fd_move2.c src/include/skalibs/djbunix.h src/libstddjb/fd_read.o src/libstddjb/fd_read.lo: src/libstddjb/fd_read.c src/include/skalibs/allreadwrite.h @@ -357,6 +359,7 @@ src/libstddjb/fd_recv.o src/libstddjb/fd_recv.lo: src/libstddjb/fd_recv.c src/in src/libstddjb/fd_send.o src/libstddjb/fd_send.lo: src/libstddjb/fd_send.c src/include/skalibs/allreadwrite.h src/libstddjb/fd_shutdown.o src/libstddjb/fd_shutdown.lo: src/libstddjb/fd_shutdown.c src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/libstddjb/fd_sync.o src/libstddjb/fd_sync.lo: src/libstddjb/fd_sync.c src/include/skalibs/djbunix.h +src/libstddjb/fd_unlock.o src/libstddjb/fd_unlock.lo: src/libstddjb/fd_unlock.c src/include/skalibs/djbunix.h src/libstddjb/fd_write.o src/libstddjb/fd_write.lo: src/libstddjb/fd_write.c src/include/skalibs/allreadwrite.h src/libstddjb/fd_writev.o src/libstddjb/fd_writev.lo: src/libstddjb/fd_writev.c src/include/skalibs/allreadwrite.h src/libstddjb/filecopy_suffix.o src/libstddjb/filecopy_suffix.lo: src/libstddjb/filecopy_suffix.c src/include/skalibs/djbunix.h @@ -448,12 +451,6 @@ src/libstddjb/localtmn_fmt.o src/libstddjb/localtmn_fmt.lo: src/libstddjb/localt src/libstddjb/localtmn_from_sysclock.o src/libstddjb/localtmn_from_sysclock.lo: src/libstddjb/localtmn_from_sysclock.c src/include/skalibs/djbtime.h src/libstddjb/localtmn_from_tain.o src/libstddjb/localtmn_from_tain.lo: src/libstddjb/localtmn_from_tain.c src/include/skalibs/djbtime.h src/libstddjb/localtmn_scan.o src/libstddjb/localtmn_scan.lo: src/libstddjb/localtmn_scan.c src/include/skalibs/djbtime.h src/include/skalibs/uint32.h -src/libstddjb/lock_ex.o src/libstddjb/lock_ex.lo: src/libstddjb/lock_ex.c src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/include/skalibs/sysdeps.h -src/libstddjb/lock_exnb.o src/libstddjb/lock_exnb.lo: src/libstddjb/lock_exnb.c src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/include/skalibs/sysdeps.h -src/libstddjb/lock_sh.o src/libstddjb/lock_sh.lo: src/libstddjb/lock_sh.c src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/include/skalibs/sysdeps.h -src/libstddjb/lock_shnb.o src/libstddjb/lock_shnb.lo: src/libstddjb/lock_shnb.c src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/include/skalibs/sysdeps.h -src/libstddjb/lock_un.o src/libstddjb/lock_un.lo: src/libstddjb/lock_un.c src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/include/skalibs/sysdeps.h -src/libstddjb/lock_unx.o src/libstddjb/lock_unx.lo: src/libstddjb/lock_unx.c src/include/skalibs/djbunix.h src/libstddjb/lolprintf.o src/libstddjb/lolprintf.lo: src/libstddjb/lolprintf.c src/include/skalibs/buffer.h src/include/skalibs/lolstdio.h src/libstddjb/ltm64_from_localtm.o src/libstddjb/ltm64_from_localtm.lo: src/libstddjb/ltm64_from_localtm.c src/include/skalibs/djbtime.h src/include/skalibs/tai.h src/libstddjb/ltm64_from_sysclock.o src/libstddjb/ltm64_from_sysclock.lo: src/libstddjb/ltm64_from_sysclock.c src/include/skalibs/config.h src/include/skalibs/djbtime.h src/include/skalibs/tai.h diff --git a/package/info b/package/info index 5d41757..4b51f1f 100644 --- a/package/info +++ b/package/info @@ -1,4 +1,4 @@ package=skalibs -version=2.9.4.0 +version=2.10.0.0 category=prog package_macro_name=SKALIBS diff --git a/src/include/skalibs/djbunix.h b/src/include/skalibs/djbunix.h index 885a623..1f356e1 100644 --- a/src/include/skalibs/djbunix.h +++ b/src/include/skalibs/djbunix.h @@ -9,7 +9,6 @@ #include <skalibs/gccattributes.h> #include <skalibs/stralloc.h> -#include <skalibs/exec.h> /* compat */ #define DJBUNIX_FLAG_NB 0x01U #define DJBUNIX_FLAG_COE 0x02U @@ -35,12 +34,11 @@ extern size_t fd_catn (int, int, size_t) ; extern int fd_ensure_open (int, int) ; #define fd_sanitize() (fd_ensure_open(0, 0) && fd_ensure_open(1, 1) && fd_ensure_open(2, 1)) extern void fd_shutdown (int, int) ; -extern int lock_ex (int) ; -extern int lock_exnb (int) ; -extern int lock_sh (int) ; -extern int lock_shnb (int) ; -extern int lock_un (int) ; -extern void lock_unx (int) ; + +extern int fd_lock (int, int, int) ; +extern void fd_unlock (int) ; +extern int fd_islocked (int) ; + extern int open2 (char const *, unsigned int) ; extern int open3 (char const *, unsigned int, unsigned int) ; extern int open_read (char const *) ; diff --git a/src/include/skalibs/exec.h b/src/include/skalibs/exec.h index d32d3dc..67fed27 100644 --- a/src/include/skalibs/exec.h +++ b/src/include/skalibs/exec.h @@ -139,6 +139,7 @@ extern void xmexec0_af (char const *, char const *const *, char const *const *, /* Compatibility */ +#if 0 #define pathexec_run(file, argv, envp) exec_ae(file, argv, envp) #define pathexec0_run(argv, envp) exec0_e(argv, envp) #define xpathexec_run(file, argv, envp) xexec_ae(file, argv, envp) @@ -156,5 +157,6 @@ extern void xmexec0_af (char const *, char const *const *, char const *const *, #define pathexec_r(argv, envp, envlen, modif, modiflen) mexec_fm(argv, envp, envlen, modif, modiflen) #define xpathexec_r_name(file, argv, envp, envlen, modif, modiflen) xmexec_afm(file, argv, envp, envlen, modif, modiflen) #define xpathexec_r(argv, envp, envlen, modif, modiflen) xmexec_fm(argv, envp, envlen, modif, modiflen) +#endif #endif diff --git a/src/libstddjb/fd_islocked.c b/src/libstddjb/fd_islocked.c new file mode 100644 index 0000000..bf9f9e8 --- /dev/null +++ b/src/libstddjb/fd_islocked.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include <fcntl.h> + +#include <skalibs/djbunix.h> + +int fd_islocked (int fd) +{ + struct flock fl = + { + .l_type = F_RDLCK, + .l_whence = SEEK_SET, + .l_start = 0, + .l_len = 0 + } ; + return fcntl(fd, F_GETLK, &fl) < 0 ? -1 : fl.l_type != F_UNLCK ; +} diff --git a/src/libstddjb/fd_lock.c b/src/libstddjb/fd_lock.c new file mode 100644 index 0000000..422e667 --- /dev/null +++ b/src/libstddjb/fd_lock.c @@ -0,0 +1,25 @@ +/* ISC license. */ + +#include <fcntl.h> +#include <errno.h> + +#include <skalibs/error.h> +#include <skalibs/djbunix.h> + +int fd_lock (int fd, int w, int nb) +{ + struct flock fl = + { + .l_type = w ? F_WRLCK : F_RDLCK, + .l_whence = SEEK_SET, + .l_start = 0, + .l_len = 0 + } ; + int e = errno ; + int r ; + do r = fcntl(fd, nb ? F_SETLK : F_SETLKW, &fl) ; + while (r < 0 && errno == EINTR) ; + return r >= 0 ? 1 : + errno == EACCES || error_isagain(errno) ? (errno = e, 0) : + -1 ; +} diff --git a/src/libstddjb/fd_unlock.c b/src/libstddjb/fd_unlock.c new file mode 100644 index 0000000..4c63fd9 --- /dev/null +++ b/src/libstddjb/fd_unlock.c @@ -0,0 +1,20 @@ +/* ISC license. */ + +#include <fcntl.h> +#include <errno.h> + +#include <skalibs/djbunix.h> + +void fd_unlock (int fd) +{ + struct flock fl = + { + .l_type = F_UNLCK, + .l_whence = SEEK_SET, + .l_start = 0, + .l_len = 0 + } ; + int e = errno ; + fcntl(fd, F_SETLK, &fl) ; + errno = e ; +} diff --git a/src/libstddjb/ipc_bind_reuse_lock.c b/src/libstddjb/ipc_bind_reuse_lock.c index aede744..b1bccfd 100644 --- a/src/libstddjb/ipc_bind_reuse_lock.c +++ b/src/libstddjb/ipc_bind_reuse_lock.c @@ -4,6 +4,7 @@ #include <string.h> #include <unistd.h> +#include <errno.h> #include <sys/socket.h> #include <skalibs/djbunix.h> @@ -14,12 +15,15 @@ int ipc_bind_reuse_lock (int s, char const *p, int *fdlock) unsigned int opt = 1 ; size_t len = strlen(p) ; int fd ; + int r ; char lockname[len + 6] ; memcpy(lockname, p, len) ; memcpy(lockname + len, ".lock", 6) ; fd = openc_create(lockname) ; if (fd < 0) return -1 ; - if (lock_exnb(fd) < 0) return -1 ; + r = fd_lock(fd, 1, 1) ; + if (r < 0) return -1 ; + if (!r) return (errno = EBUSY, -1) ; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt) ; unlink(p) ; if (ipc_bind(s, p) < 0) return -1 ; diff --git a/src/libstddjb/lock_ex.c b/src/libstddjb/lock_ex.c deleted file mode 100644 index 2645fab..0000000 --- a/src/libstddjb/lock_ex.c +++ /dev/null @@ -1,34 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASFLOCK - -#include <skalibs/nonposix.h> -#include <errno.h> -#include <sys/file.h> -#include <skalibs/djbunix.h> - -int lock_ex (int fd) -{ - int r ; - do r = flock(fd, LOCK_EX) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#else - -#include <unistd.h> -#include <errno.h> -#include <skalibs/djbunix.h> - -int lock_ex (int fd) -{ - int r ; - do r = lockf(fd, F_LOCK, 0) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#endif diff --git a/src/libstddjb/lock_exnb.c b/src/libstddjb/lock_exnb.c deleted file mode 100644 index 7d5302f..0000000 --- a/src/libstddjb/lock_exnb.c +++ /dev/null @@ -1,35 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASFLOCK - -#include <skalibs/nonposix.h> -#include <errno.h> -#include <sys/file.h> -#include <skalibs/djbunix.h> - -int lock_exnb (int fd) -{ - int r ; - do r = flock(fd, LOCK_EX | LOCK_NB) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#else - -#include <unistd.h> -#include <errno.h> -#include <skalibs/djbunix.h> - -int lock_exnb (int fd) -{ - int r ; - do r = lockf(fd, F_TLOCK, 0) ; - while ((r == -1) && (errno == EINTR)) ; - if ((r == -1) && (errno == EACCES)) errno = EAGAIN ; - return r ; -} - -#endif diff --git a/src/libstddjb/lock_sh.c b/src/libstddjb/lock_sh.c deleted file mode 100644 index c942d0d..0000000 --- a/src/libstddjb/lock_sh.c +++ /dev/null @@ -1,34 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASFLOCK - -#include <skalibs/nonposix.h> -#include <errno.h> -#include <sys/file.h> -#include <skalibs/djbunix.h> - -int lock_sh (int fd) -{ - int r ; - do r = flock(fd, LOCK_SH) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#else - -#include <unistd.h> -#include <errno.h> -#include <skalibs/djbunix.h> - -int lock_sh (int fd) -{ - int r ; - do r = lockf(fd, F_LOCK, 0) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#endif diff --git a/src/libstddjb/lock_shnb.c b/src/libstddjb/lock_shnb.c deleted file mode 100644 index 40c988d..0000000 --- a/src/libstddjb/lock_shnb.c +++ /dev/null @@ -1,35 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASFLOCK - -#include <skalibs/nonposix.h> -#include <errno.h> -#include <sys/file.h> -#include <skalibs/djbunix.h> - -int lock_shnb (int fd) -{ - int r ; - do r = flock(fd, LOCK_SH | LOCK_NB) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#else - -#include <unistd.h> -#include <errno.h> -#include <skalibs/djbunix.h> - -int lock_shnb (int fd) -{ - int r ; - do r = lockf(fd, F_TLOCK, 0) ; - while ((r == -1) && (errno == EINTR)) ; - if ((r == -1) && (errno == EACCES)) errno = EAGAIN ; - return r ; -} - -#endif diff --git a/src/libstddjb/lock_un.c b/src/libstddjb/lock_un.c deleted file mode 100644 index a029a7c..0000000 --- a/src/libstddjb/lock_un.c +++ /dev/null @@ -1,34 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASFLOCK - -#include <skalibs/nonposix.h> -#include <errno.h> -#include <sys/file.h> -#include <skalibs/djbunix.h> - -int lock_un (int fd) -{ - int r ; - do r = flock(fd, LOCK_UN) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#else - -#include <unistd.h> -#include <errno.h> -#include <skalibs/djbunix.h> - -int lock_un (int fd) -{ - int r ; - do r = lockf(fd, F_ULOCK, 0) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#endif diff --git a/src/libstddjb/lock_unx.c b/src/libstddjb/lock_unx.c deleted file mode 100644 index d2f8483..0000000 --- a/src/libstddjb/lock_unx.c +++ /dev/null @@ -1,11 +0,0 @@ -/* ISC license. */ - -#include <errno.h> -#include <skalibs/djbunix.h> - -void lock_unx (int fd) -{ - int e = errno ; - lock_un(fd) ; - errno = e ; -} |