19a747e4fSDavid du Colombier typedef struct File File; 29a747e4fSDavid du Colombier typedef struct Node Node; 39a747e4fSDavid du Colombier typedef struct OS OS; 49a747e4fSDavid du Colombier 5*12fd1c83SDavid du Colombier #pragma incomplete File 6*12fd1c83SDavid du Colombier 79a747e4fSDavid du Colombier enum 89a747e4fSDavid du Colombier { 99a747e4fSDavid du Colombier Maxpath= 512, 109a747e4fSDavid du Colombier }; 119a747e4fSDavid du Colombier 129a747e4fSDavid du Colombier /* a tree for file path's - this mirrors the directory structure */ 139a747e4fSDavid du Colombier struct Node 149a747e4fSDavid du Colombier { 159a747e4fSDavid du Colombier String *remname; 169a747e4fSDavid du Colombier Dir *d; 179a747e4fSDavid du Colombier Node *parent; 189a747e4fSDavid du Colombier Node *sibs; 199a747e4fSDavid du Colombier Node *children; 209a747e4fSDavid du Colombier File *fp; 219a747e4fSDavid du Colombier short depth; 229a747e4fSDavid du Colombier char chdirunknown; /* true if QTDIR bit of files in this dir is unknown */ 239a747e4fSDavid du Colombier int opens; 249a747e4fSDavid du Colombier }; 259a747e4fSDavid du Colombier 269a747e4fSDavid du Colombier /* OS types */ 279a747e4fSDavid du Colombier enum 289a747e4fSDavid du Colombier { 299a747e4fSDavid du Colombier Unix= 1, 309a747e4fSDavid du Colombier Tops= 2, 319a747e4fSDavid du Colombier Plan9= 3, 329a747e4fSDavid du Colombier VM= 4, 339a747e4fSDavid du Colombier VMS= 5, 349a747e4fSDavid du Colombier MVS= 6, 359a747e4fSDavid du Colombier NetWare= 7, 369a747e4fSDavid du Colombier OS½= 8, 379a747e4fSDavid du Colombier TSO= 9, 389a747e4fSDavid du Colombier NT= 10, 399a747e4fSDavid du Colombier Unknown= 11, 409a747e4fSDavid du Colombier }; 419a747e4fSDavid du Colombier 429a747e4fSDavid du Colombier struct OS 439a747e4fSDavid du Colombier { 449a747e4fSDavid du Colombier int os; 459a747e4fSDavid du Colombier char *name; 469a747e4fSDavid du Colombier }; 479a747e4fSDavid du Colombier extern OS oslist[]; 489a747e4fSDavid du Colombier 499a747e4fSDavid du Colombier /* temporary files */ 509a747e4fSDavid du Colombier void filefree(Node*); 519a747e4fSDavid du Colombier int fileread(Node*, char*, long, int); 529a747e4fSDavid du Colombier int filewrite(Node*, char*, long, int); 539a747e4fSDavid du Colombier void filedirty(Node*); 549a747e4fSDavid du Colombier void fileclean(Node*); 559a747e4fSDavid du Colombier int fileisdirty(Node*); 569a747e4fSDavid du Colombier 579a747e4fSDavid du Colombier /* ftp protocol */ 589a747e4fSDavid du Colombier void hello(char*); 599a747e4fSDavid du Colombier void quit(void); 609a747e4fSDavid du Colombier void preamble(char*); 61ca8cf635SDavid du Colombier void rlogin(char *, char *); 629a747e4fSDavid du Colombier void clogin(char *, char *); 639a747e4fSDavid du Colombier void nop(void); 649a747e4fSDavid du Colombier int readdir(Node*); 659a747e4fSDavid du Colombier int createdir(Node*); 669a747e4fSDavid du Colombier int readfile(Node*); 679a747e4fSDavid du Colombier int createfile(Node*); 689a747e4fSDavid du Colombier int changedir(Node*); 699a747e4fSDavid du Colombier int removefile(Node*); 709a747e4fSDavid du Colombier int removedir(Node*); 719a747e4fSDavid du Colombier 729a747e4fSDavid du Colombier /* misc */ 739a747e4fSDavid du Colombier void* safecpy(void*, void*, int); 749a747e4fSDavid du Colombier void fatal(char*, ...); 759a747e4fSDavid du Colombier int seterr(char*, ...); 769a747e4fSDavid du Colombier Node* extendpath(Node*, String*); 779a747e4fSDavid du Colombier Node* newnode(Node*, String*); 789a747e4fSDavid du Colombier void uncache(Node*); 799a747e4fSDavid du Colombier void invalidate(Node*); 809a747e4fSDavid du Colombier void uncachedir(Node*, Node*); 819a747e4fSDavid du Colombier Node* newtopsdir(char*); 829a747e4fSDavid du Colombier void fixsymbolic(Node*); 839a747e4fSDavid du Colombier Dir* reallocdir(Dir *d, int dofree); 849a747e4fSDavid du Colombier Dir* dir_change_name(Dir *d, char *name); 859a747e4fSDavid du Colombier Dir* dir_change_uid(Dir *d, char *name); 869a747e4fSDavid du Colombier Dir* dir_change_gid(Dir *d, char *name); 879a747e4fSDavid du Colombier Dir* dir_change_muid(Dir *d, char *name); 889a747e4fSDavid du Colombier 899a747e4fSDavid du Colombier extern Node *remdir; /* current directory on remote side */ 909a747e4fSDavid du Colombier extern Node *remroot; /* root on remote side */ 919a747e4fSDavid du Colombier extern int os; /* remote os */ 929a747e4fSDavid du Colombier extern int debug; /* non-zero triggers debugging output */ 939a747e4fSDavid du Colombier extern int usenlst; 949a747e4fSDavid du Colombier extern char *nosuchfile; 959a747e4fSDavid du Colombier extern char *ext; /* add to names of non-dir files */ 969a747e4fSDavid du Colombier extern int defos; 979a747e4fSDavid du Colombier extern int quiet; 989a747e4fSDavid du Colombier extern char *user; 999a747e4fSDavid du Colombier 1009a747e4fSDavid du Colombier #define ISCACHED(x) ((x)->d->type) 1019a747e4fSDavid du Colombier #define UNCACHED(x) (x)->d->type = 0 1029a747e4fSDavid du Colombier #define CACHED(x) { (x)->d->type = 1; (x)->d->atime = time(0); } 1039a747e4fSDavid du Colombier #define ISOLD(x) (x)->d->atime + TIMEOUT < time(0) 1049a747e4fSDavid du Colombier #define ISVALID(x) ((x)->d->dev) 1059a747e4fSDavid du Colombier #define INVALID(x) (x)->d->dev = 0 1069a747e4fSDavid du Colombier #define VALID(x) (x)->d->dev = 1 1079a747e4fSDavid du Colombier #define TIMEOUT 5*60 1089a747e4fSDavid du Colombier #define DMSYML 0x10000000 1099a747e4fSDavid du Colombier 1109a747e4fSDavid du Colombier #define MAXFDATA 8192 1119a747e4fSDavid du Colombier 1129a747e4fSDavid du Colombier extern char net[]; /* network for connections */ 113