亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? down-root.c

?? 可以實現搭建VPN服務器
?? C
字號:
/* *  OpenVPN -- An application to securely tunnel IP networks *             over a single TCP/UDP port, with support for SSL/TLS-based *             session authentication and key exchange, *             packet encryption, packet authentication, and *             packet compression. * *  Copyright (C) 2002-2005 OpenVPN Solutions LLC <info@openvpn.net> * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License version 2 *  as published by the Free Software Foundation. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program (see the file COPYING included with this *  distribution); if not, write to the Free Software Foundation, Inc., *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *//* * OpenVPN plugin module to do privileged down-script execution. */#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/wait.h>#include <fcntl.h>#include <signal.h>#include <syslog.h>#include "openvpn-plugin.h"#define DEBUG(verb) ((verb) >= 7)/* Command codes for foreground -> background communication */#define COMMAND_RUN_SCRIPT 0#define COMMAND_EXIT       1/* Response codes for background -> foreground communication */#define RESPONSE_INIT_SUCCEEDED   10#define RESPONSE_INIT_FAILED      11#define RESPONSE_SCRIPT_SUCCEEDED 12#define RESPONSE_SCRIPT_FAILED    13/* Background process function */static void down_root_server (const int fd, char *command, const char *argv[], const char *envp[], const int verb);/* * Plugin state, used by foreground */struct down_root_context{  /* Foreground's socket to background process */  int foreground_fd;  /* Process ID of background process */  pid_t background_pid;  /* Verbosity level of OpenVPN */  int verb;  /* down command */  char *command;};/* * Given an environmental variable name, search * the envp array for its value, returning it * if found or NULL otherwise. */static const char *get_env (const char *name, const char *envp[]){  if (envp)    {      int i;      const int namelen = strlen (name);      for (i = 0; envp[i]; ++i)	{	  if (!strncmp (envp[i], name, namelen))	    {	      const char *cp = envp[i] + namelen;	      if (*cp == '=')		return cp + 1;	    }	}    }  return NULL;}/* * Return the length of a string array */static intstring_array_len (const char *array[]){  int i = 0;  if (array)    {      while (array[i])	++i;    }  return i;}/* * Socket read/write functions. */static intrecv_control (int fd){  unsigned char c;  const ssize_t size = read (fd, &c, sizeof (c));  if (size == sizeof (c))    return c;  else    return -1;}static intsend_control (int fd, int code){  unsigned char c = (unsigned char) code;  const ssize_t size = write (fd, &c, sizeof (c));  if (size == sizeof (c))    return (int) size;  else    return -1;}/* * Daemonize if "daemon" env var is true. * Preserve stderr across daemonization if * "daemon_log_redirect" env var is true. */static voiddaemonize (const char *envp[]){  const char *daemon_string = get_env ("daemon", envp);  if (daemon_string && daemon_string[0] == '1')    {      const char *log_redirect = get_env ("daemon_log_redirect", envp);      int fd = -1;      if (log_redirect && log_redirect[0] == '1')	fd = dup (2);      if (daemon (0, 0) < 0)	{	  fprintf (stderr, "DOWN-ROOT: daemonization failed\n");	}      else if (fd >= 3)	{	  dup2 (fd, 2);	  close (fd);	}    }}/* * Close most of parent's fds. * Keep stdin/stdout/stderr, plus one * other fd which is presumed to be * our pipe back to parent. * Admittedly, a bit of a kludge, * but posix doesn't give us a kind * of FD_CLOEXEC which will stop * fds from crossing a fork(). */static voidclose_fds_except (int keep){  int i;  closelog ();  for (i = 3; i <= 100; ++i)    {      if (i != keep)	close (i);    }}/* * Usually we ignore signals, because our parent will * deal with them. */static voidset_signals (void){  signal (SIGTERM, SIG_DFL);  signal (SIGINT, SIG_IGN);  signal (SIGHUP, SIG_IGN);  signal (SIGUSR1, SIG_IGN);  signal (SIGUSR2, SIG_IGN);  signal (SIGPIPE, SIG_IGN);}/* * convert system() return into a success/failure value */intsystem_ok (int stat){#ifdef WIN32  return stat == 0;#else  return stat != -1 && WIFEXITED (stat) && WEXITSTATUS (stat) == 0;#endif}static char *build_command_line (const char *argv[]){  int size = 0;  int n = 0;  int i;  char *string;  /* precompute size */  if (argv)    {      for (i = 0; argv[i]; ++i)	{	  size += (strlen (argv[i]) + 1); /* string length plus trailing space */	  ++n;	}    }  ++size;                                 /* for null terminator */  /* allocate memory */  string = (char *) malloc (size);  if (!string)    {      fprintf (stderr, "DOWN-ROOT: out of memory\n");      exit (1);    }  string[0] = '\0';  /* build string */  for (i = 0; i < n; ++i)    {      strcat (string, argv[i]);      if (i + 1 < n)	strcat (string, " ");    }  return string;}static voidfree_context (struct down_root_context *context){  if (context)    {      if (context->command)	free (context->command);      free (context);    }}OPENVPN_EXPORT openvpn_plugin_handle_topenvpn_plugin_open_v1 (unsigned int *type_mask, const char *argv[], const char *envp[]){  struct down_root_context *context;  /*   * Allocate our context   */  context = (struct down_root_context *) calloc (1, sizeof (struct down_root_context));  context->foreground_fd = -1;  /*   * Intercept the --up and --down callbacks   */  *type_mask = OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_UP) | OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_DOWN);  /*   * Make sure we have two string arguments: the first is the .so name,   * the second is the script command.   */  if (string_array_len (argv) < 2)    {      fprintf (stderr, "DOWN-ROOT: need down script command\n");      goto error;    }  /*   * Save our argument in context   */  context->command = build_command_line (&argv[1]);  /*   * Get verbosity level from environment   */  {    const char *verb_string = get_env ("verb", envp);    if (verb_string)      context->verb = atoi (verb_string);  }  return (openvpn_plugin_handle_t) context; error:  free_context (context);  return NULL;}OPENVPN_EXPORT intopenvpn_plugin_func_v1 (openvpn_plugin_handle_t handle, const int type, const char *argv[], const char *envp[]){  struct down_root_context *context = (struct down_root_context *) handle;  if (type == OPENVPN_PLUGIN_UP && context->foreground_fd == -1) /* fork off a process to hold onto root */    {      pid_t pid;      int fd[2];      /*       * Make a socket for foreground and background processes       * to communicate.       */      if (socketpair (PF_UNIX, SOCK_DGRAM, 0, fd) == -1)	{	  fprintf (stderr, "DOWN-ROOT: socketpair call failed\n");	  return OPENVPN_PLUGIN_FUNC_ERROR;	}      /*       * Fork off the privileged process.  It will remain privileged       * even after the foreground process drops its privileges.       */      pid = fork ();      if (pid)	{	  int status;	  /*	   * Foreground Process	   */	  context->background_pid = pid;	  /* close our copy of child's socket */	  close (fd[1]);	  /* don't let future subprocesses inherit child socket */	  if (fcntl (fd[0], F_SETFD, FD_CLOEXEC) < 0)	    fprintf (stderr, "DOWN-ROOT: Set FD_CLOEXEC flag on socket file descriptor failed\n");	  /* wait for background child process to initialize */	  status = recv_control (fd[0]);	  if (status == RESPONSE_INIT_SUCCEEDED)	    {	      context->foreground_fd = fd[0];	      return OPENVPN_PLUGIN_FUNC_SUCCESS;	    }	}      else	{	  /*	   * Background Process	   */	  /* close all parent fds except our socket back to parent */	  close_fds_except (fd[1]);	  /* Ignore most signals (the parent will receive them) */	  set_signals ();	  /* Daemonize if --daemon option is set. */	  daemonize (envp);	  /* execute the event loop */	  down_root_server (fd[1], context->command, argv, envp, context->verb);	  close (fd[1]);	  exit (0);	  return 0; /* NOTREACHED */	}    }  else if (type == OPENVPN_PLUGIN_DOWN && context->foreground_fd >= 0)    {      if (send_control (context->foreground_fd, COMMAND_RUN_SCRIPT) == -1)	{	  fprintf (stderr, "DOWN-ROOT: Error sending script execution signal to background process\n");	}      else	{	  const int status = recv_control (context->foreground_fd);	  if (status == RESPONSE_SCRIPT_SUCCEEDED)	    return OPENVPN_PLUGIN_FUNC_SUCCESS;	  if (status == -1)	    fprintf (stderr, "DOWN-ROOT: Error receiving script execution confirmation from background process\n");	}    }  return OPENVPN_PLUGIN_FUNC_ERROR;}OPENVPN_EXPORT voidopenvpn_plugin_close_v1 (openvpn_plugin_handle_t handle){  struct down_root_context *context = (struct down_root_context *) handle;  if (DEBUG (context->verb))    fprintf (stderr, "DOWN-ROOT: close\n");  if (context->foreground_fd >= 0)    {      /* tell background process to exit */      if (send_control (context->foreground_fd, COMMAND_EXIT) == -1)	fprintf (stderr, "DOWN-ROOT: Error signaling background process to exit\n");      /* wait for background process to exit */      if (context->background_pid > 0)	waitpid (context->background_pid, NULL, 0);      close (context->foreground_fd);      context->foreground_fd = -1;    }  free_context (context);}OPENVPN_EXPORT voidopenvpn_plugin_abort_v1 (openvpn_plugin_handle_t handle){  struct down_root_context *context = (struct down_root_context *) handle;  if (context->foreground_fd >= 0)    {      /* tell background process to exit */      send_control (context->foreground_fd, COMMAND_EXIT);      close (context->foreground_fd);      context->foreground_fd = -1;    }}/* * Background process -- runs with privilege. */static voiddown_root_server (const int fd, char *command, const char *argv[], const char *envp[], const int verb){  const char *p[3];  char *command_line = NULL;  char *argv_cat = NULL;  int i;  /*   * Do initialization   */  if (DEBUG (verb))    fprintf (stderr, "DOWN-ROOT: BACKGROUND: INIT command='%s'\n", command);  /*   * Tell foreground that we initialized successfully   */  if (send_control (fd, RESPONSE_INIT_SUCCEEDED) == -1)    {      fprintf (stderr, "DOWN-ROOT: BACKGROUND: write error on response socket [1]\n");      goto done;    }  /*   * Build command line   */  if (string_array_len (argv) >= 2)    argv_cat = build_command_line (&argv[1]);  else    argv_cat = build_command_line (NULL);  p[0] = command;  p[1] = argv_cat;  p[2] = NULL;  command_line = build_command_line (p);  /*   * Save envp in environment   */  for (i = 0; envp[i]; ++i)    {      putenv ((char *)envp[i]);    }  /*   * Event loop   */  while (1)    {      int command_code;      int status;      /* get a command from foreground process */      command_code = recv_control (fd);      if (DEBUG (verb))	fprintf (stderr, "DOWN-ROOT: BACKGROUND: received command code: %d\n", command_code);      switch (command_code)	{	case COMMAND_RUN_SCRIPT:	  status = system (command_line);	  if (system_ok (status)) /* Succeeded */	    {	      if (send_control (fd, RESPONSE_SCRIPT_SUCCEEDED) == -1)		{		  fprintf (stderr, "DOWN-ROOT: BACKGROUND: write error on response socket [2]\n");		  goto done;		}	    }	  else /* Failed */	    {	      if (send_control (fd, RESPONSE_SCRIPT_FAILED) == -1)		{		  fprintf (stderr, "DOWN-ROOT: BACKGROUND: write error on response socket [3]\n");		  goto done;		}	    }	  break;	case COMMAND_EXIT:	  goto done;	case -1:	  fprintf (stderr, "DOWN-ROOT: BACKGROUND: read error on command channel\n");	  goto done;	default:	  fprintf (stderr, "DOWN-ROOT: BACKGROUND: unknown command code: code=%d, exiting\n",		   command_code);	  goto done;	}    } done:  if (argv_cat)    free (argv_cat);  if (command_line)    free (command_line);  if (DEBUG (verb))    fprintf (stderr, "DOWN-ROOT: BACKGROUND: EXIT\n");  return;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕第一区综合| 国产精品自在在线| 免费日本视频一区| 成人动漫一区二区在线| 欧美日韩国产在线播放网站| 亚洲精品一区二区三区四区高清 | 成人app软件下载大全免费| 欧洲精品一区二区三区在线观看| 精品免费日韩av| 五月婷婷激情综合| www.日本不卡| 精品99999| 日韩精品一二三四| 欧美视频在线观看一区二区| 中文字幕亚洲一区二区av在线| 九九精品一区二区| 欧美日韩精品一区二区在线播放| 国产精品高清亚洲| 韩国v欧美v亚洲v日本v| 6080午夜不卡| 亚洲国产成人高清精品| 91麻豆国产福利在线观看| 国产午夜精品在线观看| 久久99热这里只有精品| 在线播放中文一区| 亚洲国产你懂的| 日本高清免费不卡视频| 国产精品福利一区| 成人av网站免费观看| 国产性天天综合网| 国产福利一区二区| 国产性色一区二区| 成人午夜视频在线观看| 国产网站一区二区三区| 国产伦精一区二区三区| 久久亚洲精品小早川怜子| 久久精品国产999大香线蕉| 在线成人av网站| 免费看精品久久片| 日韩欧美成人激情| 精品一区二区三区蜜桃| 久久精品欧美一区二区三区不卡| 国产一区亚洲一区| 国产亚洲精品久| 91在线观看视频| 一区二区在线免费观看| 欧亚一区二区三区| 午夜精品福利一区二区蜜股av| 7799精品视频| 国产在线乱码一区二区三区| 国产亚洲一区二区在线观看| 成人激情动漫在线观看| 国产精品传媒在线| 日本韩国欧美三级| 肉丝袜脚交视频一区二区| 日韩精品一区二区三区视频 | 久久九九国产精品| 成人自拍视频在线| 亚洲免费高清视频在线| 欧美老人xxxx18| 九九久久精品视频 | 欧美videos中文字幕| 国产精品亚洲成人| 中文字幕在线不卡| 欧美精品日日鲁夜夜添| 国产在线播精品第三| 亚洲日本va在线观看| 777午夜精品免费视频| 国产一区二区三区四区五区美女| 一色桃子久久精品亚洲| 欧美丰满一区二区免费视频| 国产福利精品一区二区| 一级做a爱片久久| 久久久久久综合| 在线视频欧美精品| 久久91精品国产91久久小草| 亚洲日本va在线观看| 欧美变态tickling挠脚心| 色88888久久久久久影院野外| 美女国产一区二区三区| 亚洲日本电影在线| 久久综合色8888| 欧美欧美欧美欧美首页| 成人午夜激情影院| 日本网站在线观看一区二区三区| 国产精品久久久久婷婷| 欧美一区二区三区四区视频| 色综合天天综合网天天看片| 久久精品国产99久久6| 亚洲自拍偷拍综合| 中文欧美字幕免费| 日韩美一区二区三区| 欧美在线一二三四区| 福利一区二区在线观看| 日本欧美韩国一区三区| 亚洲影院在线观看| 亚洲色图一区二区| 国产人成亚洲第一网站在线播放| 欧美一区二区三区视频免费播放| 色综合久久66| 国产成人av影院| 极品美女销魂一区二区三区免费| 图片区小说区国产精品视频| 一区二区三区在线免费| 欧美激情一区二区三区蜜桃视频 | 8v天堂国产在线一区二区| 色婷婷久久久综合中文字幕| 成人h精品动漫一区二区三区| 久久爱www久久做| 免费在线观看成人| 亚洲成人激情av| 亚洲国产欧美一区二区三区丁香婷| 亚洲欧美一区二区在线观看| 国产精品网站在线| 国产精品伦一区| 中文字幕亚洲视频| 亚洲欧洲无码一区二区三区| 国产农村妇女毛片精品久久麻豆| 国产日韩欧美亚洲| 精品国产乱码久久久久久久久| 日韩久久久久久| 欧美成人免费网站| 精品成人一区二区三区四区| 久久亚洲一级片| 欧美激情在线一区二区三区| 国产精品福利影院| 亚洲男女一区二区三区| 亚洲国产综合91精品麻豆 | 亚洲女人****多毛耸耸8| 亚洲免费观看在线视频| 亚洲一区二区免费视频| 日韩综合一区二区| 免费成人av资源网| 国产自产视频一区二区三区| 成人性生交大片免费看视频在线 | 国产xxx精品视频大全| 国产不卡一区视频| 色狠狠桃花综合| 555www色欧美视频| 精品国产亚洲在线| 欧美国产成人精品| 一片黄亚洲嫩模| 免费成人你懂的| 成人一区二区三区中文字幕| 一本久久精品一区二区| 欧美片网站yy| 国产精品免费视频一区| 尤物视频一区二区| 久久丁香综合五月国产三级网站| 成人一级视频在线观看| 91久久香蕉国产日韩欧美9色| 91精品国产麻豆| 中文在线一区二区| 日韩精彩视频在线观看| 国产99久久久国产精品潘金网站| 色综合久久九月婷婷色综合| 欧美另类高清zo欧美| 日本一区二区三区在线不卡| 亚洲国产毛片aaaaa无费看| 国产美女主播视频一区| 91久久精品国产91性色tv | 1000部国产精品成人观看| 天天操天天色综合| 成人小视频免费观看| 91精品国产高清一区二区三区 | 国产精品美女久久福利网站| 日韩影视精彩在线| 成人激情视频网站| 日韩精品中文字幕在线一区| 亚洲精品日产精品乱码不卡| 久久91精品久久久久久秒播| 欧美亚男人的天堂| 国产精品午夜久久| 激情成人午夜视频| 欧美日韩小视频| 欧美国产精品久久| 久久99久久久欧美国产| 在线看一区二区| 中文字幕亚洲视频| 韩国毛片一区二区三区| 欧美一区二区在线不卡| 一区二区激情小说| a美女胸又www黄视频久久| 精品国产伦理网| 久久国产精品第一页| 777午夜精品免费视频| 亚洲与欧洲av电影| 99久久精品免费| 中文字幕亚洲一区二区av在线 | 国产盗摄一区二区三区| 91精品国产91久久久久久最新毛片| 亚洲激情校园春色| 成人听书哪个软件好| 久久九九全国免费| 精品在线播放午夜| 欧美大片在线观看一区二区| 欧美aaaaaa午夜精品| 欧美一级在线视频| 日本中文字幕一区| 日韩一区二区在线观看视频|