diff lib/fsplib/fsplib.h @ 662:be9663e0be00

2005-1-16 Brian Masney <masneyb@gftp.org> * lib/fsplib/COPYING lib/fsplib/Makefile.am lib/fsplib/fsplib.c lib/fsplib/fsplib.h lib/fsplib/lock.c lib/fsplib/lock.h - added FSPLIB This library is written by Radim Kolar <hsn@netmag.cz> and was included with his permission
author masneyb
date Sun, 16 Jan 2005 16:12:13 +0000
parents
children 6b6fbcf76d00
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/fsplib/fsplib.h	Sun Jan 16 16:12:13 2005 +0000
@@ -0,0 +1,184 @@
+#ifndef _FSPLIB_H
+#define _FSPLIB_H 1
+#include <time.h>
+/* The FSP v2 protocol support library - public interface */
+
+/*
+This file is part of fsplib - FSP protocol stack implemented in C
+language. See http://fsp.sourceforge.net for more information.
+
+Copyright (c) 2003-2004 by Radim HSN Kolar (hsn@netmag.cz)
+
+You may copy or modify this file in any manner you wish, provided
+that this notice is always included, and that you hold the author
+harmless for any loss or damage resulting from the installation or
+use of this software.
+
+                     This is a free software.  Be creative.
+                    Let me know of any bugs and suggestions.
+*/
+
+/* definition of FSP protocol v2 commands */
+
+#define FSP_CC_VERSION      0x10    /* return server's version string.      */
+#define FSP_CC_INFO         0x11    /* return server's extended info block  */
+#define FSP_CC_ERR          0x40    /* error response from server.          */
+#define FSP_CC_GET_DIR      0x41    /* get a directory listing.             */
+#define FSP_CC_GET_FILE     0x42    /* get a file.                          */
+#define FSP_CC_UP_LOAD      0x43    /* open a file for writing.             */
+#define FSP_CC_INSTALL      0x44    /* close a file opened for writing.     */
+#define FSP_CC_DEL_FILE     0x45    /* delete a file.                       */
+#define FSP_CC_DEL_DIR      0x46    /* delete a directory.                  */
+#define FSP_CC_GET_PRO      0x47    /* get directory protection.            */
+#define FSP_CC_SET_PRO      0x48    /* set directory protection.            */
+#define FSP_CC_MAKE_DIR     0x49    /* create a directory.                  */
+#define FSP_CC_BYE          0x4A    /* finish a session.                    */
+#define FSP_CC_GRAB_FILE    0x4B    /* atomic get+delete a file.            */
+#define FSP_CC_GRAB_DONE    0x4C    /* atomic get+delete a file done.       */
+#define FSP_CC_STAT         0x4D    /* get information about file.          */
+#define FSP_CC_RENAME       0x4E    /* rename file or directory.            */
+#define FSP_CC_CH_PASSWD    0x4F    /* change password                      */
+#define FSP_CC_LIMIT        0x80    /* # > 0x7f for future cntrl blk ext.   */
+#define FSP_CC_TEST         0x81    /* reserved for testing                 */
+
+/* FSP v2 packet size */
+#define FSP_HSIZE 12                           /* 12 bytes for v2 header */
+#define FSP_SPACE 1024                         /* maximum payload.       */
+#define FSP_MAXPACKET   FSP_HSIZE+FSP_SPACE    /* maximum packet size.   */
+
+/* byte offsets of fields in the FSP v2 header */
+#define FSP_OFFSET_CMD          0
+#define FSP_OFFSET_SUM          1
+#define FSP_OFFSET_KEY          2
+#define FSP_OFFSET_SEQ          4
+#define FSP_OFFSET_LEN          6
+#define FSP_OFFSET_POS          8
+
+/* types of directory entry */ 
+#define FSP_RDTYPE_END      0x00
+#define FSP_RDTYPE_FILE     0x01
+#define FSP_RDTYPE_DIR      0x02
+#define FSP_RDTYPE_LINK	    0x03
+#define FSP_RDTYPE_SKIP     0x2A
+
+/* definition of directory bitfield for directory information */
+/* directory information is just going to be a bitfield encoding
+ * of which protection bits are set/unset
+ */
+
+#define FSP_PRO_BYTES	1	/* currently only 8 bits or less of info  */
+#define FSP_DIR_OWNER	0x01	/* does caller own directory              */
+#define FSP_DIR_DEL	0x02	/* can files be deleted from this dir     */
+#define FSP_DIR_ADD	0x04	/* can files be added to this dir         */
+#define FSP_DIR_MKDIR	0x08	/* can new subdirectories be created      */
+#define FSP_DIR_GET	0x10	/* are files readable by non-owners?      */
+#define FSP_DIR_README	0x20	/* does this dir contain an readme file?  */
+#define FSP_DIR_LIST    0x40    /* public can list directory              */
+#define FSP_DIR_RENAME  0x80    /* can files be renamed in this dir       */
+ 
+/* decoded FSP packet */
+typedef struct FSP_PKT {
+                        unsigned char       cmd; /* message code.             */
+                        unsigned char       sum; /* message checksum.         */
+                        unsigned short      key; /* message key.              */
+                        unsigned short      seq; /* message sequence number.  */
+                        unsigned short      len; /* number of bytes in buf 1. */
+                        unsigned int        pos; /* location in the file.     */                        unsigned short     xlen; /* number of bytes in buf 2  */
+
+                        unsigned char   buf[FSP_SPACE];   /* packet payload */
+              } FSP_PKT;
+
+/* FSP host:port */
+typedef struct FSP_SESSION {
+			void *   lock;            /* key locking         */
+                        unsigned int   timeout;   /* send timeout 1/1000s*/
+			unsigned int   maxdelay;  /* maximum recv. delay */
+                        unsigned short seq;       /* sequence number     */
+                        unsigned int dupes;       /* total pkt. dupes    */
+                        unsigned int resends;     /* total pkt. sends    */
+                        unsigned int trips;       /* total pkt trips     */
+                        unsigned long rtts;       /* cumul. rtt          */
+                        unsigned int last_rtt;    /* last rtt            */
+                        unsigned int last_delay;  /* last delay time     */
+                        unsigned int last_dupes;  /* last dupes          */
+                        unsigned int last_resends;/* last resends        */
+                        int fd;                   /* i/o descriptor      */
+                        char *password;           /* host acccess password */
+                } FSP_SESSION;
+
+/* fsp directory handle */
+typedef struct FSP_DIR {
+                        char   *dirname;          /* directory name */
+                        short   inuse;            /* in use counter */
+                        int     dirpos;           /* current directory pos. */
+                        unsigned short blocksize; /* size of directory block */
+                        unsigned char  *data;     /* raw directory data */
+                        unsigned int   datasize;  /* size of raw dir. data */
+} FSP_DIR;
+
+/* fsp directory entry */
+typedef struct FSP_RDENTRY  {
+                       char name[255 + 1];        /* entry name */
+		       unsigned short namlen;     /* length     */
+		       unsigned char type;        /* field type */
+		       unsigned short reclen;     /* directory record length */
+		       unsigned int  size;
+		       unsigned int  lastmod;
+} FSP_RDENTRY;
+
+/* fsp file handle */
+typedef struct FSP_FILE {
+    		      FSP_PKT in,out;            /* io packets */
+		      FSP_SESSION *s;            /* master session */
+		      char *name;                /* filename for upload */
+		      unsigned char writing;     /* opened for writing */
+		      unsigned char eof;         /* EOF reached? */
+		      unsigned char err;         /* i/o error? */
+		      int bufpos;                /* position in buffer */
+		      unsigned int pos;          /* position of next packet */
+} FSP_FILE;
+
+/* function prototypes */
+
+/* session management */
+FSP_SESSION * fsp_open_session(const char *host,unsigned short port, const char *password);
+void fsp_close_session(FSP_SESSION *s);
+
+/* packet encoding/decoding */
+size_t fsp_pkt_write(const FSP_PKT *p,void *space);
+int fsp_pkt_read(FSP_PKT *p,const void *space,size_t recv_len);
+
+/* send/receive round-trip */
+int fsp_transaction(FSP_SESSION *s,FSP_PKT *p,FSP_PKT *rpkt);
+
+/* directory listing commands */
+FSP_DIR * fsp_opendir(FSP_SESSION *s,const char *dirname);
+int fsp_readdir_r(FSP_DIR *dir,struct dirent *entry, struct dirent **result);
+long fsp_telldir(FSP_DIR *dirp);
+void fsp_seekdir(FSP_DIR *dirp, long loc);
+void fsp_rewinddir(FSP_DIR *dirp);
+struct dirent * fsp_readdir(FSP_DIR *dirp);
+int fsp_readdir_native(FSP_DIR *dir,FSP_RDENTRY *entry, FSP_RDENTRY **result);
+int fsp_closedir(FSP_DIR *dirp);
+/* high level  file i/o */
+FSP_FILE * fsp_fopen(FSP_SESSION *session, const char *path,const char *modeflags);
+size_t fsp_fread(void *ptr,size_t size,size_t nmemb,FSP_FILE *file);
+size_t fsp_fwrite(const void * source, size_t size, size_t count, FSP_FILE * file);
+int fsp_fclose(FSP_FILE *file);
+int fsp_fpurge(FSP_FILE *file);
+int fsp_fflush(FSP_FILE *file);
+int fsp_fseek(FSP_FILE *stream, long offset, int whence);
+long fsp_ftell(FSP_FILE *f);
+void fsp_rewind(FSP_FILE *f);
+/* misc. functions */
+int fsp_stat(FSP_SESSION *s,const char *path,struct stat *sb);
+int fsp_mkdir(FSP_SESSION *s,const char *directory);
+int fsp_rmdir(FSP_SESSION *s,const char *directory);
+int fsp_unlink(FSP_SESSION *s,const char *directory);
+int fsp_rename(FSP_SESSION *s,const char *from, const char *to);
+int fsp_access(FSP_SESSION *s,const char *path, int mode);
+/* fsp protocol specific functions */
+int fsp_getpro(FSP_SESSION *s,const char *directory,unsigned char *result);
+int fsp_install(FSP_SESSION *s,const char *fname,time_t timestamp);
+int fsp_canupload(FSP_SESSION *s,const char *fname);
+#endif