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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * mf_proc.c
  3.  * Copyright (C) 2001 Kyle A. Lucke  IBM Corporation
  4.  * 
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  * 
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  18.  */
  19. /* Change Activity: */
  20. /* End Change Activity */
  21. #ifndef _MF_PROC_H
  22. #include <asm/iSeries/mf_proc.h>
  23. #endif
  24. #ifndef MF_H_INCLUDED
  25. #include <asm/iSeries/mf.h>
  26. #endif
  27. #include <asm/uaccess.h>
  28. static struct proc_dir_entry *mf_proc_root = NULL;
  29. int proc_mf_dump_cmdline
  30. (char *page, char **start, off_t off, int count, int *eof, void *data);
  31. int proc_mf_dump_vmlinux
  32. (char *page, char **start, off_t off, int count, int *eof, void *data);
  33. int proc_mf_dump_side
  34. (char *page, char **start, off_t off, int count, int *eof, void *data);
  35. int proc_mf_change_side
  36. (struct file *file, const char *buffer, unsigned long count, void *data);
  37. int proc_mf_dump_src
  38. (char *page, char **start, off_t off, int count, int *eof, void *data);
  39. int proc_mf_change_src (struct file *file, const char *buffer, unsigned long count, void *data);
  40. int proc_mf_change_cmdline(struct file *file, const char *buffer, unsigned long count, void *data);
  41. int proc_mf_change_vmlinux(struct file *file, const char *buffer, unsigned long count, void *data);
  42. void mf_proc_init(struct proc_dir_entry *iSeries_proc)
  43. {
  44. struct proc_dir_entry *ent = NULL;
  45. struct proc_dir_entry *mf_a = NULL;
  46. struct proc_dir_entry *mf_b = NULL;
  47. struct proc_dir_entry *mf_c = NULL;
  48. struct proc_dir_entry *mf_d = NULL;
  49. mf_proc_root = proc_mkdir("mf", iSeries_proc);
  50. if (!mf_proc_root) return;
  51. mf_a = proc_mkdir("A", mf_proc_root);
  52. if (!mf_a) return;
  53. ent = create_proc_entry("cmdline", S_IFREG|S_IRUSR|S_IWUSR, mf_a);
  54. if (!ent) return;
  55. ent->nlink = 1;
  56. ent->data = (void *)0;
  57. ent->read_proc = proc_mf_dump_cmdline;
  58. ent->write_proc = proc_mf_change_cmdline;
  59. ent = create_proc_entry("vmlinux", S_IFREG|S_IWUSR, mf_a);
  60. if (!ent) return;
  61. ent->nlink = 1;
  62. ent->data = (void *)0;
  63. ent->write_proc = proc_mf_change_vmlinux;
  64. ent->read_proc = NULL;
  65. mf_b = proc_mkdir("B", mf_proc_root);
  66. if (!mf_b) return;
  67. ent = create_proc_entry("cmdline", S_IFREG|S_IRUSR|S_IWUSR, mf_b);
  68. if (!ent) return;
  69. ent->nlink = 1;
  70. ent->data = (void *)1;
  71. ent->read_proc = proc_mf_dump_cmdline;
  72. ent->write_proc = proc_mf_change_cmdline;
  73. ent = create_proc_entry("vmlinux", S_IFREG|S_IWUSR, mf_b);
  74. if (!ent) return;
  75. ent->nlink = 1;
  76. ent->data = (void *)1;
  77. ent->write_proc = proc_mf_change_vmlinux;
  78. ent->read_proc = NULL;
  79. mf_c = proc_mkdir("C", mf_proc_root);
  80. if (!mf_c) return;
  81. ent = create_proc_entry("cmdline", S_IFREG|S_IRUSR|S_IWUSR, mf_c);
  82. if (!ent) return;
  83. ent->nlink = 1;
  84. ent->data = (void *)2;
  85. ent->read_proc = proc_mf_dump_cmdline;
  86. ent->write_proc = proc_mf_change_cmdline;
  87. ent = create_proc_entry("vmlinux", S_IFREG|S_IWUSR, mf_c);
  88. if (!ent) return;
  89. ent->nlink = 1;
  90. ent->data = (void *)2;
  91. ent->write_proc = proc_mf_change_vmlinux;
  92. ent->read_proc = NULL;
  93. mf_d = proc_mkdir("D", mf_proc_root);
  94. if (!mf_d) return;
  95. ent = create_proc_entry("cmdline", S_IFREG|S_IRUSR|S_IWUSR, mf_d);
  96. if (!ent) return;
  97. ent->nlink = 1;
  98. ent->data = (void *)3;
  99. ent->read_proc = proc_mf_dump_cmdline;
  100. ent->write_proc = proc_mf_change_cmdline;
  101. #if 0
  102. ent = create_proc_entry("vmlinux", S_IFREG|S_IRUSR, mf_d);
  103. if (!ent) return;
  104. ent->nlink = 1;
  105. ent->data = (void *)3;
  106. ent->read_proc = proc_mf_dump_vmlinux;
  107. ent->write_proc = NULL;
  108. #endif
  109. ent = create_proc_entry("side", S_IFREG|S_IRUSR|S_IWUSR, mf_proc_root);
  110. if (!ent) return;
  111. ent->nlink = 1;
  112. ent->data = (void *)0;
  113. ent->read_proc = proc_mf_dump_side;
  114. ent->write_proc = proc_mf_change_side;
  115. ent = create_proc_entry("src", S_IFREG|S_IRUSR|S_IWUSR, mf_proc_root);
  116. if (!ent) return;
  117. ent->nlink = 1;
  118. ent->data = (void *)0;
  119. ent->read_proc = proc_mf_dump_src;
  120. ent->write_proc = proc_mf_change_src;
  121. }
  122. int proc_mf_dump_cmdline
  123. (char *page, char **start, off_t off, int count, int *eof, void *data)
  124. {
  125. int len = count;
  126. char *p;
  127.     
  128. len = mf_getCmdLine(page, &len, (u64)data);
  129.    
  130. p = page + len - 1;
  131. while ( p > page ) {
  132. if ( (*p == 0) || (*p == ' ') )
  133. --p;
  134. else
  135. break;
  136. }
  137. if ( *p != 'n' ) {
  138. ++p;
  139. *p = 'n';
  140. }
  141. ++p;
  142. *p = 0;
  143. len = p - page;
  144.     
  145. len -= off;
  146. if (len < count) {
  147. *eof = 1;
  148. if (len <= 0)
  149. return 0;
  150. } else
  151. len = count;
  152. *start = page + off;
  153. return len;
  154. }
  155. int proc_mf_dump_vmlinux
  156. (char *page, char **start, off_t off, int count, int *eof, void *data)
  157. {
  158. int sizeToGet = count;
  159. if (!capable(CAP_SYS_ADMIN))
  160. return -EACCES;
  161. if (mf_getVmlinuxChunk(page, &sizeToGet, off, (u64)data) == 0)
  162. {
  163. if (sizeToGet != 0)
  164. {
  165. *start = page + off;
  166. return sizeToGet;
  167. } else {
  168. *eof = 1;
  169. return 0;
  170. }
  171. } else {
  172. *eof = 1;
  173. return 0;
  174. }
  175. }
  176. int proc_mf_dump_side
  177. (char *page, char **start, off_t off, int count, int *eof, void *data)
  178. {
  179. int len = 0;
  180. char mf_current_side = mf_getSide();
  181. len = sprintf(page, "%cn", mf_current_side);
  182. if (len <= off+count) *eof = 1;
  183. *start = page + off;
  184. len -= off;
  185. if (len>count) len = count;
  186. if (len<0) len = 0;
  187. return len;
  188. }
  189. int proc_mf_change_side(struct file *file, const char *buffer, unsigned long count, void *data)
  190. {
  191. if (!capable(CAP_SYS_ADMIN))
  192. return -EACCES;
  193. if ((*buffer != 'A') &&
  194.     (*buffer != 'B') &&
  195.     (*buffer != 'C') &&
  196.     (*buffer != 'D'))
  197. {
  198. printk(KERN_ERR "mf_proc.c: proc_mf_change_side: invalid siden");
  199. return -EINVAL;
  200. }
  201. mf_setSide(*buffer);
  202. return count;
  203. }
  204. int proc_mf_dump_src
  205. (char *page, char **start, off_t off, int count, int *eof, void *data)
  206. {
  207. int len = 0;
  208. mf_getSrcHistory(page, count);
  209. len = count;
  210. len -= off;
  211. if (len < count) {
  212. *eof = 1;
  213. if (len <= 0)
  214. return 0;
  215. } else
  216. len = count;
  217. *start = page + off;
  218. return len;
  219. }
  220. int proc_mf_change_src(struct file *file, const char *buffer, unsigned long count, void *data)
  221. {
  222. if (!capable(CAP_SYS_ADMIN))
  223. return -EACCES;
  224. if ((count < 4) && (count != 1))
  225. {
  226. printk(KERN_ERR "mf_proc: invalid srcn");
  227. return -EINVAL;
  228. }
  229. if ((count == 1) && ((*buffer) == ''))
  230. {
  231. mf_clearSrc();
  232. } else {
  233. mf_displaySrc(*(u32 *)buffer);
  234. }
  235. return count;
  236. }
  237. int proc_mf_change_cmdline(struct file *file, const char *buffer, unsigned long count, void *data)
  238. {
  239. if (!capable(CAP_SYS_ADMIN))
  240. return -EACCES;
  241. mf_setCmdLine(buffer, count, (u64)data);
  242. return count;
  243. }
  244. int proc_mf_change_vmlinux(struct file *file, const char *buffer, unsigned long count, void *data)
  245. {
  246. if (!capable(CAP_SYS_ADMIN))
  247. return -EACCES;
  248. mf_setVmlinuxChunk(buffer, count, file->f_pos, (u64)data);
  249. file->f_pos += count;
  250. return count;
  251. }