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

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2.     Pirate Bulletin Board System
  3.     Copyright (C) 1990, Edward Luke, lush@Athena.EE.MsState.EDU
  4.     Eagles Bulletin Board System
  5.     Copyright (C) 1992, Raymond Rocker, rocker@rock.b11.ingr.com
  6.                         Guy Vega, gtvega@seabass.st.usm.edu
  7.                         Dominic Tynes, dbtynes@seabass.st.usm.edu
  8.     Firebird Bulletin Board System
  9.     Copyright (C) 1996, Hsien-Tsung Chang, Smallpig.bbs@bbs.cs.ccu.edu.tw
  10.                         Peng Piaw Foong, ppfoong@csie.ncu.edu.tw
  11.     This program is free software; you can redistribute it and/or modify
  12.     it under the terms of the GNU General Public License as published by
  13.     the Free Software Foundation; either version 1, or (at your option)
  14.     any later version.
  15.     This program is distributed in the hope that it will be useful,
  16.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.     GNU General Public License for more details.
  19. */
  20. /*
  21. $Id: thread.c,v 1.1 2000/01/15 01:45:29 edwardc Exp $
  22. */
  23. #include "bbs.h"
  24. char    tname[STRLEN];
  25. char    fname[STRLEN];
  26. struct postnode {
  27. int     num;
  28. struct postnode *next;
  29. };
  30. struct titlenode {
  31. char   *title;
  32. struct titlenode *next;
  33. struct postnode *post;
  34. };
  35. struct titlenode toptitle;
  36. int
  37. report()
  38. {
  39. }
  40. int
  41. thread(post, num)
  42. struct fileheader *post;
  43. int     num;
  44. {
  45. struct titlenode *tmp;
  46. char   *ntitle;
  47. tmp = &toptitle;
  48. if (post->title[0] == 'R' && post->title[1] == 'e' && post->title[2] == ':')
  49. ntitle = post->title + 4;
  50. else
  51. ntitle = post->title;
  52. while (1) {
  53. if (tmp->next == NULL) {
  54. struct titlenode *titletmp;
  55. titletmp = (struct titlenode *) malloc(sizeof(struct titlenode));
  56. titletmp->title = malloc(sizeof(char) * (strlen(ntitle) + 1));
  57. strcpy(titletmp->title, ntitle);
  58. titletmp->post = NULL;
  59. titletmp->next = NULL;
  60. tmp->next = titletmp;
  61. }
  62. if (!strcmp(tmp->next->title, ntitle)) {
  63. struct postnode *tmppost, *first = tmp->next->post;
  64. if (first == NULL) {
  65. tmppost = (struct postnode *) malloc(sizeof(struct postnode));
  66. tmppost->num = num;
  67. tmppost->next = NULL;
  68. tmp->next->post = tmppost;
  69. return;
  70. }
  71. while (1) {
  72. if (first->next == NULL) {
  73. tmppost = (struct postnode *) malloc(sizeof(struct postnode));
  74. tmppost->num = num;
  75. tmppost->next = NULL;
  76. first->next = tmppost;
  77. return;
  78. }
  79. first = first->next;
  80. }
  81. } else {
  82. tmp = tmp->next;
  83. }
  84. }
  85. }
  86. int
  87. visit_all()
  88. {
  89. struct titlenode *tmp;
  90. struct fileheader post;
  91. int     i = 0;
  92. tmp = toptitle.next;
  93. while (tmp) {
  94. struct postnode *tmppost;
  95. i++;
  96. tmppost = tmp->post;
  97. while (tmppost) {
  98. get_record(fname, &post, sizeof(post), tmppost->num);
  99. append_record(tname, &post, sizeof(post));
  100. tmppost = tmppost->next;
  101. }
  102. tmp = tmp->next;
  103. }
  104. }
  105. int
  106. main(argc, argv)
  107. char   *argv[];
  108. int     argc;
  109. {
  110. FILE   *tf;
  111. int     i = 0;
  112. struct fileheader post;
  113. char    dname[STRLEN];
  114. char    buf[256];
  115. struct stat st1, st2;
  116. sprintf(dname, "boards/%s/%s", argv[1], DOT_DIR);
  117. sprintf(fname, "boards/%s/%s2", argv[1], DOT_DIR);
  118. sprintf(tname, "boards/%s/%s", argv[1], THREAD_DIR);
  119. if (stat(dname, &st1) == -1)
  120. return;
  121. if (stat(tname, &st2) != -1) {
  122. if (st2.st_mtime >= st1.st_mtime)
  123. return;
  124. }
  125. unlink(tname);
  126. sprintf(buf, "cp %s %s", dname, fname);
  127. system(buf);
  128. if ((tf = fopen(fname, "rb")) == NULL) {
  129. printf(".DIR cant open...");
  130. return;
  131. }
  132. toptitle.next = NULL;
  133. toptitle.post = NULL;
  134. while (1) {
  135. i++;
  136. if (fread(&post, sizeof(post), 1, tf) <= 0)
  137. break;
  138. thread(&post, i);
  139. }
  140. visit_all();
  141. fclose(tf);
  142. unlink(fname);
  143. }