diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/krb5/ccache/file/ChangeLog | 7 | ||||
-rw-r--r-- | src/lib/krb5/ccache/file/configure.in | 1 | ||||
-rw-r--r-- | src/lib/krb5/ccache/file/fcc_maybe.c | 109 |
3 files changed, 95 insertions, 22 deletions
diff --git a/src/lib/krb5/ccache/file/ChangeLog b/src/lib/krb5/ccache/file/ChangeLog index f092634c9..4fa03c711 100644 --- a/src/lib/krb5/ccache/file/ChangeLog +++ b/src/lib/krb5/ccache/file/ChangeLog @@ -1,3 +1,10 @@ +Tue Feb 21 16:14:25 1995 Mark Eichin (eichin@cygnus.com) + + * configure.in: check for HAVE_FLOCK, since we may need to use + both flock and fcntl. + * fcc_maybe.c: try fcntl lock, if we get EINVAL specifically, fall + back to flock (if we have it.) + Fri Jan 27 00:49:36 1995 Chris Provenzano (proven@mit.edu) * Fix fcc_read.c (krb5_fcc_read_authdatum()) krb5_authdatatype diff --git a/src/lib/krb5/ccache/file/configure.in b/src/lib/krb5/ccache/file/configure.in index 20561dac0..a0d75eaaf 100644 --- a/src/lib/krb5/ccache/file/configure.in +++ b/src/lib/krb5/ccache/file/configure.in @@ -4,6 +4,7 @@ AC_SET_BUILDTOP CONFIG_RULES ISODE_DEFS AC_HAVE_HEADERS(unistd.h) +AC_FUNC_CHECK(flock,AC_DEFINE(HAVE_FLOCK)) SubdirLibraryRule([${OBJS}]) KRB_INCLUDE V5_AC_OUTPUT_MAKEFILE diff --git a/src/lib/krb5/ccache/file/fcc_maybe.c b/src/lib/krb5/ccache/file/fcc_maybe.c index e72e812cc..9e4314c47 100644 --- a/src/lib/krb5/ccache/file/fcc_maybe.c +++ b/src/lib/krb5/ccache/file/fcc_maybe.c @@ -44,30 +44,26 @@ int krb5_fcc_default_format = KRB5_FCC_DEFAULT_FVNO; #include <krb5/los-proto.h> #include <stdio.h> +#define LOCK_IT 0 +#define UNLOCK_IT 1 + +/* Under SunOS 4 and SunOS 5 and possibly other operating systems, having + POSIX fcntl locks doesn't mean that they work on every filesystem. If we + get EINVAL, try flock (if we have it) since that might work... */ + #ifdef POSIX_FILE_LOCKS +static krb5_error_code fcc_lock_file_posix PROTOTYPE((krb5_fcc_data *, int, int)); + #ifndef unicos61 #include <fcntl.h> #endif /* unicos61 */ + #define SHARED_LOCK F_RDLCK #define EXCLUSIVE_LOCK F_WRLCK #define UNLOCK_LOCK F_UNLCK -#else /* !POSIX_FILE_LOCKS */ -#ifndef sysvimp -#include <sys/file.h> -#endif /* sysvimp */ -#define SHARED_LOCK LOCK_SH -#define EXCLUSIVE_LOCK LOCK_EX -#define UNLOCK_LOCK LOCK_UN -#endif /* POSIX_FILE_LOCKS */ - -#define LOCK_IT 0 -#define UNLOCK_IT 1 - -static krb5_error_code fcc_lock_file PROTOTYPE((krb5_fcc_data *, - int, int)); static krb5_error_code -fcc_lock_file(data, fd, lockunlock) +fcc_lock_file_posix(data, fd, lockunlock) krb5_fcc_data *data; int fd; int lockunlock; @@ -75,14 +71,10 @@ int lockunlock; /* XXX need to in-line lock_file.c here, but it's sort-of OK since we're already unix-dependent for file descriptors */ -#ifdef POSIX_FILE_LOCKS int lock_cmd = F_SETLKW; struct flock lock_arg; #define lock_flag lock_arg.l_type lock_flag = -1; -#else - int lock_flag = -1; -#endif if (lockunlock == LOCK_IT) switch (data->mode) { @@ -100,7 +92,6 @@ int lockunlock; if (lock_flag == -1) return(KRB5_LIBOS_BADLOCKFLAG); -#ifdef POSIX_FILE_LOCKS lock_arg.l_whence = 0; lock_arg.l_start = 0; lock_arg.l_len = 0; @@ -110,13 +101,87 @@ int lockunlock; return(EAGAIN); return(errno); } -#else + return 0; +} +#undef lock_flag + +#undef SHARED_LOCK +#undef EXCLUSIVE_LOCK +#undef UNLOCK_LOCK + +#endif /* POSIX_FILE_LOCKS */ + +#ifdef HAVE_FLOCK + +#ifndef sysvimp +#include <sys/file.h> +#endif /* sysvimp */ + +#define SHARED_LOCK LOCK_SH +#define EXCLUSIVE_LOCK LOCK_EX +#define UNLOCK_LOCK LOCK_UN + +static krb5_error_code fcc_lock_file_flock PROTOTYPE((krb5_fcc_data *, int, int)); +static krb5_error_code +fcc_lock_file_flock(data, fd, lockunlock) +krb5_fcc_data *data; +int fd; +int lockunlock; +{ + /* XXX need to in-line lock_file.c here, but it's sort-of OK since + we're already unix-dependent for file descriptors */ + + int lock_flag = -1; + + if (lockunlock == LOCK_IT) + switch (data->mode) { + case FCC_OPEN_RDONLY: + lock_flag = SHARED_LOCK; + break; + case FCC_OPEN_RDWR: + case FCC_OPEN_AND_ERASE: + lock_flag = EXCLUSIVE_LOCK; + break; + } + else + lock_flag = UNLOCK_LOCK; + + if (lock_flag == -1) + return(KRB5_LIBOS_BADLOCKFLAG); + if (flock(fd, lock_flag) == -1) return(errno); -#endif return 0; } +#undef SHARED_LOCK +#undef EXCLUSIVE_LOCK +#undef UNLOCK_LOCK + +#endif HAVE_FLOCK + +static krb5_error_code fcc_lock_file PROTOTYPE((krb5_fcc_data *, int, int)); +static krb5_error_code +fcc_lock_file(data, fd, lockunlock) +krb5_fcc_data *data; +int fd; +int lockunlock; +{ + krb5_error_code st; +#ifdef POSIX_FILE_LOCKS + st = fcc_lock_file_posix(data, fd, lockunlock); + if (st != EINVAL) { + return st; + } +#endif /* POSIX_FILE_LOCKS */ + +#ifdef HAVE_FLOCK + return fcc_lock_file_flock(data, fd, lockunlock); +#else + return st; +#endif +} + krb5_error_code krb5_fcc_close_file (context, id) krb5_context context; |