~ubuntu-branches/ubuntu/trusty/keepalived/trusty

« back to all changes in this revision

Viewing changes to keepalived/vrrp/vrrp_daemon.c

  • Committer: Bazaar Package Importer
  • Author(s): Didier Roche
  • Date: 2009-05-12 20:26:15 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20090512202615-k850bw35qpuvpq4p
Tags: 1.1.17-1ubuntu1
* Merge from debian unstable, remaining changes:
  - debian/rules: DEB_UPDATE_RCD_PARAMS := expicit init start/stop
    parameters (don't stop at 0 and 6)
  - debian/init.d: init script header adapted to stop rule
  - debian/keepalived.postinst: Remove shutdown and reboot links

Show diffs side-by-side

added added

removed removed

Lines of Context:
5
5
 *
6
6
 * Part:        VRRP child process handling.
7
7
 *
8
 
 * Version:     $Id: vrrp_daemon.c,v 1.1.15 2007/09/15 04:07:41 acassen Exp $
 
8
 * Version:     $Id: vrrp_daemon.c,v 1.1.17 2009/03/05 01:31:12 acassen Exp $
9
9
 *
10
10
 * Author:      Alexandre Cassen, <acassen@linux-vs.org>
11
11
 *
19
19
 *              as published by the Free Software Foundation; either version
20
20
 *              2 of the License, or (at your option) any later version.
21
21
 *
22
 
 * Copyright (C) 2001-2007 Alexandre Cassen, <acassen@freebox.fr>
 
22
 * Copyright (C) 2001-2009 Alexandre Cassen, <acassen@freebox.fr>
23
23
 */
24
24
 
25
25
#include "vrrp_daemon.h"
35
35
#include "global_data.h"
36
36
#include "pidfile.h"
37
37
#include "daemon.h"
 
38
#include "logger.h"
38
39
#include "signals.h"
39
40
#ifdef _WITH_LVS_
40
41
  #include "ipvswrapper.h"
44
45
#include "memory.h"
45
46
#include "parser.h"
46
47
 
 
48
extern char *vrrp_pidfile;
 
49
 
47
50
/* Daemon stop sequence */
48
51
static void
49
52
stop_vrrp(void)
50
53
{
51
54
        /* Destroy master thread */
 
55
        signal_handler_destroy();
52
56
        thread_destroy_master(master);
53
57
 
54
58
        /* Clear static entries */
61
65
        gratuitous_arp_close();
62
66
 
63
67
        /* Stop daemon */
64
 
        pidfile_rm(VRRP_PID_FILE);
 
68
        pidfile_rm(vrrp_pidfile);
65
69
 
66
70
        /* Clean data */
67
71
        free_global_data(data);
112
116
                clear_diff_saddresses();
113
117
                clear_diff_sroutes();
114
118
                clear_diff_vrrp();
 
119
                clear_diff_script();
115
120
        }
116
121
 
117
122
        /* Complete VRRP initialization */
121
126
        }
122
127
 
123
128
        /* Post initializations */
124
 
        syslog(LOG_INFO, "Configuration is using : %lu Bytes", mem_allocated);
 
129
        log_message(LOG_INFO, "Configuration is using : %lu Bytes", mem_allocated);
125
130
 
126
131
        /* Set static entries */
127
132
        netlink_iplist_ipv4(vrrp_data->static_addresses, IPADDRESS_ADD);
175
180
 
176
181
/* Reload handler */
177
182
void
178
 
sighup_vrrp(int sig)
 
183
sighup_vrrp(void *v, int sig)
179
184
{
180
 
        syslog(LOG_INFO, "Reloading VRRP child process(%d) on signal",
 
185
        log_message(LOG_INFO, "Reloading VRRP child process(%d) on signal",
181
186
               vrrp_child);
182
187
        thread_add_event(master, reload_vrrp_thread, NULL, 0);
183
188
}
184
189
 
185
190
/* Terminate handler */
186
191
void
187
 
sigend_vrrp(int sig)
 
192
sigend_vrrp(void *v, int sig)
188
193
{
189
 
        syslog(LOG_INFO, "Terminating VRRP child process on signal");
 
194
        log_message(LOG_INFO, "Terminating VRRP child process on signal");
190
195
        if (master)
191
196
                thread_add_terminate_event(master);
192
197
}
196
201
vrrp_signal_init(void)
197
202
{
198
203
        signal_handler_init();
199
 
        signal_set(SIGHUP, sighup_vrrp);
200
 
        signal_set(SIGINT, sigend_vrrp);
201
 
        signal_set(SIGTERM, sigend_vrrp);
 
204
        signal_set(SIGHUP, sighup_vrrp, NULL);
 
205
        signal_set(SIGINT, sigend_vrrp, NULL);
 
206
        signal_set(SIGTERM, sigend_vrrp, NULL);
202
207
        signal_ignore(SIGPIPE);
203
 
        signal_noignore_sigchld();
204
208
}
205
209
 
206
210
/* VRRP Child respawning thread */
220
224
        }
221
225
 
222
226
        /* We catch a SIGCHLD, handle it */
223
 
        syslog(LOG_INFO, "VRRP child process(%d) died: Respawning", pid);
 
227
        log_message(LOG_INFO, "VRRP child process(%d) died: Respawning", pid);
224
228
        start_vrrp_child();
225
229
        return 0;
226
230
}
235
239
 
236
240
        /* Dont start if pid is already running */
237
241
        if (vrrp_running()) {
238
 
                syslog(LOG_INFO, "VRRP child process already running");
 
242
                log_message(LOG_INFO, "VRRP child process already running");
239
243
                return -1;
240
244
        }
241
245
 
244
248
        pid = fork();
245
249
 
246
250
        if (pid < 0) {
247
 
                syslog(LOG_INFO, "VRRP child process: fork error(%s)"
 
251
                log_message(LOG_INFO, "VRRP child process: fork error(%s)"
248
252
                               , strerror(errno));
249
253
                return -1;
250
254
        } else if (pid) {
251
255
                vrrp_child = pid;
252
 
                syslog(LOG_INFO, "Starting VRRP child process, pid=%d"
 
256
                log_message(LOG_INFO, "Starting VRRP child process, pid=%d"
253
257
                               , pid);
254
258
 
255
259
                /* Start respawning thread */
263
267
                (log_facility==LOG_DAEMON) ? LOG_LOCAL1 : log_facility);
264
268
 
265
269
        /* Child process part, write pidfile */
266
 
        if (!pidfile_write(VRRP_PID_FILE, getpid())) {
 
270
        if (!pidfile_write(vrrp_pidfile, getpid())) {
267
271
                /* Fatal error */
268
 
                syslog(LOG_INFO, "VRRP child process: cannot write pidfile");
 
272
                log_message(LOG_INFO, "VRRP child process: cannot write pidfile");
269
273
                exit(0);
270
274
        }
271
275
 
272
276
        /* Create the new master thread */
 
277
        signal_handler_destroy();
273
278
        thread_destroy_master(master);
274
279
        master = thread_make_master();
275
280