]> sourceware.org Git - lvm2.git/blame - daemons/common/daemon-server.h
Improve format_buffer in daemon-shared.c, adding block formatting in addition
[lvm2.git] / daemons / common / daemon-server.h
CommitLineData
56517bad
PR
1/*
2 * Copyright (C) 2011 Red Hat, Inc. All rights reserved.
3 *
4 * This file is part of LVM2.
5 *
6 * This copyrighted material is made available to anyone wishing to use,
7 * modify, copy, or redistribute it subject to the terms and conditions
8 * of the GNU Lesser General Public License v.2.1.
9 *
10 * You should have received a copy of the GNU Lesser General Public License
11 * along with this program; if not, write to the Free Software Foundation,
12 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
13 */
14
dc85d3fb 15#include "daemon-client.h"
92658f56 16#include "config.h" // XXX will be in libdevmapper.h later
dc85d3fb
PR
17
18#ifndef _LVM_DAEMON_COMMON_SERVER_H
19#define _LVM_DAEMON_COMMON_SERVER_H
56517bad
PR
20
21typedef struct {
22 int socket_fd; /* the fd we use to talk to the client */
23 pthread_t thread_id;
24 char *read_buf;
25 void *private; /* this holds per-client state */
26} client_handle;
27
28typedef struct {
55e30071 29 struct config_tree *cft;
92658f56 30 char *buffer;
dc85d3fb
PR
31} request;
32
33typedef struct {
34 int error;
55e30071 35 struct config_tree *cft;
92658f56 36 char *buffer;
dc85d3fb
PR
37} response;
38
39struct daemon_state;
40
aaca7f11
PR
41/*
42 * Craft a simple reply, without the need to construct a config_tree. See
43 * daemon_send_simple in daemon-client.h for the description of the parameters.
44 */
45response daemon_reply_simple(char *id, ...);
46
94bb67ab
PR
47static inline int daemon_request_int(request r, const char *path, int def) {
48 return find_config_int(r.cft->root, path, def);
49}
50
51static inline const char *daemon_request_str(request r, const char *path, const char *def) {
52 return find_config_str(r.cft->root, path, def);
53}
54
dc85d3fb
PR
55/*
56 * The callback. Called once per request issued, in the respective client's
57 * thread. It is presented by a parsed request (in the form of a config tree).
58 * The output is a new config tree that is serialised and sent back to the
59 * client. The client blocks until the request processing is done and reply is
60 * sent.
61 */
62typedef response (*handle_request)(struct daemon_state s, client_handle h, request r);
63
64typedef struct daemon_state {
d7448a72
PR
65 /*
66 * The maximal stack size for individual daemon threads. This is
67 * essential for daemons that need to be locked into memory, since
68 * pthread's default is 10M per thread.
69 */
70 int thread_stack_size;
71
72 /* Flags & attributes affecting the behaviour of the daemon. */
73 unsigned avoid_oom:1;
74 unsigned foreground:1;
75 const char *name;
76 const char *pidfile;
73ffd6e7 77 const char *socket_path;
dc85d3fb
PR
78 int log_level;
79 handle_request handler;
80 int (*setup_post)(struct daemon_state *st);
73ffd6e7
PR
81
82 /* Global runtime info maintained by the framework. */
83 int socket_fd;
d7448a72 84
56517bad
PR
85 void *private; /* the global daemon state */
86} daemon_state;
87
56517bad
PR
88/*
89 * Start serving the requests. This does all the daemonisation, socket setup
d7448a72
PR
90 * work and so on. This function takes over the process, and upon failure, it
91 * will terminate execution. It may be called at most once.
56517bad 92 */
dc85d3fb 93void daemon_start(daemon_state s);
56517bad
PR
94
95/*
96 * Take over from an already running daemon. This function handles connecting
97 * to the running daemon and telling it we are going to take over. The takeover
98 * request may be customised by passing in a non-NULL request.
99 *
100 * The takeover sequence: the old daemon stops accepting new clients, then it
101 * waits until all current client connections are closed. When that happens, it
102 * serializes its current state and sends that as a reply, which is then
103 * returned by this function (therefore, this function won't return until the
104 * previous instance has shut down).
105 *
106 * The daemon, after calling daemon_takeover is expected to set up its
107 * daemon_state using the reply from this function and call daemon_start as
108 * usual.
109 */
110daemon_reply daemon_takeover(daemon_info i, daemon_request r);
111
112/* Call this to request a clean shutdown of the daemon. Async safe. */
113void daemon_stop();
114
115#endif
This page took 0.032949 seconds and 5 git commands to generate.