1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
/*********************************************************************\
* Copyright (c) 1991 by Wen-King Su (wen-king@vlsi.cs.caltech.edu) *
* *
* 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. *
\*********************************************************************/
#ifndef _FSP_COMMON_DEF_H_
#define _FSP_COMMON_DEF_H_
#include <stdio.h>
#ifdef VMS
#include "param.h"
#include "types.h"
#include "socket.h"
#include "stat.h"
#include <unixio.h>
#include <unixlib.h>
#define malloc VAXC$MALLOC_OPT
#define realloc VAXC$REALLOC_OPT
#define free VAXC$FREE_OPT
#define unlink delete
#else
#include <sys/param.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#endif
#include <errno.h>
#include <netinet/in.h>
#ifdef VMS
#include "time.h"
#else
#include <sys/time.h>
#include <fcntl.h>
#endif
#include <signal.h>
#ifdef VMS
#include "dirent.h"
#else
#ifdef DIRENT
#include <dirent.h>
#else
#ifdef SYSDIR
#include <sys/dir.h>
#else
#ifdef SYSNDIR
#include <sys/ndir.h>
#endif
#endif
#endif
#endif
/****************************************************************************
* UBUF is the structure of message exchanged between server and clients.
*
* The 'buf' part of the buffer is variable lenght up to max of 1024.
* The 'key' field is used by the server for sequence identification.
* The 'seq' field is used by the client for sequence identification.
*
* Client's message to server contain a key value that is the same as the
* key value of the previous message received from the server. Similarly,
* the server's message to client contains a seq value that is the same
* as the seq value of the previous message from the client.
*
* The buf field is logically partitioned into two parts by the len field.
* The len field indicate the size of the first part of the buffer starting
* at buf[0]. The rest of the buffer is the second field. In some cases
* both fields can contain information.
*
****************************************************************************/
#define UBUF_HSIZE 12 /* 12 bytes for the header */
#define UBUF_SPACE 1024 /* maximum payload. */
typedef struct UBUF { char cmd; /* message code. */
unsigned char sum; /* message checksum. */
unsigned char bb_key[2]; /* message key. */
unsigned char bb_seq[2]; /* message sequence number. */
unsigned char bb_len[2]; /* number of bytes in buf 1. */
unsigned char bb_pos[4]; /* location in the file. */
char buf[UBUF_SPACE];
} UBUF;
/* definition of cmd */
#define CC_VERSION 0x10 /* return server's version string. */
#define CC_ERR 0x40 /* error response from server. */
#define CC_GET_DIR 0x41 /* get a directory listing. */
#define CC_GET_FILE 0x42 /* get a file. */
#define CC_UP_LOAD 0x43 /* open a file for writing. */
#define CC_INSTALL 0x44 /* close a file opened for writing. */
#define CC_DEL_FILE 0x45 /* delete a file. */
#define CC_DEL_DIR 0x46 /* delete a directory. */
#define CC_GET_PRO 0x47 /* get directory protection. */
#define CC_SET_PRO 0x48 /* set directory protection. */
#define CC_MAKE_DIR 0x49 /* create a directory. */
#define CC_BYE 0x4A /* finish a session. */
#define CC_GRAB_FILE 0x4B /* atomic get+delete a file. */
#define CC_GRAB_DONE 0x4C /* atomic get+delete a file done. */
#define CC_LIMIT 0x80 /* # > 0x7f for future cntrl blk ext. */
/* definition of global bitfield for version information */
/* Global information is also going to be a bit vector */
#define VER_BYTES 1 /* currently only 8 bits or less of info */
#define VER_LOG 0x01 /* does the server do logging */
#define VER_READONLY 0x02 /* is the server in readonly mode */
#define VER_REVNAME 0x04 /* does the server refuse non reversables */
#define VER_PRIVMODE 0x08 /* Is the server being run 'private' mode */
#define VER_THRUPUT 0x10 /* does the server enforce thruput control*/
/* 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 PRO_BYTES 1 /* currently only 8 bits or less of info */
#define DIR_OWNER 0x01 /* does caller own directory */
#define DIR_DEL 0x02 /* can files be deleted from this dir */
#define DIR_ADD 0x04 /* can files be added to this dir */
#define DIR_MKDIR 0x08 /* can new subdirectories be created */
#define DIR_PRIV 0x10 /* are files readable by non-owners */
#define DIR_README 0x20 /* does this dir contain an readme file? */
/* definition of logging information */
#define L_NONE 0x000
#define L_ERR 0x001
#define L_VER 0x002
#define L_GETDIR 0x004
#define L_GETFILE 0x008
#define L_UPLOAD 0x010
#define L_INSTALL 0x020
#define L_DELFILE 0x040
#define L_DELDIR 0x080
#define L_SETPRO 0x100
#define L_MAKEDIR 0x200
#define L_GRABFILE 0x400
#define L_GETPRO 0x800
#define L_ALL 0xfff
/****************************************************************************
* RDIRENT is the structure of a directory entry contained in a .FSP_CONTENT
* file. Each entry contains a 4 bytes quantity 'time', a 4 bytes quentity
* 'size', and 1 byte of 'type'. Then followed by x number of bytes of
* 'name'. 'name' is null terminated. Then followed by enough number of
* padding to fill to an 4-byte boundary. At this point, if the next entry
* to follow will spread across 1k boundary, then two possible things will
* happen. 1) if the header fits between this entry and the 1k boundary,
* a complete header will be filled in with a 'type' set to RDTYPE_SKIP.
* And then enough bytes to padd to 1k boundary. 2) if the header does
* not fit, then simply pad to the 1k boundary. This will make sure that
* messages carrying directory information carry only complete directory
* entries and no fragmented entries. The last entry is type RDTYPE_END.
****************************************************************************/
#define RDHSIZE (2*4+1)
typedef struct RDIRENT { unsigned char bb_time[4];
unsigned char bb_size[4];
unsigned char type ;
char name[1] ; } RDIRENT;
#define RDTYPE_END 0x00
#define RDTYPE_FILE 0x01
#define RDTYPE_DIR 0x02
#define RDTYPE_SKIP 0x2A
#define NULLP ((char *) 0)
#define MIN_DELAY 500L
#endif /* _FSP_COMMON_DEF_H_ */
|