login.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /* vi: set sw=4 ts=4: */
  2. /*
  3. * issue.c: issue printing code
  4. *
  5. * Copyright (C) 2003 Bastian Blank <waldi@tuxbox.org>
  6. *
  7. * Optimize and correcting OCRNL by Vladimir Oleynik <dzo@simtreas.ru>
  8. *
  9. * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  10. */
  11. #include "libbb.h"
  12. /* After libbb.h, since it needs sys/types.h on some systems */
  13. #include <sys/utsname.h>
  14. #define LOGIN " login: "
  15. static const char fmtstr_d[] ALIGN1 = "%A, %d %B %Y";
  16. static const char fmtstr_t[] ALIGN1 = "%H:%M:%S";
  17. void FAST_FUNC print_login_issue(const char *issue_file, const char *tty)
  18. {
  19. FILE *fp;
  20. int c;
  21. char buf[256+1];
  22. const char *outbuf;
  23. time_t t;
  24. struct utsname uts;
  25. time(&t);
  26. uname(&uts);
  27. puts("\r"); /* start a new line */
  28. fp = fopen_for_read(issue_file);
  29. if (!fp)
  30. return;
  31. while ((c = fgetc(fp)) != EOF) {
  32. outbuf = buf;
  33. buf[0] = c;
  34. buf[1] = '\0';
  35. if (c == '\n') {
  36. buf[1] = '\r';
  37. buf[2] = '\0';
  38. }
  39. if (c == '\\' || c == '%') {
  40. c = fgetc(fp);
  41. switch (c) {
  42. case 's':
  43. outbuf = uts.sysname;
  44. break;
  45. case 'n':
  46. case 'h':
  47. outbuf = uts.nodename;
  48. break;
  49. case 'r':
  50. outbuf = uts.release;
  51. break;
  52. case 'v':
  53. outbuf = uts.version;
  54. break;
  55. case 'm':
  56. outbuf = uts.machine;
  57. break;
  58. /* The field domainname of struct utsname is Linux specific. */
  59. #if defined(__linux__)
  60. case 'D':
  61. case 'o':
  62. outbuf = uts.domainname;
  63. break;
  64. #endif
  65. case 'd':
  66. strftime(buf, sizeof(buf), fmtstr_d, localtime(&t));
  67. break;
  68. case 't':
  69. strftime(buf, sizeof(buf), fmtstr_t, localtime(&t));
  70. break;
  71. case 'l':
  72. outbuf = tty;
  73. break;
  74. default:
  75. buf[0] = c;
  76. }
  77. }
  78. fputs(outbuf, stdout);
  79. }
  80. fclose(fp);
  81. fflush_all();
  82. }
  83. void FAST_FUNC print_login_prompt(void)
  84. {
  85. char *hostname = safe_gethostname();
  86. fputs(hostname, stdout);
  87. fputs(LOGIN, stdout);
  88. fflush_all();
  89. free(hostname);
  90. }
  91. /* Clear dangerous stuff, set PATH */
  92. static const char forbid[] ALIGN1 =
  93. "ENV" "\0"
  94. "BASH_ENV" "\0"
  95. "HOME" "\0"
  96. "IFS" "\0"
  97. "SHELL" "\0"
  98. "LD_LIBRARY_PATH" "\0"
  99. "LD_PRELOAD" "\0"
  100. "LD_TRACE_LOADED_OBJECTS" "\0"
  101. "LD_BIND_NOW" "\0"
  102. "LD_AOUT_LIBRARY_PATH" "\0"
  103. "LD_AOUT_PRELOAD" "\0"
  104. "LD_NOWARN" "\0"
  105. "LD_KEEPDIR" "\0";
  106. int FAST_FUNC sanitize_env_if_suid(void)
  107. {
  108. const char *p;
  109. if (getuid() == geteuid())
  110. return 0;
  111. p = forbid;
  112. do {
  113. unsetenv(p);
  114. p += strlen(p) + 1;
  115. } while (*p);
  116. putenv((char*)bb_PATH_root_path);
  117. return 1; /* we indeed were run by different user! */
  118. }