sysctl.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

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. static struct ctl_table_header *khttpd_table_header;
  55. static int sysctl_SecureString(ctl_table *table, int *name, int nlen,
  56.   void *oldval, size_t *oldlenp,
  57.   void *newval, size_t newlen, void **context);
  58. static int proc_dosecurestring(ctl_table *table, int write, struct file *filp,
  59.   void *buffer, size_t *lenp);
  60. static ctl_table khttpd_table[] = {
  61. { NET_KHTTPD_DOCROOT,
  62. "documentroot",
  63. &sysctl_khttpd_docroot,
  64. sizeof(sysctl_khttpd_docroot),
  65. 0644,
  66. NULL,
  67. proc_dostring,
  68. &sysctl_string,
  69. NULL,
  70. NULL,
  71. NULL
  72. },
  73. { NET_KHTTPD_STOP,
  74. "stop",
  75. &sysctl_khttpd_stop,
  76. sizeof(int),
  77. 0644,
  78. NULL,
  79. proc_dointvec,
  80. &sysctl_intvec,
  81. NULL,
  82. NULL,
  83. NULL
  84. },
  85. { NET_KHTTPD_START,
  86. "start",
  87. &sysctl_khttpd_start,
  88. sizeof(int),
  89. 0644,
  90. NULL,
  91. proc_dointvec,
  92. &sysctl_intvec,
  93. NULL,
  94. NULL,
  95. NULL
  96. },
  97. { NET_KHTTPD_UNLOAD,
  98. "unload",
  99. &sysctl_khttpd_unload,
  100. sizeof(int),
  101. 0644,
  102. NULL,
  103. proc_dointvec,
  104. &sysctl_intvec,
  105. NULL,
  106. NULL,
  107. NULL
  108. },
  109. { NET_KHTTPD_THREADS,
  110. "threads",
  111. &sysctl_khttpd_threads,
  112. sizeof(int),
  113. 0644,
  114. NULL,
  115. proc_dointvec,
  116. &sysctl_intvec,
  117. NULL,
  118. NULL,
  119. NULL
  120. },
  121. { NET_KHTTPD_MAXCONNECT,
  122. "maxconnect",
  123. &sysctl_khttpd_maxconnect,
  124. sizeof(int),
  125. 0644,
  126. NULL,
  127. proc_dointvec,
  128. &sysctl_intvec,
  129. NULL,
  130. NULL,
  131. NULL
  132. },
  133. { NET_KHTTPD_SLOPPYMIME,
  134. "sloppymime",
  135. &sysctl_khttpd_sloppymime,
  136. sizeof(int),
  137. 0644,
  138. NULL,
  139. proc_dointvec,
  140. &sysctl_intvec,
  141. NULL,
  142. NULL,
  143. NULL
  144. },
  145. { NET_KHTTPD_CLIENTPORT,
  146. "clientport",
  147. &sysctl_khttpd_clientport,
  148. sizeof(int),
  149. 0644,
  150. NULL,
  151. proc_dointvec,
  152. &sysctl_intvec,
  153. NULL,
  154. NULL,
  155. NULL
  156. },
  157. { NET_KHTTPD_PERMREQ,
  158. "perm_required",
  159. &sysctl_khttpd_permreq,
  160. sizeof(int),
  161. 0644,
  162. NULL,
  163. proc_dointvec,
  164. &sysctl_intvec,
  165. NULL,
  166. NULL,
  167. NULL
  168. },
  169. { NET_KHTTPD_PERMFORBID,
  170. "perm_forbid",
  171. &sysctl_khttpd_permforbid,
  172. sizeof(int),
  173. 0644,
  174. NULL,
  175. proc_dointvec,
  176. &sysctl_intvec,
  177. NULL,
  178. NULL,
  179. NULL
  180. },
  181. { NET_KHTTPD_LOGGING,
  182. "logging",
  183. &sysctl_khttpd_logging,
  184. sizeof(int),
  185. 0644,
  186. NULL,
  187. proc_dointvec,
  188. &sysctl_intvec,
  189. NULL,
  190. NULL,
  191. NULL
  192. },
  193. { NET_KHTTPD_SERVERPORT,
  194. "serverport",
  195. &sysctl_khttpd_serverport,
  196. sizeof(int),
  197. 0644,
  198. NULL,
  199. proc_dointvec,
  200. &sysctl_intvec,
  201. NULL,
  202. NULL,
  203. NULL
  204. },
  205. { NET_KHTTPD_DYNAMICSTRING,
  206. "dynamic",
  207. &sysctl_khttpd_dynamicstring,
  208. sizeof(sysctl_khttpd_dynamicstring),
  209. 0644,
  210. NULL,
  211. proc_dosecurestring,
  212. &sysctl_SecureString,
  213. NULL,
  214. NULL,
  215. NULL
  216. },
  217. {0,0,0,0,0,0,0,0,0,0,0} };
  218. static ctl_table khttpd_dir_table[] = {
  219. {NET_KHTTPD, "khttpd", NULL, 0, 0555, khttpd_table,0,0,0,0,0},
  220. {0,0,0,0,0,0,0,0,0,0,0}
  221. };
  222. static ctl_table khttpd_root_table[] = {
  223. {CTL_NET, "net", NULL, 0, 0555, khttpd_dir_table,0,0,0,0,0},
  224. {0,0,0,0,0,0,0,0,0,0,0}
  225. };
  226. void StartSysctl(void)
  227. {
  228. khttpd_table_header = register_sysctl_table(khttpd_root_table,1);
  229. }
  230. void EndSysctl(void)
  231. {
  232. unregister_sysctl_table(khttpd_table_header);
  233. }
  234. static int proc_dosecurestring(ctl_table *table, int write, struct file *filp,
  235.   void *buffer, size_t *lenp)
  236. {
  237. size_t len;
  238. char *p, c=0;
  239. char String[256];
  240. if ((table->data==0) || (table->maxlen==0) || (*lenp==0) ||
  241.     ((filp->f_pos!=0) && (write==0))) {
  242. *lenp = 0;
  243. return 0;
  244. }
  245. if (write!=0) {
  246. len = 0;
  247. p = buffer;
  248. while (len < *lenp) {
  249. if(get_user(c, p++))
  250. return -EFAULT;
  251. if (c == 0 || c == 'n')
  252. break;
  253. len++;
  254. }
  255. if (len >= table->maxlen)
  256. len = table->maxlen-1;
  257. if(copy_from_user(String, buffer,(unsigned long)len))
  258. return -EFAULT;
  259. ((char *) String)[len] = 0;
  260. filp->f_pos += *lenp;
  261. AddDynamicString(String);
  262. } else {
  263. GetSecureString(String);
  264. len = strlen(String);
  265. if (len > table->maxlen)
  266. len = table->maxlen;
  267. if (len > *lenp)
  268. len = *lenp;
  269. if (len!=0)
  270. if(copy_to_user(buffer, String,(unsigned long)len))
  271. return -EFAULT;
  272. if (len < *lenp) {
  273. if(put_user('n', ((char *) buffer) + len))
  274. return -EFAULT;
  275. len++;
  276. }
  277. *lenp = len;
  278. filp->f_pos += len;
  279. }
  280. return 0;
  281. }
  282. static int sysctl_SecureString (/*@unused@*/ctl_table *table, 
  283. /*@unused@*/int *name, 
  284. /*@unused@*/int nlen,
  285.    /*@unused@*/void *oldval, 
  286.    /*@unused@*/size_t *oldlenp,
  287.    /*@unused@*/void *newval, 
  288.    /*@unused@*/size_t newlen, 
  289.    /*@unused@*/void **context)
  290. {
  291. return -ENOSYS;
  292. }