2 * Copyright (c) 2014 The DragonFly Project. All rights reserved.
4 * This code is derived from software contributed to The DragonFly Project
5 * by Matthew Dillon <dillon@backplane.com>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * 3. Neither the name of The DragonFly Project nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific, prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 #include <sys/types.h>
36 #include <sys/param.h>
37 #include <sys/procctl.h>
40 #include <sys/socket.h>
43 #include <sys/ttycom.h>
44 #include <sys/devfs.h>
45 #include <sys/mount.h>
63 typedef struct SvcCommand
{
76 int empty_label
: 1; /* label not specified (vs 'all') */
77 int commanded
: 1; /* command by system operator */
78 int force_remove_files
: 1;
79 FILE *fp
; /* nominal output */
98 gid_t groups
[NGROUPS
];
101 pthread_cond_t logcond
; /* wait for activity */
102 char logbuf
[8192]; /* must be power of 2 >= 2048 */
105 int logfds
[2]; /* logfile pipe descriptors */
106 int logfd
; /* logfile file descriptor */
110 RS_STOPPED
, /* service died or stopped */
111 RS_STARTED
, /* service running */
112 RS_STOPPING1
, /* fresh pid to stop */
113 RS_STOPPING2
, /* TERM sent */
114 RS_STOPPING3
, /* KILL sent */
117 #define LOGCHUNK 1024
119 extern pthread_mutex_t serial_mtx
;
121 int process_cmd(command_t
*cmd
, FILE *fp
, int ac
, char **av
);
122 int execute_cmd(command_t
*cmd
);
123 void free_cmd(command_t
*cmd
);
125 void sfree(char **strp
);
126 void sreplace(char **strp
, const char *orig
);
127 void sdup(char **strp
);
128 void afree(char ***aryp
);
129 void adup(char ***aryp
);
130 int setup_pid_and_socket(command_t
*cmd
, int *lfdp
, int *pfdp
);
131 void remove_pid_and_socket(command_t
*cmd
, const char *label
);
133 void remote_execute(command_t
*cmd
, const char *label
);
134 void remote_listener(command_t
*cmd
, int lfd
);
135 int remote_wait(void);
137 int execute_init(command_t
*cmd
);
138 int execute_start(command_t
*cmd
);
139 int execute_stop(command_t
*cmd
);
140 int execute_restart(command_t
*cmd
);
141 int execute_exit(command_t
*cmd
);
142 int execute_list(command_t
*cmd
);
143 int execute_status(command_t
*cmd
);
144 int execute_log(command_t
*cmd
);
145 int execute_logfile(command_t
*cmd
);
146 int execute_help(command_t
*cmd
);