You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
1.3 KiB

  1. #include <my_global.h>
  2. #include <m_string.h>
  3. #include <my_sys.h>
  4. #include <my_pthread.h>
  5. #ifdef HAVE_PWD_H
  6. #include <pwd.h>
  7. #endif
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. void my_exit(int c)
  11. {
  12. my_end(0);
  13. exit(c);
  14. }
  15. void do_usage()
  16. {
  17. printf("Usage:\n"
  18. " %s <user> log <filename>\n"
  19. " %s <user> exec <command> <args>\n",
  20. my_progname, my_progname);
  21. my_exit(1);
  22. }
  23. void do_log(const char *logfile)
  24. {
  25. FILE *f;
  26. uchar buf[4096];
  27. int size;
  28. if (!logfile)
  29. do_usage();
  30. f= my_fopen(logfile, O_WRONLY|O_APPEND|O_CREAT, MYF(MY_WME));
  31. if (!f)
  32. my_exit(1);
  33. while ((size= my_fread(stdin, buf, sizeof(buf), MYF(MY_WME))) > 0)
  34. if ((int)my_fwrite(f, buf, size, MYF(MY_WME)) != size)
  35. my_exit(1);
  36. my_fclose(f, MYF(0));
  37. my_exit(0);
  38. }
  39. void do_exec(char *args[])
  40. {
  41. if (!args[0])
  42. do_usage();
  43. my_end(0);
  44. execvp(args[0], args);
  45. }
  46. int main(int argc, char *argv[])
  47. {
  48. struct passwd *user_info;
  49. MY_INIT(argv[0]);
  50. if (argc < 3)
  51. do_usage(argv[0]);
  52. user_info= my_check_user(argv[1], MYF(0));
  53. if (user_info ? my_set_user(argv[1], user_info, MYF(MY_WME))
  54. : my_errno == EINVAL)
  55. my_exit(1);
  56. if (strcmp(argv[2], "log") == 0)
  57. do_log(argv[3]);
  58. if (strcmp(argv[2], "exec") == 0)
  59. do_exec(argv+3);
  60. my_end(0);
  61. return 1;
  62. }