/*********************************************************************\ * Copyright (c) 1991 by Wen-King Su (wen-king@vlsi.cs.caltech.edu) * * Copyright (c) 1993 by Phil Richards (pgr@prg.ox.ac.uk) * * * * 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. * \*********************************************************************/ #include "common.h" #include "local.h" #include "remote.h" #ifndef MINDELAY # define MINDELAY 1000 #endif #define DEFAULTDELAY 1340 #define DEFAULTMAXDELAY 60000 #define MAXDELAY 300000 #ifndef MAXRECURSION # define MAXRECURSION 512 #endif #if defined(__STDC__) && __GNUC__ == 2 #define PRINTF_ATTRIB(x,y) __attribute__ ((format (printf, x, y))) #else #define PRINTF_ATTRIB(x,y) #endif /**************************************************************************** * These structures are used to implement a opendir/readdir mechanism similar * to that of the normal opendir/reader mechanism in unix. ****************************************************************************/ typedef struct DDLIST { struct DDLIST *next; char *path; RDIRENT **dep_root; u_int ref_cnt; } DDLIST; typedef struct RDIR { DDLIST *ddp; RDIRENT **dep; } RDIR; typedef struct rdirent { u_long rd_fileno; u_short rd_reclen; u_short rd_namlen; char *rd_name; } rdirent; typedef struct iobuffers { FILE *in; /* stream to read all command input from */ FILE *out; /* stream to send all command output to */ FILE *err; /* stream to send all command errors to */ FILE *prompt; /* stream to send all prompt messages to */ FILE *info; /* stream to send all informational messages to */ FILE *warn; /* stream to send all warning messages to */ FILE *dbg; /* stream to send all debug messages to */ } iobuffers; /* externs from lib.c */ extern UBUF *client_interact(u_int cmd, u_long pos, u_int l1, char *p1, u_int l2, char *p2); extern void print_comm_stats(FILE *out); extern int init_client(char *host, int port, int myport); extern void finish_client(void); extern void client_done(void); extern int client_trace; extern int client_intr_state; extern int client_intr_cnt; extern int key_persists; extern u_long target_delay; extern u_long target_maxdelay; extern u_long udp_sent_time; extern u_int time_out; extern int burst_max; extern u_short client_buf_len; extern u_short client_net_len; /* externs from util.c */ extern char *env_host; extern char *env_port; extern char *env_myport; extern char *env_dir; #ifndef __STDC__ extern void ffprintf(); #else /* __STDC__ */ extern void ffprintf(FILE *out, const char *fmt, ...) PRINTF_ATTRIB(2,3); #endif /* __STDC__ */ extern char *my_fgets(char *s, int n, FILE *stream); extern char *util_abs_path(const char *s2); extern char *util_getwd(char *p); extern RDIRENT **get_dir_blk(char *path); extern int util_download_main(char *path, char *fpath, int fd, int cmd, u_long offset, u_long length); extern int util_download(char *path, int fd, u_long offset, u_long length); extern int util_upload(char *path, FILE *fp); extern int util_grab_file(char *path, int fd, u_long offset, u_long length); extern void util_get_env(void); extern void env_client(void); extern void util_flushdir(void); extern void util_dirtydir(char *path); extern RDIR *util_opendir(char *path); extern int util_closedir(RDIR *rdirp); extern rdirent *util_readdir(RDIR *rdirp); extern void util_split_path(char *path, char **p1, char **p2, char **p3); extern int util_stat(const char *path, struct stat *sbuf); extern int util_cd(const char *p); extern void util_flushpro(void); extern void util_dirtypro(char *path); extern int util_both_pro(char *path, char **textp, char **bmapp, u_int *bmaplen); extern int util_process_file(char *path, int recursive, int depth, int (*process_file)(char *, struct stat *, int), int (*process_dir)(char *, int, char **), void (*tidy_dir)(char *, int, char *)); extern int util_process_arglist(char **argv, int (*procfn)(char *name)); extern int util_print_protection(char *name); extern void util_dirty_version(void); extern int util_print_version(void); extern void util_print_readme(void); /* ** kludge to allow validate_operation to act upon the filename specified ** rather than the basename of the file; this is only really used by rmdir */ #define LITERAL_DIR 0x80000000 extern int validate_operation(const char *name, u_long opmask); #define UTIL_PRINT_PROTECTION (0) #define UTIL_PRINT_VERSION (0) #define UTIL_CD (DIR_PRIV) #define UTIL_DIR (DIR_PRIV) /* opendir/readdir/closedir */ #define UTIL_DOWNLOAD (DIR_PRIV) #define UTIL_STAT (DIR_PRIV) #define UTIL_UPLOAD (DIR_ADD) #define UTIL_PROCESS_FILE (UTIL_DIR | UTIL_STAT) #define UTIL_GLOB (UTIL_DIR | UTIL_STAT) #define UTIL_GRAB_FILE (UTIL_DOWNLOAD | DIR_DEL) #define UTIL_PROCESS_ARGLIST (UTIL_GLOB) /* externs from redirect.c */ extern int askprompt; extern int datestamp; extern iobuffers global_iobuffers; #define STDIN (global_iobuffers.in) #define STDOUT (global_iobuffers.out) #define STDERR (global_iobuffers.err) #define STDPROMPT (global_iobuffers.prompt) #define STDINFO (global_iobuffers.info) #define STDWARN (global_iobuffers.warn) #define STDDBG (global_iobuffers.dbg) extern int dbug_flag; extern char *pager_command; /* externs from glob.c */ #ifdef __STDC__ typedef void VOIDDIR; typedef void VOIDDIRENT; #else typedef char VOIDDIR; typedef char VOIDDIRENT; #endif extern int glob_match(const char *pattern, char *string); extern int glob_path(const char *pattern, char ***names); extern char *expand_tilde(char *path); extern char const **glob(const char *path); extern void free_glob(char **argv); extern void set_glob_routines(VOIDDIR *(*dopen)(char *dirname), void (*dclose)(VOIDDIR *dirp), VOIDDIRENT *(*dread)(VOIDDIR *dirp), char *(*dgetname)(VOIDDIRENT *dp), int (*dstat)(const char *buf, struct stat *s)); void local_glob_routines(void); void remote_glob_routines(void); extern int standalone; #define CMDPROTO(com,fun,glob,help) extern int fun(int argc, char * const argv[], char **envp);