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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/fs/binfmt_script.c
  3.  *
  4.  *  Copyright (C) 1996  Martin von L鰓is
  5.  *  original #!-checking implemented by tytso.
  6.  */
  7. #include <linux/module.h>
  8. #include <linux/string.h>
  9. #include <linux/stat.h>
  10. #include <linux/slab.h>
  11. #include <linux/binfmts.h>
  12. #include <linux/init.h>
  13. #include <linux/file.h>
  14. #include <linux/smp_lock.h>
  15. static int load_script(struct linux_binprm *bprm,struct pt_regs *regs)
  16. {
  17. char *cp, *i_name, *i_arg;
  18. struct file *file;
  19. char interp[BINPRM_BUF_SIZE];
  20. int retval;
  21. if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || (bprm->sh_bang)) 
  22. return -ENOEXEC;
  23. /*
  24.  * This section does the #! interpretation.
  25.  * Sorta complicated, but hopefully it will work.  -TYT
  26.  */
  27. bprm->sh_bang++;
  28. allow_write_access(bprm->file);
  29. fput(bprm->file);
  30. bprm->file = NULL;
  31. bprm->buf[BINPRM_BUF_SIZE - 1] = '';
  32. if ((cp = strchr(bprm->buf, 'n')) == NULL)
  33. cp = bprm->buf+BINPRM_BUF_SIZE-1;
  34. *cp = '';
  35. while (cp > bprm->buf) {
  36. cp--;
  37. if ((*cp == ' ') || (*cp == 't'))
  38. *cp = '';
  39. else
  40. break;
  41. }
  42. for (cp = bprm->buf+2; (*cp == ' ') || (*cp == 't'); cp++);
  43. if (*cp == '') 
  44. return -ENOEXEC; /* No interpreter name found */
  45. i_name = cp;
  46. i_arg = 0;
  47. for ( ; *cp && (*cp != ' ') && (*cp != 't'); cp++)
  48. /* nothing */ ;
  49. while ((*cp == ' ') || (*cp == 't'))
  50. *cp++ = '';
  51. if (*cp)
  52. i_arg = cp;
  53. strcpy (interp, i_name);
  54. /*
  55.  * OK, we've parsed out the interpreter name and
  56.  * (optional) argument.
  57.  * Splice in (1) the interpreter's name for argv[0]
  58.  *           (2) (optional) argument to interpreter
  59.  *           (3) filename of shell script (replace argv[0])
  60.  *
  61.  * This is done in reverse order, because of how the
  62.  * user environment and arguments are stored.
  63.  */
  64. remove_arg_zero(bprm);
  65. retval = copy_strings_kernel(1, &bprm->filename, bprm);
  66. if (retval < 0) return retval; 
  67. bprm->argc++;
  68. if (i_arg) {
  69. retval = copy_strings_kernel(1, &i_arg, bprm);
  70. if (retval < 0) return retval; 
  71. bprm->argc++;
  72. }
  73. retval = copy_strings_kernel(1, &i_name, bprm);
  74. if (retval) return retval; 
  75. bprm->argc++;
  76. /*
  77.  * OK, now restart the process with the interpreter's dentry.
  78.  */
  79. file = open_exec(interp);
  80. if (IS_ERR(file))
  81. return PTR_ERR(file);
  82. bprm->file = file;
  83. retval = prepare_binprm(bprm);
  84. if (retval < 0)
  85. return retval;
  86. return search_binary_handler(bprm,regs);
  87. }
  88. struct linux_binfmt script_format = {
  89. NULL, THIS_MODULE, load_script, NULL, NULL, 0
  90. };
  91. static int __init init_script_binfmt(void)
  92. {
  93. return register_binfmt(&script_format);
  94. }
  95. static void __exit exit_script_binfmt(void)
  96. {
  97. unregister_binfmt(&script_format);
  98. }
  99. module_init(init_script_binfmt)
  100. module_exit(exit_script_binfmt)