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

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2.  * fileio.c -- some stuff that file/io related
  3.  *
  4.  * of SEEDNetBBS generation 1 (libtool implement)
  5.  *
  6.  * Copyright (c) 1999, Edward Ping-Da Chuang <edwardc@edwardc.dhs.org>
  7.  * 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
  11.  * are met:
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in the
  16.  *    documentation and/or other materials provided with the distribution.
  17.  *
  18.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  19.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  20.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  21.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  22.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  23.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  24.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  25.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  26.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  27.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  28.  * SUCH DAMAGE.
  29.  *
  30.  * CVS: $Id: fileio.c,v 1.1 2000/01/15 01:45:26 edwardc Exp $
  31.  */
  32. #ifdef BBS
  33. #include "bbs.h"
  34. #else
  35. #include <stdio.h>
  36. #include <stdlib.h>
  37. #include <fcntl.h>
  38. #include <sys/stat.h>
  39. #include <dirent.h>
  40. #endif
  41. char    fileio_c[] =
  42. "$Id: fileio.c,v 1.1 2000/01/15 01:45:26 edwardc Exp $";
  43. #define        BLK_SIZ         4096
  44. static int rm_dir();
  45. void
  46. file_append(fpath, msg)
  47. char   *fpath;
  48. char   *msg;
  49. {
  50. int     fd;
  51. if ((fd = open(fpath, O_WRONLY | O_CREAT | O_APPEND, 0644)) > 0) {
  52. write(fd, msg, strlen(msg));
  53. close(fd);
  54. }
  55. }
  56. int
  57. dashf(char *fname)
  58. {
  59. struct stat st;
  60. return (stat(fname, &st) == 0 && S_ISREG(st.st_mode));
  61. }
  62. int
  63. dashd(char *fname)
  64. {
  65. struct stat st;
  66. return (stat(fname, &st) == 0 && S_ISDIR(st.st_mode));
  67. }
  68. /* mode == O_EXCL / O_APPEND / O_TRUNC */
  69. int
  70. f_cp(char *src, char *dst, int mode)
  71. {
  72. int     fsrc, fdst, ret;
  73. ret = 0;
  74. if ((fsrc = open(src, O_RDONLY)) >= 0) {
  75. ret = -1;
  76. if ((fdst = open(dst, O_WRONLY | O_CREAT | mode, 0600)) >= 0) {
  77. char    pool[BLK_SIZ];
  78. src = pool;
  79. do {
  80. ret = read(fsrc, src, BLK_SIZ);
  81. if (ret <= 0)
  82. break;
  83. } while (write(fdst, src, ret) > 0);
  84. close(fdst);
  85. }
  86. close(fsrc);
  87. }
  88. return ret;
  89. }
  90. int
  91. valid_fname(char *str)
  92. {
  93. char    ch;
  94. while ((ch = *str++) != '') {
  95. if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') ||
  96. strchr("0123456789-_", ch) != 0) {
  97. ;
  98. } else {
  99. return 0;
  100. }
  101. }
  102. return 1;
  103. }
  104. int
  105. touchfile(char *filename)
  106. {
  107. int     fd;
  108. if ((fd = open(filename, O_RDWR | O_CREAT, 0600)) > 0)
  109. close(fd);
  110. return fd;
  111. }
  112. int
  113. f_rm(char *fpath)
  114. {
  115. struct stat st;
  116. if (stat(fpath, &st))
  117. return -1;
  118. if (!S_ISDIR(st.st_mode))
  119. return unlink(fpath);
  120. return rm_dir(fpath);
  121. }
  122. static int
  123. rm_dir(char *fpath)
  124. {
  125. struct stat st;
  126. DIR    *dirp;
  127. struct dirent *de;
  128. char    buf[256], *fname;
  129. if (!(dirp = opendir(fpath)))
  130. return -1;
  131. for (fname = buf; *fname = *fpath; fname++, fpath++);
  132. *fname++ = '/';
  133. readdir(dirp);
  134. readdir(dirp);
  135. while (de = readdir(dirp)) {
  136. fpath = de->d_name;
  137. if (*fpath) {
  138. strcpy(fname, fpath);
  139. if (!stat(buf, &st)) {
  140. if (S_ISDIR(st.st_mode))
  141. rm_dir(buf);
  142. else
  143. unlink(buf);
  144. }
  145. }
  146. }
  147. closedir(dirp);
  148. *--fname = '';
  149. return rmdir(buf);
  150. }