mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-31 14:33:50 +00:00
embedded libev
This commit is contained in:
+98
@@ -0,0 +1,98 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
#define INT_DIGITS 19 /* enough for 64 bit integer */
|
||||
|
||||
char *itoa(int i) {
|
||||
/* Room for INT_DIGITS digits, - and '\0' */
|
||||
static char buf[INT_DIGITS + 2];
|
||||
char *p = buf + INT_DIGITS + 1; /* points to terminating '\0' */
|
||||
if (i >= 0) {
|
||||
do {
|
||||
*--p = '0' + (i % 10);
|
||||
i /= 10;
|
||||
} while (i != 0);
|
||||
return p;
|
||||
}
|
||||
else { /* i < 0 */
|
||||
do {
|
||||
*--p = '0' - (i % 10);
|
||||
i /= 10;
|
||||
} while (i != 0);
|
||||
*--p = '-';
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
void FATAL(const char *msg) {
|
||||
fprintf(stderr, "%s", msg);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
void usage() {
|
||||
printf("\n");
|
||||
printf(" Shadowsocks-libev %s\n\n", VERSION);
|
||||
printf(" maintained by Max Lv <max.c.lv@gmail.com>\n\n");
|
||||
printf(" usage:\n\n");
|
||||
printf(" ss-[local|server] -s server_host -p server_port -l local_port -k password\n");
|
||||
printf(" [-m encrypt_method] [-f pid_file] [-t timeout] [-c config_file]\n");
|
||||
printf("\n");
|
||||
printf(" options:\n\n");
|
||||
printf(" encrypt_method: table, rc4\n");
|
||||
printf(" pid_file: valid path to the pid file\n");
|
||||
printf(" timeout: socket timeout in senconds\n");
|
||||
printf(" config_file: json format config file\n");
|
||||
printf("\n\n");
|
||||
}
|
||||
|
||||
void demonize(const char* path) {
|
||||
|
||||
/* Our process ID and Session ID */
|
||||
pid_t pid, sid;
|
||||
|
||||
/* Fork off the parent process */
|
||||
pid = fork();
|
||||
if (pid < 0) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* If we got a good PID, then
|
||||
we can exit the parent process. */
|
||||
if (pid > 0) {
|
||||
FILE *file = fopen(path, "w");
|
||||
if (file == NULL) FATAL("Invalid pid file\n");
|
||||
|
||||
fprintf(file, "%d", pid);
|
||||
fclose(file);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
/* Change the file mode mask */
|
||||
umask(0);
|
||||
|
||||
/* Open any logs here */
|
||||
|
||||
/* Create a new SID for the child process */
|
||||
sid = setsid();
|
||||
if (sid < 0) {
|
||||
/* Log the failure */
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Change the current working directory */
|
||||
if ((chdir("/")) < 0) {
|
||||
/* Log the failure */
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Close out the standard file descriptors */
|
||||
close(STDIN_FILENO);
|
||||
close(STDOUT_FILENO);
|
||||
close(STDERR_FILENO);
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user