fileshm.c
上传用户:minyiyu
上传日期:2018-12-24
资源大小:864k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2. $Id: fileshm.c,v 1.1 2000/01/15 01:45:28 edwardc Exp $
  3. */
  4. #include "bbs.h"
  5. struct FILESHM {
  6. char    line[FILE_MAXLINE][FILE_BUFSIZE];
  7. int     fileline;
  8. int     max;
  9. time_t  update;
  10. };
  11. struct STATSHM {
  12. char    line[FILE_MAXLINE][FILE_BUFSIZE];
  13. time_t  update;
  14. };
  15. struct FILESHM *welcomeshm;
  16. struct FILESHM *goodbyeshm;
  17. struct FILESHM *issueshm;
  18. struct STATSHM *statshm;
  19. int
  20. fill_shmfile(mode, fname, shmkey)
  21. int     mode;
  22. char   *shmkey, *fname;
  23. {
  24. FILE   *fffd;
  25. char   *ptr;
  26. char    buf[FILE_BUFSIZE];
  27. struct stat st;
  28. time_t  ftime, now;
  29. int     lines = 0, nowfn = 0, maxnum;
  30. struct FILESHM *tmp;
  31. switch (mode) {
  32. case 1:
  33. maxnum = MAX_ISSUE;
  34. break;
  35. case 2:
  36. maxnum = MAX_GOODBYE;
  37. break;
  38. case 3:
  39. maxnum = MAX_WELCOME;
  40. break;
  41. }
  42. now = time(0);
  43. if (stat(fname, &st) < 0) {
  44. return 0;
  45. }
  46. ftime = st.st_mtime;
  47. tmp = (void *) attach_shm(shmkey, 5000 + mode * 10, sizeof(struct FILESHM) * maxnum);
  48. switch (mode) {
  49. case 1:
  50. issueshm = tmp;
  51. break;
  52. case 2:
  53. goodbyeshm = tmp;
  54. break;
  55. case 3:
  56. welcomeshm = tmp;
  57. break;
  58. }
  59. if (abs(now - tmp[0].update) < 86400 && ftime < tmp[0].update) {
  60. return 1;
  61. }
  62. if ((fffd = fopen(fname, "r")) == NULL) {
  63. return 0;
  64. }
  65. while ((fgets(buf, FILE_BUFSIZE, fffd) != NULL) && nowfn < maxnum) {
  66. if (lines > FILE_MAXLINE)
  67. continue;
  68. if (strstr(buf, "@logout@") || strstr(buf, "@login@")) {
  69. tmp[nowfn].fileline = lines;
  70. tmp[nowfn].update = now;
  71. nowfn++;
  72. lines = 0;
  73. continue;
  74. }
  75. ptr = tmp[nowfn].line[lines];
  76. memcpy(ptr, buf, sizeof(buf));
  77. lines++;
  78. }
  79. fclose(fffd);
  80. tmp[nowfn].fileline = lines;
  81. tmp[nowfn].update = now;
  82. nowfn++;
  83. tmp[0].max = nowfn;
  84. return 1;
  85. }
  86. int
  87. fill_statshmfile(fname, mode)
  88. char   *fname;
  89. int     mode;
  90. {
  91. FILE   *fp;
  92. time_t  ftime;
  93. char   *ptr;
  94. char    buf[FILE_BUFSIZE];
  95. struct stat st;
  96. time_t  now;
  97. int     lines = 0;
  98. if (stat(fname, &st) < 0) {
  99. return 0;
  100. }
  101. ftime = st.st_mtime;
  102. now = time(0);
  103. if (mode == 0) {
  104. statshm = (void *) attach_shm("STAT_SHMKEY", 5100, sizeof(struct STATSHM) * 2);
  105. }
  106. if (abs(now - statshm[mode].update) < 86400 && ftime < statshm[mode].update) {
  107. return 1;
  108. }
  109. if ((fp = fopen(fname, "r")) == NULL) {
  110. return 0;
  111. }
  112. while ((fgets(buf, FILE_BUFSIZE, fp) != NULL) && lines < FILE_MAXLINE) {
  113. ptr = statshm[mode].line[lines];
  114. memcpy(ptr, buf, sizeof(buf));
  115. lines++;
  116. }
  117. fclose(fp);
  118. statshm[mode].update = now;
  119. return 1;
  120. }
  121. void
  122. show_shmfile(fh)
  123. struct FILESHM *fh;
  124. {
  125. int     i;
  126. char    buf[FILE_BUFSIZE];
  127. for (i = 0; i < fh->fileline; i++) {
  128. strcpy(buf, fh->line[i]);
  129. showstuff(buf, 0);
  130. }
  131. }
  132. int
  133. show_statshm(char *fname, int mode)
  134. {
  135. int     i;
  136. char    buf[FILE_BUFSIZE];
  137. if (fill_statshmfile(fname, mode)) {
  138. if ((mode == 0 && DEFINE(DEF_GRAPH)) || (mode == 1 && DEFINE(DEF_TOP10))) {
  139. clear();
  140. for (i = 0; i <= 24; i++) {
  141. if (statshm[mode].line[i] == NULL)
  142. break;
  143. strcpy(buf, statshm[mode].line[i]);
  144. prints(buf);
  145. }
  146. }
  147. if (mode == 1)
  148. shmdt(statshm);
  149. return 1;
  150. }
  151. return 0;
  152. }
  153. void
  154. show_goodbyeshm()
  155. {
  156. int     logouts;
  157. logouts = goodbyeshm[0].max;
  158. clear();
  159. show_shmfile(&goodbyeshm[(currentuser.numlogins % ((logouts <= 1) ? 1 : logouts))]);
  160. shmdt(goodbyeshm);
  161. }
  162. void
  163. show_welcomeshm()
  164. {
  165. int     welcomes;
  166. welcomes = welcomeshm[0].max;
  167. clear();
  168. show_shmfile(&welcomeshm[(currentuser.numlogins % ((welcomes <= 1) ? 1 : welcomes))]);
  169. if (DEFINE(DEF_TOP10))
  170. pressanykey();
  171. shmdt(welcomeshm);
  172. }
  173. void
  174. show_issue()
  175. {
  176. int     issues = issueshm[0].max;
  177. show_shmfile(&issueshm[(issues <= 1) ? 0 :
  178. ((time(0) / 86400) % (issues))]);
  179. shmdt(issueshm);
  180. }