Flesh out Service struct

This commit is contained in:
C. McEnroe 2020-08-14 16:51:32 -04:00
parent 96e962a08c
commit ecc818534c
2 changed files with 44 additions and 2 deletions

View File

@ -19,6 +19,7 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
typedef unsigned char byte;
@ -63,10 +64,29 @@ extern uid_t serviceUID;
extern gid_t serviceGID;
extern char *serviceEnviron[EnvironLen];
enum State {
Stop,
Start,
};
enum { LineCap = 512 };
struct Line {
size_t len;
char buf[LineCap];
};
struct Service {
char *name;
char *command;
// TODO: And many other things...
enum State intent;
enum State state;
pid_t pid;
int outPipe[2];
int errPipe[2];
struct Line outLine;
struct Line errLine;
int restartInterval;
struct timeval restartTime;
};
extern struct Services {

View File

@ -14,6 +14,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <fcntl.h>
#include <paths.h>
#include <stdio.h>
#include <stdlib.h>
@ -36,6 +37,14 @@ struct Services services;
static void serviceFree(struct Service *service) {
free(service->name);
free(service->command);
if (service->outPipe[0] >= 0) {
close(service->outPipe[0]);
close(service->outPipe[1]);
}
if (service->errPipe[0] >= 0) {
close(service->errPipe[0]);
close(service->errPipe[1]);
}
}
int serviceAdd(const char *name, const char *command) {
@ -63,7 +72,11 @@ int serviceAdd(const char *name, const char *command) {
services.ptr = ptr;
}
service = &services.ptr[services.len];
memset(service, 0, sizeof(*service));
*service = (struct Service) {
.outPipe = { -1, -1 },
.errPipe = { -1, -1 },
.restartInterval = restartInterval,
};
service->name = strdup(name);
if (!service->name) goto err;
@ -71,6 +84,15 @@ int serviceAdd(const char *name, const char *command) {
service->command = strdup(command);
if (!service->command) goto err;
int error = pipe2(service->outPipe, O_CLOEXEC);
if (error) goto err;
error = pipe2(service->errPipe, O_CLOEXEC);
if (error) goto err;
fcntl(service->outPipe[0], F_SETFL, O_NONBLOCK);
fcntl(service->errPipe[0], F_SETFL, O_NONBLOCK);
services.len++;
return 0;