i3
|
00001 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ 00002 00003 #ifndef foosddaemonhfoo 00004 #define foosddaemonhfoo 00005 00006 /*** 00007 Copyright 2010 Lennart Poettering 00008 00009 Permission is hereby granted, free of charge, to any person 00010 obtaining a copy of this software and associated documentation files 00011 (the "Software"), to deal in the Software without restriction, 00012 including without limitation the rights to use, copy, modify, merge, 00013 publish, distribute, sublicense, and/or sell copies of the Software, 00014 and to permit persons to whom the Software is furnished to do so, 00015 subject to the following conditions: 00016 00017 The above copyright notice and this permission notice shall be 00018 included in all copies or substantial portions of the Software. 00019 00020 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 00021 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00022 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00023 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 00024 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 00025 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 00026 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 00027 SOFTWARE. 00028 ***/ 00029 00030 #include <sys/types.h> 00031 #include <inttypes.h> 00032 00033 #ifdef __cplusplus 00034 extern "C" { 00035 #endif 00036 00037 /* 00038 Reference implementation of a few systemd related interfaces for 00039 writing daemons. These interfaces are trivial to implement. To 00040 simplify porting we provide this reference implementation. 00041 Applications are welcome to reimplement the algorithms described 00042 here if they do not want to include these two source files. 00043 00044 The following functionality is provided: 00045 00046 - Support for logging with log levels on stderr 00047 - File descriptor passing for socket-based activation 00048 - Daemon startup and status notification 00049 - Detection of systemd boots 00050 00051 You may compile this with -DDISABLE_SYSTEMD to disable systemd 00052 support. This makes all those calls NOPs that are directly related to 00053 systemd (i.e. only sd_is_xxx() will stay useful). 00054 00055 Since this is drop-in code we don't want any of our symbols to be 00056 exported in any case. Hence we declare hidden visibility for all of 00057 them. 00058 00059 You may find an up-to-date version of these source files online: 00060 00061 http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.h 00062 http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.c 00063 00064 This should compile on non-Linux systems, too, but with the 00065 exception of the sd_is_xxx() calls all functions will become NOPs. 00066 00067 See sd-daemon(7) for more information. 00068 */ 00069 00070 #ifndef _sd_printf_attr_ 00071 #if __GNUC__ >= 4 00072 #define _sd_printf_attr_(a,b) __attribute__ ((format (printf, a, b))) 00073 #else 00074 #define _sd_printf_attr_(a,b) 00075 #endif 00076 #endif 00077 00078 #ifndef _sd_hidden_ 00079 #if (__GNUC__ >= 4) && !defined(SD_EXPORT_SYMBOLS) 00080 #define _sd_hidden_ __attribute__ ((visibility("hidden"))) 00081 #else 00082 #define _sd_hidden_ 00083 #endif 00084 #endif 00085 00086 /* 00087 Log levels for usage on stderr: 00088 00089 fprintf(stderr, SD_NOTICE "Hello World!\n"); 00090 00091 This is similar to printk() usage in the kernel. 00092 */ 00093 #define SD_EMERG "<0>" /* system is unusable */ 00094 #define SD_ALERT "<1>" /* action must be taken immediately */ 00095 #define SD_CRIT "<2>" /* critical conditions */ 00096 #define SD_ERR "<3>" /* error conditions */ 00097 #define SD_WARNING "<4>" /* warning conditions */ 00098 #define SD_NOTICE "<5>" /* normal but significant condition */ 00099 #define SD_INFO "<6>" /* informational */ 00100 #define SD_DEBUG "<7>" /* debug-level messages */ 00101 00102 /* The first passed file descriptor is fd 3 */ 00103 #define SD_LISTEN_FDS_START 3 00104 00105 /* 00106 Returns how many file descriptors have been passed, or a negative 00107 errno code on failure. Optionally, removes the $LISTEN_FDS and 00108 $LISTEN_PID file descriptors from the environment (recommended, but 00109 problematic in threaded environments). If r is the return value of 00110 this function you'll find the file descriptors passed as fds 00111 SD_LISTEN_FDS_START to SD_LISTEN_FDS_START+r-1. Returns a negative 00112 errno style error code on failure. This function call ensures that 00113 the FD_CLOEXEC flag is set for the passed file descriptors, to make 00114 sure they are not passed on to child processes. If FD_CLOEXEC shall 00115 not be set, the caller needs to unset it after this call for all file 00116 descriptors that are used. 00117 00118 See sd_listen_fds(3) for more information. 00119 */ 00120 int sd_listen_fds(int unset_environment) _sd_hidden_; 00121 00122 /* 00123 Helper call for identifying a passed file descriptor. Returns 1 if 00124 the file descriptor is a FIFO in the file system stored under the 00125 specified path, 0 otherwise. If path is NULL a path name check will 00126 not be done and the call only verifies if the file descriptor 00127 refers to a FIFO. Returns a negative errno style error code on 00128 failure. 00129 00130 See sd_is_fifo(3) for more information. 00131 */ 00132 int sd_is_fifo(int fd, const char *path) _sd_hidden_; 00133 00134 /* 00135 Helper call for identifying a passed file descriptor. Returns 1 if 00136 the file descriptor is a socket of the specified family (AF_INET, 00137 ...) and type (SOCK_DGRAM, SOCK_STREAM, ...), 0 otherwise. If 00138 family is 0 a socket family check will not be done. If type is 0 a 00139 socket type check will not be done and the call only verifies if 00140 the file descriptor refers to a socket. If listening is > 0 it is 00141 verified that the socket is in listening mode. (i.e. listen() has 00142 been called) If listening is == 0 it is verified that the socket is 00143 not in listening mode. If listening is < 0 no listening mode check 00144 is done. Returns a negative errno style error code on failure. 00145 00146 See sd_is_socket(3) for more information. 00147 */ 00148 int sd_is_socket(int fd, int family, int type, int listening) _sd_hidden_; 00149 00150 /* 00151 Helper call for identifying a passed file descriptor. Returns 1 if 00152 the file descriptor is an Internet socket, of the specified family 00153 (either AF_INET or AF_INET6) and the specified type (SOCK_DGRAM, 00154 SOCK_STREAM, ...), 0 otherwise. If version is 0 a protocol version 00155 check is not done. If type is 0 a socket type check will not be 00156 done. If port is 0 a socket port check will not be done. The 00157 listening flag is used the same way as in sd_is_socket(). Returns a 00158 negative errno style error code on failure. 00159 00160 See sd_is_socket_inet(3) for more information. 00161 */ 00162 int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) _sd_hidden_; 00163 00164 /* 00165 Helper call for identifying a passed file descriptor. Returns 1 if 00166 the file descriptor is an AF_UNIX socket of the specified type 00167 (SOCK_DGRAM, SOCK_STREAM, ...) and path, 0 otherwise. If type is 0 00168 a socket type check will not be done. If path is NULL a socket path 00169 check will not be done. For normal AF_UNIX sockets set length to 00170 0. For abstract namespace sockets set length to the length of the 00171 socket name (including the initial 0 byte), and pass the full 00172 socket path in path (including the initial 0 byte). The listening 00173 flag is used the same way as in sd_is_socket(). Returns a negative 00174 errno style error code on failure. 00175 00176 See sd_is_socket_unix(3) for more information. 00177 */ 00178 int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) _sd_hidden_; 00179 00180 /* 00181 Informs systemd about changed daemon state. This takes a number of 00182 newline separated environment-style variable assignments in a 00183 string. The following variables are known: 00184 00185 READY=1 Tells systemd that daemon startup is finished (only 00186 relevant for services of Type=notify). The passed 00187 argument is a boolean "1" or "0". Since there is 00188 little value in signaling non-readiness the only 00189 value daemons should send is "READY=1". 00190 00191 STATUS=... Passes a single-line status string back to systemd 00192 that describes the daemon state. This is free-from 00193 and can be used for various purposes: general state 00194 feedback, fsck-like programs could pass completion 00195 percentages and failing programs could pass a human 00196 readable error message. Example: "STATUS=Completed 00197 66% of file system check..." 00198 00199 ERRNO=... If a daemon fails, the errno-style error code, 00200 formatted as string. Example: "ERRNO=2" for ENOENT. 00201 00202 BUSERROR=... If a daemon fails, the D-Bus error-style error 00203 code. Example: "BUSERROR=org.freedesktop.DBus.Error.TimedOut" 00204 00205 MAINPID=... The main pid of a daemon, in case systemd did not 00206 fork off the process itself. Example: "MAINPID=4711" 00207 00208 Daemons can choose to send additional variables. However, it is 00209 recommended to prefix variable names not listed above with X_. 00210 00211 Returns a negative errno-style error code on failure. Returns > 0 00212 if systemd could be notified, 0 if it couldn't possibly because 00213 systemd is not running. 00214 00215 Example: When a daemon finished starting up, it could issue this 00216 call to notify systemd about it: 00217 00218 sd_notify(0, "READY=1"); 00219 00220 See sd_notifyf() for more complete examples. 00221 00222 See sd_notify(3) for more information. 00223 */ 00224 int sd_notify(int unset_environment, const char *state) _sd_hidden_; 00225 00226 /* 00227 Similar to sd_notify() but takes a format string. 00228 00229 Example 1: A daemon could send the following after initialization: 00230 00231 sd_notifyf(0, "READY=1\n" 00232 "STATUS=Processing requests...\n" 00233 "MAINPID=%lu", 00234 (unsigned long) getpid()); 00235 00236 Example 2: A daemon could send the following shortly before 00237 exiting, on failure: 00238 00239 sd_notifyf(0, "STATUS=Failed to start up: %s\n" 00240 "ERRNO=%i", 00241 strerror(errno), 00242 errno); 00243 00244 See sd_notifyf(3) for more information. 00245 */ 00246 int sd_notifyf(int unset_environment, const char *format, ...) _sd_printf_attr_(2,3) _sd_hidden_; 00247 00248 /* 00249 Returns > 0 if the system was booted with systemd. Returns < 0 on 00250 error. Returns 0 if the system was not booted with systemd. Note 00251 that all of the functions above handle non-systemd boots just 00252 fine. You should NOT protect them with a call to this function. Also 00253 note that this function checks whether the system, not the user 00254 session is controlled by systemd. However the functions above work 00255 for both user and system services. 00256 00257 See sd_booted(3) for more information. 00258 */ 00259 int sd_booted(void) _sd_hidden_; 00260 00261 #ifdef __cplusplus 00262 } 00263 #endif 00264 00265 #endif