sysctl.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:7k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2. kHTTPd -- the next generation
  3. Sysctl interface
  4. */
  5. /****************************************************************
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2, or (at your option)
  9.  * any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  ****************************************************************/
  21. #include <linux/kernel.h>
  22. #include <linux/errno.h>
  23. #include <linux/slab.h>
  24. #include <linux/net.h>
  25. #include <linux/sched.h>
  26. #include <linux/skbuff.h>
  27. #include <linux/smp_lock.h>
  28. #include <linux/sysctl.h>
  29. #include <linux/un.h>
  30. #include <linux/unistd.h>
  31. #include <net/ip.h>
  32. #include <net/sock.h>
  33. #include <net/tcp.h>
  34. #include <asm/atomic.h>
  35. #include <asm/semaphore.h>
  36. #include <asm/processor.h>
  37. #include <asm/uaccess.h>
  38. #include <linux/file.h>
  39. #include "prototypes.h"
  40. char  sysctl_khttpd_docroot[200] = "/var/www";
  41. int  sysctl_khttpd_stop  = 0;
  42. int  sysctl_khttpd_start  = 0;
  43. int  sysctl_khttpd_unload  = 0;
  44. int  sysctl_khttpd_clientport = 80;
  45. int  sysctl_khttpd_permreq    = S_IROTH; /* "other" read-access is required by default*/
  46. int  sysctl_khttpd_permforbid = S_IFDIR | S_ISVTX | S_IXOTH | S_IXGRP | S_IXUSR;
  47.   /* forbidden is execute, directory and sticky*/
  48. int  sysctl_khttpd_logging  = 0;
  49. int  sysctl_khttpd_serverport= 8080;
  50. char sysctl_khttpd_dynamicstring[200];
  51. int  sysctl_khttpd_sloppymime= 0;
  52. int sysctl_khttpd_threads = 2;
  53. int sysctl_khttpd_maxconnect = 1000;
  54. atomic_t        khttpd_stopCount;
  55. static struct ctl_table_header *khttpd_table_header;
  56. static int sysctl_SecureString(ctl_table *table, int *name, int nlen,
  57.   void *oldval, size_t *oldlenp,
  58.   void *newval, size_t newlen, void **context);
  59. static int proc_dosecurestring(ctl_table *table, int write, struct file *filp,
  60.   void *buffer, size_t *lenp);
  61. static int khttpd_stop_wrap_proc_dointvec(ctl_table *table, int write, struct file *filp,
  62.   void *buffer, size_t *lenp);
  63. static ctl_table khttpd_table[] = {
  64. { NET_KHTTPD_DOCROOT,
  65. "documentroot",
  66. &sysctl_khttpd_docroot,
  67. sizeof(sysctl_khttpd_docroot),
  68. 0644,
  69. NULL,
  70. proc_dostring,
  71. &sysctl_string,
  72. NULL,
  73. NULL,
  74. NULL
  75. },
  76. { NET_KHTTPD_STOP,
  77. "stop",
  78. &sysctl_khttpd_stop,
  79. sizeof(int),
  80. 0644,
  81. NULL,
  82. khttpd_stop_wrap_proc_dointvec,
  83. &sysctl_intvec,
  84. NULL,
  85. NULL,
  86. NULL
  87. },
  88. { NET_KHTTPD_START,
  89. "start",
  90. &sysctl_khttpd_start,
  91. sizeof(int),
  92. 0644,
  93. NULL,
  94. proc_dointvec,
  95. &sysctl_intvec,
  96. NULL,
  97. NULL,
  98. NULL
  99. },
  100. { NET_KHTTPD_UNLOAD,
  101. "unload",
  102. &sysctl_khttpd_unload,
  103. sizeof(int),
  104. 0644,
  105. NULL,
  106. proc_dointvec,
  107. &sysctl_intvec,
  108. NULL,
  109. NULL,
  110. NULL
  111. },
  112. { NET_KHTTPD_THREADS,
  113. "threads",
  114. &sysctl_khttpd_threads,
  115. sizeof(int),
  116. 0644,
  117. NULL,
  118. proc_dointvec,
  119. &sysctl_intvec,
  120. NULL,
  121. NULL,
  122. NULL
  123. },
  124. { NET_KHTTPD_MAXCONNECT,
  125. "maxconnect",
  126. &sysctl_khttpd_maxconnect,
  127. sizeof(int),
  128. 0644,
  129. NULL,
  130. proc_dointvec,
  131. &sysctl_intvec,
  132. NULL,
  133. NULL,
  134. NULL
  135. },
  136. { NET_KHTTPD_SLOPPYMIME,
  137. "sloppymime",
  138. &sysctl_khttpd_sloppymime,
  139. sizeof(int),
  140. 0644,
  141. NULL,
  142. proc_dointvec,
  143. &sysctl_intvec,
  144. NULL,
  145. NULL,
  146. NULL
  147. },
  148. { NET_KHTTPD_CLIENTPORT,
  149. "clientport",
  150. &sysctl_khttpd_clientport,
  151. sizeof(int),
  152. 0644,
  153. NULL,
  154. proc_dointvec,
  155. &sysctl_intvec,
  156. NULL,
  157. NULL,
  158. NULL
  159. },
  160. { NET_KHTTPD_PERMREQ,
  161. "perm_required",
  162. &sysctl_khttpd_permreq,
  163. sizeof(int),
  164. 0644,
  165. NULL,
  166. proc_dointvec,
  167. &sysctl_intvec,
  168. NULL,
  169. NULL,
  170. NULL
  171. },
  172. { NET_KHTTPD_PERMFORBID,
  173. "perm_forbid",
  174. &sysctl_khttpd_permforbid,
  175. sizeof(int),
  176. 0644,
  177. NULL,
  178. proc_dointvec,
  179. &sysctl_intvec,
  180. NULL,
  181. NULL,
  182. NULL
  183. },
  184. { NET_KHTTPD_LOGGING,
  185. "logging",
  186. &sysctl_khttpd_logging,
  187. sizeof(int),
  188. 0644,
  189. NULL,
  190. proc_dointvec,
  191. &sysctl_intvec,
  192. NULL,
  193. NULL,
  194. NULL
  195. },
  196. { NET_KHTTPD_SERVERPORT,
  197. "serverport",
  198. &sysctl_khttpd_serverport,
  199. sizeof(int),
  200. 0644,
  201. NULL,
  202. proc_dointvec,
  203. &sysctl_intvec,
  204. NULL,
  205. NULL,
  206. NULL
  207. },
  208. { NET_KHTTPD_DYNAMICSTRING,
  209. "dynamic",
  210. &sysctl_khttpd_dynamicstring,
  211. sizeof(sysctl_khttpd_dynamicstring),
  212. 0644,
  213. NULL,
  214. proc_dosecurestring,
  215. &sysctl_SecureString,
  216. NULL,
  217. NULL,
  218. NULL
  219. },
  220. {0,0,0,0,0,0,0,0,0,0,0} };
  221. static ctl_table khttpd_dir_table[] = {
  222. {NET_KHTTPD, "khttpd", NULL, 0, 0555, khttpd_table,0,0,0,0,0},
  223. {0,0,0,0,0,0,0,0,0,0,0}
  224. };
  225. static ctl_table khttpd_root_table[] = {
  226. {CTL_NET, "net", NULL, 0, 0555, khttpd_dir_table,0,0,0,0,0},
  227. {0,0,0,0,0,0,0,0,0,0,0}
  228. };
  229. void StartSysctl(void)
  230. {
  231. khttpd_table_header = register_sysctl_table(khttpd_root_table,1);
  232. }
  233. void EndSysctl(void)
  234. {
  235. unregister_sysctl_table(khttpd_table_header);
  236. }
  237. static int proc_dosecurestring(ctl_table *table, int write, struct file *filp,
  238.   void *buffer, size_t *lenp)
  239. {
  240. size_t len;
  241. char *p, c=0;
  242. char String[256];
  243. if ((table->data==0) || (table->maxlen==0) || (*lenp==0) ||
  244.     ((filp->f_pos!=0) && (write==0))) {
  245. *lenp = 0;
  246. return 0;
  247. }
  248. if (write!=0) {
  249. len = 0;
  250. p = buffer;
  251. while (len < *lenp) {
  252. if(get_user(c, p++))
  253. return -EFAULT;
  254. if (c == 0 || c == 'n')
  255. break;
  256. len++;
  257. }
  258. if (len >= table->maxlen)
  259. len = table->maxlen-1;
  260. if(copy_from_user(String, buffer,(unsigned long)len))
  261. return -EFAULT;
  262. ((char *) String)[len] = 0;
  263. filp->f_pos += *lenp;
  264. AddDynamicString(String);
  265. } else {
  266. GetSecureString(String);
  267. len = strlen(String);
  268. if (len > table->maxlen)
  269. len = table->maxlen;
  270. if (len > *lenp)
  271. len = *lenp;
  272. if (len!=0)
  273. if(copy_to_user(buffer, String,(unsigned long)len))
  274. return -EFAULT;
  275. if (len < *lenp) {
  276. if(put_user('n', ((char *) buffer) + len))
  277. return -EFAULT;
  278. len++;
  279. }
  280. *lenp = len;
  281. filp->f_pos += len;
  282. }
  283. return 0;
  284. }
  285. /* A wrapper around proc_dointvec that computes
  286.  * khttpd_stopCount = # of times sysctl_khttpd_stop has gone true
  287.  * Sensing sysctl_khttpd_stop in other threads is racy;
  288.  * sensing khttpd_stopCount in other threads is not.
  289.  */
  290. static int khttpd_stop_wrap_proc_dointvec(ctl_table *table, int write, struct file *filp,
  291.   void *buffer, size_t *lenp)
  292. {
  293. int rv;
  294. int oldstop = sysctl_khttpd_stop;
  295. rv = proc_dointvec(table, write, filp, buffer, lenp);
  296. if (sysctl_khttpd_stop && !oldstop)
  297. atomic_inc(&khttpd_stopCount);
  298. return rv;
  299. }
  300. static int sysctl_SecureString (/*@unused@*/ctl_table *table, 
  301. /*@unused@*/int *name, 
  302. /*@unused@*/int nlen,
  303.    /*@unused@*/void *oldval, 
  304.    /*@unused@*/size_t *oldlenp,
  305.    /*@unused@*/void *newval, 
  306.    /*@unused@*/size_t newlen, 
  307.    /*@unused@*/void **context)
  308. {
  309. return -ENOSYS;
  310. }