io.h
上传用户:pycemail
上传日期:2007-01-04
资源大小:329k
文件大小:4k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. /*
  2.  * ProFTPD - FTP server daemon
  3.  * Copyright (c) 1997, 1998 Public Flood Software
  4.  *  
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
  18.  */
  19. /* Connection streams, ring-buffers and other goodies related to 
  20.  * non-blocking I/O 
  21.  * $Id: io.h,v 1.2 1999/03/05 02:53:23 flood Exp $
  22.  */
  23. #ifndef __IO_H
  24. #define __IO_H
  25. #define IO_READ 0
  26. #define IO_WRITE 1
  27. #define IOR_REMOVE (1 << 0) /* Request scheduled for removal */
  28. #define IOR_CLOSED (1 << 1) /* File is closed */
  29. #define IOR_ERROR (1 << 2) /* Request resulted in error */
  30. #define IOR_REMOVE_FILE (1 << 3) /* Destroy associated file */
  31. #define IO_NONBLOCK (1 << 0) /* No longer used?!? */
  32. #define IO_INTR (1 << 1) /* Indicates that io_* funcs are
  33.                                            allowed to be interrupted
  34.                                            by EINTR, and return -2
  35.                                          */
  36. #define IO_NORESTART (1 << 2) /* Indicates that io_* funcs should
  37.                                            not automagically restart
  38.                                            if read() or write() should
  39.                                            return EWOULDBLOCK/EAGAIN
  40.                                            The default is to restart.
  41.                                          */
  42. #define IO_ABORT (1 << 3)        /* temporary internal flag used
  43.                                            to indicated that i/o on
  44.                                            an IOFILE has been been
  45.                                            aborted and should return -2
  46.                                            at the next possible instant.
  47.                                            In combintation with IO_INTR
  48.                                            and interruptable syscalls
  49.                                            this should be near instantly.
  50.                                            This flag cannot be tested
  51.                                            for as it is cleared immediately
  52.                                            after being detected
  53.                                           */
  54. typedef struct IO_File IOFILE;
  55. typedef struct IO_Buffer IOBUF;
  56. typedef struct IO_Request IOREQ;
  57. struct IO_File {
  58.   pool *pool; /* Each one has it's own pool */
  59.   int  fd; /* File descriptor */
  60.   int  mode; /* 0 == read, 1 == write */
  61.   int  xerrno; /* errno if applicable */
  62.   int  flags;
  63.   unsigned int restart_secs;
  64.   IOBUF *buf;
  65.   IOREQ *req; /* Request buffer */
  66.   int  bufsize; /* Default size of request buffer */
  67. };
  68. struct IO_Buffer {
  69.   char *buf,*cp;
  70.   int left,bufsize;
  71. };
  72. /* cl_read can be used during write operations to asyncronously gather
  73.  * data from a function.  If cl_read returns -1, an error is assumed,
  74.  * otherwise 0 == EOF (write completed)
  75.  */
  76. struct IO_Request {
  77.   IOREQ *next,*prev;
  78.   pool *pool;
  79.   int req_type; /* Read or Write */
  80.   int req_flags; /* Request flags */
  81.   IOFILE *file;
  82.   char *buf;
  83.   char *bp,*bufnext;
  84.   int bufsize; /* Buffer size */
  85.   char *cl_buf,*cl_bp; /* Client buffer, and head pointer */
  86.   int cl_bytes; /* Bytes remaining in client buffer */
  87.   int (*cl_io)(IOREQ*,char*,int); /* Client io function (for async operations) */
  88.   void (*cl_err)(IOREQ*,int); /* Error occured */
  89.   void (*cl_close)(IOREQ*); /* Remote side closed */
  90. };
  91. /* Prototypes */
  92. void init_io();
  93. IOFILE *io_open(pool*,int,int);
  94. IOFILE *io_reopen(IOFILE*,int,int);
  95. int io_poll(IOFILE*);
  96. int io_close(IOFILE*);
  97. int io_write(IOFILE*,char*,int);
  98. int io_write_async(IOFILE*,char*,int);
  99. int io_read(IOFILE*,char*,int,int);
  100. int io_printf(IOFILE*,char*,...);
  101. int io_printf_async(IOFILE*,char*,...);
  102. void io_abort(IOFILE*);
  103. void io_set_restart(IOFILE*,int);
  104. void io_set_poll_sleep(IOFILE*,unsigned int);
  105. char *io_gets(char*,int,IOFILE*);
  106. char *io_telnet_gets(char*,int,IOFILE*,IOFILE*);
  107. void io_set_errno(IOFILE *f, int xerrno);
  108. #endif /* __IO_H */