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

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2.  * bigfile              -- 'big file' simple compress replacement
  3.  * 
  4.  * A part of BBS Express Project/Firebird BBS 3.0 Project
  5.  * 
  6.  * Copyright (c) 1999, Edward Ping-Da Chuang <edwardc@firebird.dhs.org> 
  7.  * of BBS Express Project, All rights reserved.
  8.  * 
  9.  * Redistribution and use in source and binary forms, with or without
  10.  * modification, are permitted provided that the following conditions are
  11.  * met: 1. Redistributions of source code must retain the above copyright
  12.  * notice, this list of conditions and the following disclaimer. 2.
  13.  * Redistributions in binary form must reproduce the above copyright notice,
  14.  * this list of conditions and the following disclaimer in the documentation
  15.  * and/or other materials provided with the distribution.
  16.  * 
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
  18.  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  19.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  20.  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
  21.  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  23.  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  24.  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  25.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  26.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  27.  * SUCH DAMAGE.
  28.  * 
  29.  * CVS: $Id: bigfile.c,v 1.1 2000/01/15 01:45:32 edwardc Exp $
  30.  */
  31. char            bigfile_c[] =
  32. "$Id: bigfile.c,v 1.1 2000/01/15 01:45:32 edwardc Exp $";
  33. #include <stdio.h>
  34. #include <sys/stat.h>
  35. #define VERSION         "0.1"
  36. #define LINECTRL        31
  37. int
  38. pushin(char *fname, char *dir, char *output)
  39. {
  40. struct stat     st;
  41. FILE           *fp, *fp2;
  42. char            buf[1025];
  43. if (!(stat(fname, &st) == 0 && S_ISREG(st.st_mode)))
  44. return 2;
  45. fp = fopen(output, "a");
  46. fp2 = fopen(fname, "r");
  47. if (fp == NULL || fp2 == NULL)
  48. return 3;
  49. fprintf(fp, ">%s:%s:<%cn", dir, fname, LINECTRL);
  50. while (fgets(buf, 1024, fp2) != NULL)
  51. fputs(buf, fp);
  52. if (buf[strlen(buf) - 1] != 'n')
  53. fputs("n", fp);
  54. fclose(fp);
  55. fclose(fp2);
  56. }
  57. char           *
  58. stringtoken(char *string, char tag, int *log)
  59. {
  60. int             i, j;
  61. char           *result;
  62. result = (char *) malloc(256);
  63. j = 0;
  64. for (i = *log;; i++) {
  65. if (i == strlen(string))
  66. break;
  67. if (string[i] == tag)
  68. break;
  69. result[j] = string[i];
  70. j++;
  71. }
  72. *log = i + 1;
  73. return ((char *) result);
  74. }
  75. void
  76. getit(char *buf, char **x, char **y)
  77. {
  78. int             i;
  79. buf++;
  80. i = 0;
  81. *x = stringtoken(buf, ':', &i);
  82. *y = stringtoken(buf, ':', &i);
  83. }
  84. int
  85. dump(char *bfile)
  86. {
  87. FILE           *fin, *fout;
  88. char            buf[1025], xx[80], *filename, *dir;
  89. int             locked = 0, size;
  90. fin = fopen(bfile, "r");
  91. if (fin == NULL)
  92. return 1;
  93. locked = 1;
  94. while (fgets(buf, 1024, fin) != NULL) {
  95. if (buf[0] == '>' && buf[strlen(buf) - 3] == '<' && buf[strlen(buf) - 2] == '37') {
  96. if (locked == 1) {
  97. locked = 2;
  98. getit(buf, &dir, &filename);
  99. sprintf(xx, "mkdir -p %s", dir);
  100. system(xx);
  101. sprintf(xx, "%s/%s", dir, filename);
  102. size = 0;
  103. fout = fopen(xx, "w");
  104. } else {
  105. fclose(fout);
  106. #ifdef _DEBUG
  107. printf("%s dumped, size: %d bytesn", filename, size);
  108. #endif
  109. locked = 2;
  110. getit(buf, &dir, &filename);
  111. sprintf(xx, "mkdir -p %s", dir);
  112. system(xx);
  113. sprintf(xx, "%s/%s", dir, filename);
  114. size = 0;
  115. fout = fopen(xx, "w");
  116. }
  117. continue;
  118. }
  119. fputs(buf, fout);
  120. size += (int) strlen(buf);
  121. }
  122. fclose(fin);
  123. if (fout != NULL) {
  124. fclose(fout);
  125. #ifdef _DEBUG
  126. printf("%s dumped, size: %d bytesn", filename, size);
  127. #endif
  128. }
  129. printf("all file dumped.n");
  130. }
  131. #ifdef  _HAVE_MAIN
  132. int
  133. main(int argc, char **argv)
  134. {
  135. if (!strcmp(argv[1], "put")) {
  136. pushin("bbsnnrp.txt", "test", argv[2]);
  137. pushin("rfc977.txt", "test", argv[2]);
  138. pushin("tv.txt", "test", argv[2]);
  139. pushin("DEADJOE", "test", argv[2]);
  140. } else {
  141. dump(argv[2]);
  142. }
  143. }
  144. #endif