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;
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;
@ -92,14 +93,17 @@ static int setnonblocking(int fd)
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+");
if (f == NULL) {
if (verbose) {
LOGE("unable to open config file");
}
free(path);
return;
}
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, "}\n");
fclose(f);
free(path);
}
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)
{
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");
if (f == NULL) {
if (verbose) {
LOGE("unable to open pid file");
}
free(path);
return;
}
if (fscanf(f, "%d", &pid) != EOF) {
@ -311,24 +318,28 @@ static void kill_server(char *prefix, char *pid_file)
}
fclose(f);
remove(path);
free(path);
}
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");
if (f == NULL) {
if (verbose) {
LOGE("unable to open pid file");
}
free(path);
return;
}
if (fscanf(f, "%d", &pid) != EOF) {
kill(pid, SIGTERM);
}
fclose(f);
free(path);
}
static void remove_server(char *prefix, char *port)
@ -787,11 +798,14 @@ int main(int argc, char **argv)
struct passwd *pw = getpwuid(getuid());
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);
if (err != 0 && errno != EEXIST) {
ERROR("mkdir");
free(working_dir);
FATAL("unable to create working directory");
}
@ -809,6 +823,7 @@ int main(int argc, char **argv)
}
closedir (dp);
} else {
free(working_dir);
FATAL("Couldn't open the directory");
}
@ -831,6 +846,7 @@ int main(int argc, char **argv)
struct sockaddr_un svaddr;
sfd = socket(AF_UNIX, SOCK_DGRAM, 0); /* Create server socket */
if (sfd == -1) {
free(working_dir);
FATAL("socket");
}
@ -838,6 +854,7 @@ int main(int argc, char **argv)
if (remove(manager_address) == -1 && errno != ENOENT) {
ERROR("bind");
free(working_dir);
exit(EXIT_FAILURE);
}
@ -847,11 +864,13 @@ int main(int argc, char **argv)
if (bind(sfd, (struct sockaddr *)&svaddr, sizeof(struct sockaddr_un)) == -1) {
ERROR("bind");
free(working_dir);
exit(EXIT_FAILURE);
}
} else {
sfd = create_server_socket(ip_addr.host, ip_addr.port);
if (sfd == -1) {
free(working_dir);
FATAL("socket");
}
}
@ -884,6 +903,7 @@ int main(int argc, char **argv)
ev_signal_stop(EV_DEFAULT, &sigint_watcher);
ev_signal_stop(EV_DEFAULT, &sigterm_watcher);
free(working_dir);
return 0;
}
Loading…
Cancel
Save