it works
git-svn-id: file:///raid/svn-personal/mokou/trunk@10 35d6bad2-6c5c-c749-ada2-a2c82cb3bd79
This commit is contained in:
parent
29bdedf923
commit
f013b96d44
|
@ -18,5 +18,6 @@ void mk_service_scan(void);
|
||||||
int mk_start_service(const char* name);
|
int mk_start_service(const char* name);
|
||||||
int mk_stop_service(const char* name);
|
int mk_stop_service(const char* name);
|
||||||
void mk_start_services(void);
|
void mk_start_services(void);
|
||||||
|
void mk_resurrect_services(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -7,10 +7,12 @@
|
||||||
#include "mk_util.h"
|
#include "mk_util.h"
|
||||||
#include "mk_log.h"
|
#include "mk_log.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
@ -48,7 +50,6 @@ int mk_server_init(void){
|
||||||
void mk_server_loop(void){
|
void mk_server_loop(void){
|
||||||
struct sockaddr_un cun;
|
struct sockaddr_un cun;
|
||||||
socklen_t socklen = sizeof(cun);
|
socklen_t socklen = sizeof(cun);
|
||||||
char* ver = mk_strcat3("R", mk_get_version(), "\n");
|
|
||||||
char cbuf[2];
|
char cbuf[2];
|
||||||
cbuf[1] = 0;
|
cbuf[1] = 0;
|
||||||
char* str = malloc(1);
|
char* str = malloc(1);
|
||||||
|
@ -56,11 +57,19 @@ void mk_server_loop(void){
|
||||||
struct pollfd pollfds[16 + 1];
|
struct pollfd pollfds[16 + 1];
|
||||||
pollfds[0].fd = server;
|
pollfds[0].fd = server;
|
||||||
pollfds[0].events = POLLIN | POLLPRI;
|
pollfds[0].events = POLLIN | POLLPRI;
|
||||||
|
time_t trigger = time(NULL) + 5;
|
||||||
while(1){
|
while(1){
|
||||||
mk_log("Waiting for the connection");
|
|
||||||
int r = poll(pollfds, 16 + 1, 5000);
|
int r = poll(pollfds, 16 + 1, 5000);
|
||||||
|
if(!(r > 0 && pollfds[0].revents & POLLIN)){
|
||||||
|
time_t t = time(NULL);
|
||||||
|
if(t >= trigger){
|
||||||
|
mk_resurrect_services();
|
||||||
|
trigger = time(NULL) + 5;
|
||||||
|
}
|
||||||
|
usleep(1000);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
int cli = accept(server, (struct sockaddr*)&cun, &socklen);
|
int cli = accept(server, (struct sockaddr*)&cun, &socklen);
|
||||||
send(cli, ver, strlen(ver), 0);
|
|
||||||
while(1){
|
while(1){
|
||||||
if(recv(cli, cbuf, 1, 0) <= 0) break;
|
if(recv(cli, cbuf, 1, 0) <= 0) break;
|
||||||
if(cbuf[0] == '\n'){
|
if(cbuf[0] == '\n'){
|
||||||
|
@ -71,7 +80,7 @@ void mk_server_loop(void){
|
||||||
send(cli, mk_errors[err], strlen(mk_errors[err]), 0);
|
send(cli, mk_errors[err], strlen(mk_errors[err]), 0);
|
||||||
send(cli, "\n", 1, 0);
|
send(cli, "\n", 1, 0);
|
||||||
}else{
|
}else{
|
||||||
send(cli, "Mok\n", 4, 0);
|
send(cli, "MOk\n", 4, 0);
|
||||||
}
|
}
|
||||||
}else if(str[0] == 'D'){
|
}else if(str[0] == 'D'){
|
||||||
int err = mk_stop_service(str + 1);
|
int err = mk_stop_service(str + 1);
|
||||||
|
@ -80,8 +89,11 @@ void mk_server_loop(void){
|
||||||
send(cli, mk_errors[err], strlen(mk_errors[err]), 0);
|
send(cli, mk_errors[err], strlen(mk_errors[err]), 0);
|
||||||
send(cli, "\n", 1, 0);
|
send(cli, "\n", 1, 0);
|
||||||
}else{
|
}else{
|
||||||
send(cli, "Mok\n", 4, 0);
|
send(cli, "MOk\n", 4, 0);
|
||||||
}
|
}
|
||||||
|
}else if(str[0] == 'R'){
|
||||||
|
mk_service_scan();
|
||||||
|
send(cli, "MOk\n", 4, 0);
|
||||||
}else{
|
}else{
|
||||||
send(cli, PROTOCOL_ERROR, strlen(PROTOCOL_ERROR), 0);
|
send(cli, PROTOCOL_ERROR, strlen(PROTOCOL_ERROR), 0);
|
||||||
}
|
}
|
||||||
|
@ -97,6 +109,5 @@ void mk_server_loop(void){
|
||||||
}
|
}
|
||||||
close(cli);
|
close(cli);
|
||||||
}
|
}
|
||||||
free(ver);
|
free(str);
|
||||||
free(ver);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -396,3 +396,28 @@ void mk_start_services(void){
|
||||||
mk_start_service(services[i]->name);
|
mk_start_service(services[i]->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mk_resurrect_services(void){
|
||||||
|
int i;
|
||||||
|
bool re = false;
|
||||||
|
for(i = 0; services[i] != NULL; i++){
|
||||||
|
if(!services[i]->stopped){
|
||||||
|
bool alive = false;
|
||||||
|
|
||||||
|
FILE* f = fopen(services[i]->pidfile, "r");
|
||||||
|
if(f != NULL){
|
||||||
|
unsigned long long pid;
|
||||||
|
fscanf(f, "%llu", &pid);
|
||||||
|
fclose(f);
|
||||||
|
alive = kill(pid, 0) == 0;
|
||||||
|
}
|
||||||
|
if(!alive){
|
||||||
|
if(!re){
|
||||||
|
mk_log("Resurrection");
|
||||||
|
re = true;
|
||||||
|
}
|
||||||
|
mk_start_service(services[i]->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user