Roger Shimizu 8 years ago
committed by Max Lv
parent
commit
2445b8690f
1 changed files with 30 additions and 10 deletions
  1. 40
      src/manager.c

40
src/manager.c

@ -74,7 +74,8 @@
int verbose = 0; int verbose = 0;
char *executable = "ss-server"; char *executable = "ss-server";
char working_dir[PATH_MAX];
char *working_dir = NULL;
int working_dir_size = 0;
static struct cork_hash_table *server_table; static struct cork_hash_table *server_table;
@ -92,14 +93,17 @@ static int setnonblocking(int fd)
static void build_config(char *prefix, struct server *server) static void build_config(char *prefix, struct server *server)
{ {
char path[PATH_MAX];
char *path = NULL;
int path_size = strlen(prefix) + strlen(server->port) + 20;
snprintf(path, PATH_MAX, "%s/.shadowsocks_%s.conf", prefix, server->port);
path = malloc(path_size);
snprintf(path, path_size, "%s/.shadowsocks_%s.conf", prefix, server->port);
FILE *f = fopen(path, "w+"); FILE *f = fopen(path, "w+");
if (f == NULL) { if (f == NULL) {
if (verbose) { if (verbose) {
LOGE("unable to open config file"); LOGE("unable to open config file");
} }
free(path);
return; return;
} }
fprintf(f, "{\n"); fprintf(f, "{\n");
@ -107,6 +111,7 @@ static void build_config(char *prefix, struct server *server)
fprintf(f, "\"password\":\"%s\",\n", server->password); fprintf(f, "\"password\":\"%s\",\n", server->password);
fprintf(f, "}\n"); fprintf(f, "}\n");
fclose(f); fclose(f);
free(path);
} }
static char *construct_command_line(struct manager_ctx *manager, struct server *server) static char *construct_command_line(struct manager_ctx *manager, struct server *server)
@ -296,14 +301,16 @@ static void add_server(struct manager_ctx *manager, struct server *server)
static void kill_server(char *prefix, char *pid_file) static void kill_server(char *prefix, char *pid_file)
{ {
char path[PATH_MAX];
int pid;
snprintf(path, PATH_MAX, "%s/%s", prefix, pid_file);
char *path = NULL;
int pid, path_size = strlen(prefix) + strlen(pid_file) + 2;
path = malloc(path_size);
snprintf(path, path_size, "%s/%s", prefix, pid_file);
FILE *f = fopen(path, "r"); FILE *f = fopen(path, "r");
if (f == NULL) { if (f == NULL) {
if (verbose) { if (verbose) {
LOGE("unable to open pid file"); LOGE("unable to open pid file");
} }
free(path);
return; return;
} }
if (fscanf(f, "%d", &pid) != EOF) { if (fscanf(f, "%d", &pid) != EOF) {
@ -311,24 +318,28 @@ static void kill_server(char *prefix, char *pid_file)
} }
fclose(f); fclose(f);
remove(path); remove(path);
free(path);
} }
static void stop_server(char *prefix, char *port) static void stop_server(char *prefix, char *port)
{ {
char path[PATH_MAX];
int pid;
snprintf(path, PATH_MAX, "%s/.shadowsocks_%s.pid", prefix, port);
char *path = NULL;
int pid, path_size = strlen(prefix) + strlen(port) + 20;
path = malloc(path_size);
snprintf(path, path_size, "%s/.shadowsocks_%s.pid", prefix, port);
FILE *f = fopen(path, "r"); FILE *f = fopen(path, "r");
if (f == NULL) { if (f == NULL) {
if (verbose) { if (verbose) {
LOGE("unable to open pid file"); LOGE("unable to open pid file");
} }
free(path);
return; return;
} }
if (fscanf(f, "%d", &pid) != EOF) { if (fscanf(f, "%d", &pid) != EOF) {
kill(pid, SIGTERM); kill(pid, SIGTERM);
} }
fclose(f); fclose(f);
free(path);
} }
static void remove_server(char *prefix, char *port) static void remove_server(char *prefix, char *port)
@ -787,11 +798,14 @@ int main(int argc, char **argv)
struct passwd *pw = getpwuid(getuid()); struct passwd *pw = getpwuid(getuid());
const char *homedir = pw->pw_dir; const char *homedir = pw->pw_dir;
snprintf(working_dir, PATH_MAX, "%s/.shadowsocks", homedir);
working_dir_size = strlen(homedir)+15;
working_dir = malloc(working_dir_size);
snprintf(working_dir, working_dir_size, "%s/.shadowsocks", homedir);
int err = mkdir(working_dir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); int err = mkdir(working_dir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
if (err != 0 && errno != EEXIST) { if (err != 0 && errno != EEXIST) {
ERROR("mkdir"); ERROR("mkdir");
free(working_dir);
FATAL("unable to create working directory"); FATAL("unable to create working directory");
} }
@ -809,6 +823,7 @@ int main(int argc, char **argv)
} }
closedir (dp); closedir (dp);
} else { } else {
free(working_dir);
FATAL("Couldn't open the directory"); FATAL("Couldn't open the directory");
} }
@ -831,6 +846,7 @@ int main(int argc, char **argv)
struct sockaddr_un svaddr; struct sockaddr_un svaddr;
sfd = socket(AF_UNIX, SOCK_DGRAM, 0); /* Create server socket */ sfd = socket(AF_UNIX, SOCK_DGRAM, 0); /* Create server socket */
if (sfd == -1) { if (sfd == -1) {
free(working_dir);
FATAL("socket"); FATAL("socket");
} }
@ -838,6 +854,7 @@ int main(int argc, char **argv)
if (remove(manager_address) == -1 && errno != ENOENT) { if (remove(manager_address) == -1 && errno != ENOENT) {
ERROR("bind"); ERROR("bind");
free(working_dir);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -847,11 +864,13 @@ int main(int argc, char **argv)
if (bind(sfd, (struct sockaddr *)&svaddr, sizeof(struct sockaddr_un)) == -1) { if (bind(sfd, (struct sockaddr *)&svaddr, sizeof(struct sockaddr_un)) == -1) {
ERROR("bind"); ERROR("bind");
free(working_dir);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} else { } else {
sfd = create_server_socket(ip_addr.host, ip_addr.port); sfd = create_server_socket(ip_addr.host, ip_addr.port);
if (sfd == -1) { if (sfd == -1) {
free(working_dir);
FATAL("socket"); FATAL("socket");
} }
} }
@ -884,6 +903,7 @@ int main(int argc, char **argv)
ev_signal_stop(EV_DEFAULT, &sigint_watcher); ev_signal_stop(EV_DEFAULT, &sigint_watcher);
ev_signal_stop(EV_DEFAULT, &sigterm_watcher); ev_signal_stop(EV_DEFAULT, &sigterm_watcher);
free(working_dir);
return 0; return 0;
} }
Loading…
Cancel
Save