1 typedef struct File File; 2 typedef struct Node Node; 3 typedef struct OS OS; 4 5 #pragma incomplete File 6 7 enum 8 { 9 Maxpath= 512, 10 }; 11 12 /* a tree for file path's - this mirrors the directory structure */ 13 struct Node 14 { 15 String *remname; 16 Dir *d; 17 Node *parent; 18 Node *sibs; 19 Node *children; 20 File *fp; 21 short depth; 22 char chdirunknown; /* true if QTDIR bit of files in this dir is unknown */ 23 int opens; 24 }; 25 26 /* OS types */ 27 enum 28 { 29 Unix= 1, 30 Tops= 2, 31 Plan9= 3, 32 VM= 4, 33 VMS= 5, 34 MVS= 6, 35 NetWare= 7, 36 OS½= 8, 37 TSO= 9, 38 NT= 10, 39 Unknown= 11, 40 }; 41 42 struct OS 43 { 44 int os; 45 char *name; 46 }; 47 extern OS oslist[]; 48 49 /* temporary files */ 50 void filefree(Node*); 51 int fileread(Node*, char*, long, int); 52 int filewrite(Node*, char*, long, int); 53 void filedirty(Node*); 54 void fileclean(Node*); 55 int fileisdirty(Node*); 56 57 /* ftp protocol */ 58 void hello(char*); 59 void quit(void); 60 void preamble(char*); 61 void rlogin(char *, char *); 62 void clogin(char *, char *); 63 void nop(void); 64 int readdir(Node*); 65 int createdir(Node*); 66 int readfile(Node*); 67 int createfile(Node*); 68 int changedir(Node*); 69 int removefile(Node*); 70 int removedir(Node*); 71 72 /* misc */ 73 void* safecpy(void*, void*, int); 74 void fatal(char*, ...); 75 int seterr(char*, ...); 76 Node* extendpath(Node*, String*); 77 Node* newnode(Node*, String*); 78 void uncache(Node*); 79 void invalidate(Node*); 80 void uncachedir(Node*, Node*); 81 Node* newtopsdir(char*); 82 void fixsymbolic(Node*); 83 Dir* reallocdir(Dir *d, int dofree); 84 Dir* dir_change_name(Dir *d, char *name); 85 Dir* dir_change_uid(Dir *d, char *name); 86 Dir* dir_change_gid(Dir *d, char *name); 87 Dir* dir_change_muid(Dir *d, char *name); 88 89 extern Node *remdir; /* current directory on remote side */ 90 extern Node *remroot; /* root on remote side */ 91 extern int os; /* remote os */ 92 extern int debug; /* non-zero triggers debugging output */ 93 extern int usenlst; 94 extern char *nosuchfile; 95 extern char *ext; /* add to names of non-dir files */ 96 extern int defos; 97 extern int quiet; 98 extern char *user; 99 100 #define ISCACHED(x) ((x)->d->type) 101 #define UNCACHED(x) (x)->d->type = 0 102 #define CACHED(x) { (x)->d->type = 1; (x)->d->atime = time(0); } 103 #define ISOLD(x) (x)->d->atime + TIMEOUT < time(0) 104 #define ISVALID(x) ((x)->d->dev) 105 #define INVALID(x) (x)->d->dev = 0 106 #define VALID(x) (x)->d->dev = 1 107 #define TIMEOUT 5*60 108 #define DMSYML 0x10000000 109 110 #define MAXFDATA 8192 111 112 extern char net[]; /* network for connections */ 113