syslog.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include <u.h>
  2. #include <libc.h>
  3. static struct
  4. {
  5. int fd;
  6. int consfd;
  7. char *name;
  8. Dir *d;
  9. Dir *consd;
  10. Lock;
  11. } sl =
  12. {
  13. -1, -1,
  14. };
  15. static void
  16. _syslogopen(void)
  17. {
  18. char buf[1024];
  19. if(sl.fd >= 0)
  20. close(sl.fd);
  21. snprint(buf, sizeof(buf), "/sys/log/%s", sl.name);
  22. sl.fd = open(buf, OWRITE|OCEXEC);
  23. }
  24. /*
  25. * Print
  26. * sysname: time: mesg
  27. * on /sys/log/logname.
  28. * If cons or log file can't be opened, print on the system console, too.
  29. */
  30. void
  31. syslog(int cons, char *logname, char *fmt, ...)
  32. {
  33. char buf[1024];
  34. char *ctim, *p;
  35. va_list arg;
  36. int n;
  37. Dir *d;
  38. char err[ERRMAX];
  39. err[0] = '\0';
  40. errstr(err, sizeof err);
  41. lock(&sl);
  42. /*
  43. * paranoia makes us stat to make sure a fork+close
  44. * hasn't broken our fd's
  45. */
  46. d = dirfstat(sl.fd);
  47. if(sl.fd < 0
  48. || sl.name == nil
  49. || strcmp(sl.name, logname)!=0
  50. || sl.d == nil
  51. || d == nil
  52. || d->dev != sl.d->dev
  53. || d->type != sl.d->type
  54. || d->qid.path != sl.d->qid.path){
  55. free(sl.name);
  56. sl.name = strdup(logname);
  57. if(sl.name == nil)
  58. cons = 1;
  59. else{
  60. _syslogopen();
  61. if(sl.fd < 0)
  62. cons = 1;
  63. free(sl.d);
  64. sl.d = d;
  65. d = nil; /* don't free it */
  66. }
  67. }
  68. free(d);
  69. if(cons){
  70. d = dirfstat(sl.consfd);
  71. if(sl.consfd < 0
  72. || d == nil
  73. || sl.consd == nil
  74. || d->dev != sl.consd->dev
  75. || d->type != sl.consd->type
  76. || d->qid.path != sl.consd->qid.path){
  77. sl.consfd = open("#c/cons", OWRITE|OCEXEC);
  78. free(sl.consd);
  79. sl.consd = d;
  80. d = nil; /* don't free it */
  81. }
  82. free(d);
  83. }
  84. if(fmt == nil){
  85. unlock(&sl);
  86. return;
  87. }
  88. ctim = ctime(time(0));
  89. werrstr(err);
  90. p = buf + snprint(buf, sizeof(buf)-1, "%s ", sysname());
  91. strncpy(p, ctim+4, 15);
  92. p += 15;
  93. *p++ = ' ';
  94. va_start(arg, fmt);
  95. p = vseprint(p, buf+sizeof(buf)-1, fmt, arg);
  96. va_end(arg);
  97. *p++ = '\n';
  98. n = p - buf;
  99. if(sl.fd >= 0){
  100. seek(sl.fd, 0, 2);
  101. write(sl.fd, buf, n);
  102. }
  103. if(cons && sl.consfd >=0)
  104. write(sl.consfd, buf, n);
  105. unlock(&sl);
  106. }