]> git.sur5r.net Git - openldap/blob - servers/slapd/lock.c
SLAPD compiles. Needs LDBM work to link.
[openldap] / servers / slapd / lock.c
1 /* lock.c - routines to open and apply an advisory lock to a file */
2
3 #include "portable.h"
4
5 #include <stdio.h>
6
7 #include <ac/socket.h>
8 #include <ac/time.h>
9 #include <ac/unistd.h>
10
11 #include <sys/file.h>
12 #include <sys/param.h>
13 #include "slap.h"
14
15 FILE *
16 lock_fopen( char *fname, char *type, FILE **lfp )
17 {
18         FILE    *fp;
19         char    buf[MAXPATHLEN];
20
21         /* open the lock file */
22         strcpy( buf, fname );
23         strcat( buf, ".lock" );
24         if ( (*lfp = fopen( buf, "w" )) == NULL ) {
25                 Debug( LDAP_DEBUG_ANY, "could not open \"%s\"\n", buf, 0, 0 );
26                 return( NULL );
27         }
28
29         /* acquire the lock */
30 #ifdef USE_LOCKF
31         while ( lockf( fileno( *lfp ), F_LOCK, 0 ) != 0 ) {
32 #else
33         while ( flock( fileno( *lfp ), LOCK_EX ) != 0 ) {
34 #endif
35                 ;       /* NULL */
36         }
37
38         /* open the log file */
39         if ( (fp = fopen( fname, type )) == NULL ) {
40                 Debug( LDAP_DEBUG_ANY, "could not open \"%s\"\n", fname, 0, 0 );
41 #ifdef USE_LOCKF
42                 lockf( fileno( *lfp ), F_ULOCK, 0 );
43 #else
44                 flock( fileno( *lfp ), LOCK_UN );
45 #endif
46                 return( NULL );
47         }
48
49         return( fp );
50 }
51
52 int
53 lock_fclose( FILE *fp, FILE *lfp )
54 {
55         /* unlock */
56 #ifdef USE_LOCKF
57         lockf( fileno( lfp ), F_ULOCK, 0 );
58 #else
59         flock( fileno( lfp ), LOCK_UN );
60 #endif
61         fclose( lfp );
62
63         return( fclose( fp ) );
64 }