]> git.sur5r.net Git - openldap/blob - servers/slurpd/main.c
632372f2e2ea94c4d415919c10a0dec2879c0f5d
[openldap] / servers / slurpd / main.c
1 /*
2  * Copyright (c) 1996 Regents of the University of Michigan.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that this notice is preserved and that due credit is given
7  * to the University of Michigan at Ann Arbor. The name of the University
8  * may not be used to endorse or promote products derived from this
9  * software without specific prior written permission. This software
10  * is provided ``as is'' without express or implied warranty.
11  */
12
13
14 /* 
15  * main.c - main routine for slurpd.
16  */
17
18 #include "portable.h"
19
20 #include <stdio.h>
21
22 #include "slurp.h"
23 #include "globals.h"
24 #include "lutil.h"
25
26
27 extern int              doargs( int, char **, Globals * );
28 extern void             fm();
29 extern int              start_replica_thread( Ri * );
30 extern Globals          *init_globals();
31 extern int              sanity();
32
33 #if defined( HAVE_LWP )
34 extern void             start_lwp_scheduler();
35 #endif /* HAVE_LWP */
36
37 int
38 main(
39     int         argc,
40     char        **argv
41 )
42 {
43 #ifdef NO_THREADS
44     /* Haven't yet written the non-threaded version */
45     fputs( "slurpd currently requires threads support\n", stderr );
46     return( 1 );
47 #else
48
49     pthread_attr_t      attr;
50     int                 status;
51     int                 i;
52
53     /* 
54      * Create and initialize globals.  init_globals() also initializes
55      * the main replication queue.
56      */
57     if (( sglob = init_globals()) == NULL ) {
58         fprintf( stderr, "Out of memory initializing globals\n" );
59         exit( 1 );
60     }
61
62     /*
63      * Process command-line args and fill in globals.
64      */
65     if ( doargs( argc, argv, sglob ) < 0 ) {
66         exit( 1 );
67     }
68
69     /*
70      * Read slapd config file and initialize Re (per-replica) structs.
71      */
72     if ( slurpd_read_config( sglob->slapd_configfile ) < 0 ) {
73         fprintf( stderr,
74                 "Errors encountered while processing config file \"%s\"\n",
75                 sglob->slapd_configfile );
76         exit( 1 );
77     }
78
79     /*
80      * Get any saved state information off the disk.
81      */
82     if ( sglob->st->st_read( sglob->st )) {
83         fprintf( stderr, "Malformed slurpd status file \"%s\"\n",
84                 sglob->slurpd_status_file, 0, 0 );
85         exit( 1 );
86     }
87
88     /*
89      * All readonly data should now be initialized. 
90      * Check for any fatal error conditions before we get started
91      */
92      if ( sanity() < 0 ) {
93         exit( 1 );
94     }
95
96     /*
97      * Detach from the controlling terminal, if debug level = 0,
98      * and if not in one-shot mode.
99      */
100 #ifdef LDAP_DEBUG
101     if (( ldap_debug == 0 )  && !sglob->one_shot_mode )
102 #else /* LDAP_DEBUG */
103     if ( !sglob->one_shot_mode )
104 #endif /* LDAP_DEBUG */
105         lutil_detach( 0, 0 );
106
107 #if defined( HAVE_LWP )
108     /*
109      * Need to start a scheduler thread under SunOS 4
110      */
111     start_lwp_scheduler();
112 #endif /* HAVE_LWP */
113
114
115     /*
116      * Start threads - one thread for each replica
117      */
118     for ( i = 0; sglob->replicas[ i ] != NULL; i++ ) {
119         start_replica_thread( sglob->replicas[ i ]);
120     }
121
122     /*
123      * Start the main file manager thread (in fm.c).
124      */
125     pthread_attr_init( &attr );
126
127 #if !defined(HAVE_PTHREADS_D4) && !defined(HAVE_DCE)
128     /* POSIX_THREADS or compatible
129      * This is a draft 10 or standard pthreads implementation
130      */
131     if ( pthread_create( &(sglob->fm_tid), &attr, fm, (void *) NULL )
132             != 0 ) {
133         Debug( LDAP_DEBUG_ANY, "file manager pthread_create failed\n",
134                 0, 0, 0 );
135         exit( 1 );
136
137     }
138 #else /* !PTHREADS_FINAL */
139     /*
140      * This is a draft 4 or earlier pthreads implementation
141      */
142     if ( pthread_create( &(sglob->fm_tid), attr, fm, (void *) NULL )
143             != 0 ) {
144         Debug( LDAP_DEBUG_ANY, "file manager pthread_create failed\n",
145                 0, 0, 0 );
146         exit( 1 );
147
148     }
149 #endif /* !PTHREADS_FINAL */
150
151     pthread_attr_destroy( &attr );
152
153     /*
154      * Wait for the fm thread to finish.
155      */
156 #ifdef HAVE_PTHREADS_FINAL
157     pthread_join( sglob->fm_tid, (void *) NULL );
158 #else
159     pthread_join( sglob->fm_tid, (void *) &status );
160 #endif
161     /*
162      * Wait for the replica threads to finish.
163      */
164     for ( i = 0; sglob->replicas[ i ] != NULL; i++ ) {
165 #ifdef HAVE_PTHREADS_FINAL
166         pthread_join( sglob->replicas[ i ]->ri_tid, (void *) NULL );
167 #else
168         pthread_join( sglob->replicas[ i ]->ri_tid, (void *) &status );
169 #endif
170     }
171     Debug( LDAP_DEBUG_ANY, "slurpd: terminating normally\n", 0, 0, 0 );
172     sglob->slurpd_shutdown = 1;
173     pthread_exit( 0 );
174
175 #endif /* !NO_THREADS */
176 }