1 /*********************************************************************\ 2 * Copyright (c) 1991 by Wen-King Su (wen-king@vlsi.cs.caltech.edu) * 3 * Copyright (c) 1993 by Phil Richards (pgr@prg.ox.ac.uk) * 4 * * 5 * You may copy or modify this file in any manner you wish, provided * 6 * that this notice is always included, and that you hold the author * 7 * harmless for any loss or damage resulting from the installation or * 8 * use of this software. * 9 \*********************************************************************/ 10 11 #include "common.h" 12 #include "local.h" 13 #include "remote.h" 14 15 #ifndef MINDELAY 16 # define MINDELAY 1000 17 #endif 18 19 #define DEFAULTDELAY 1340 20 #define DEFAULTMAXDELAY 60000 21 #define MAXDELAY 300000 22 23 #ifndef MAXRECURSION 24 # define MAXRECURSION 512 25 #endif 26 27 #if defined(__STDC__) && __GNUC__ == 2 28 #define PRINTF_ATTRIB(x,y) __attribute__ ((format (printf, x, y))) 29 #else 30 #define PRINTF_ATTRIB(x,y) 31 #endif 32 33 /**************************************************************************** 34 * These structures are used to implement a opendir/readdir mechanism similar 35 * to that of the normal opendir/reader mechanism in unix. 36 ****************************************************************************/ 37 38 typedef struct DDLIST { 39 struct DDLIST *next; 40 char *path; 41 RDIRENT **dep_root; 42 u_int ref_cnt; 43 } DDLIST; 44 45 typedef struct RDIR { 46 DDLIST *ddp; 47 RDIRENT **dep; 48 } RDIR; 49 50 typedef struct rdirent { 51 u_long rd_fileno; 52 u_short rd_reclen; 53 u_short rd_namlen; 54 char *rd_name; 55 } rdirent; 56 57 typedef struct iobuffers { 58 FILE *in; /* stream to read all command input from */ 59 FILE *out; /* stream to send all command output to */ 60 FILE *err; /* stream to send all command errors to */ 61 FILE *prompt; /* stream to send all prompt messages to */ 62 FILE *info; /* stream to send all informational messages to */ 63 FILE *warn; /* stream to send all warning messages to */ 64 FILE *dbg; /* stream to send all debug messages to */ 65 } iobuffers; 66 67 /* externs from lib.c */ 68 extern UBUF *client_interact(u_int cmd, u_long pos, 69 u_int l1, unsigned char *p1, 70 u_int l2, unsigned char *p2); 71 extern void print_comm_stats(FILE *out); 72 extern int init_client(char *host, int port, int myport); 73 extern void finish_client(void); 74 extern void client_done(void); 75 76 extern int client_trace; 77 extern int client_intr_state; 78 extern int client_intr_cnt; 79 extern int key_persists; 80 extern u_long target_delay; 81 extern u_long target_maxdelay; 82 extern u_long udp_sent_time; 83 extern u_int time_out; 84 extern int burst_max; 85 extern u_short client_buf_len; 86 extern u_short client_net_len; 87 88 /* externs from util.c */ 89 extern char *env_host; 90 extern char *env_port; 91 extern char *env_myport; 92 extern char *env_dir; 93 94 #ifndef __STDC__ 95 extern void ffprintf(); 96 97 #else /* __STDC__ */ 98 99 extern void ffprintf(FILE *out, const char *fmt, ...) PRINTF_ATTRIB(2,3); 100 #endif /* __STDC__ */ 101 102 extern char *my_fgets(char *s, int n, FILE *stream); 103 extern char *util_abs_path(const char *s2); 104 extern char *util_getwd(char *p); 105 extern RDIRENT **get_dir_blk(char *path); 106 extern int util_download_main(char *path, char *fpath, int fd, 107 int cmd, u_long offset, u_long length); 108 extern int util_download(char *path, int fd, u_long offset, u_long length); 109 extern int util_upload(char *path, FILE *fp); 110 extern int util_grab_file(char *path, int fd, u_long offset, u_long length); 111 extern void util_get_env(void); 112 extern void env_client(void); 113 114 extern void util_flushdir(void); 115 extern void util_dirtydir(char *path); 116 extern RDIR *util_opendir(char *path); 117 extern int util_closedir(RDIR *rdirp); 118 extern rdirent *util_readdir(RDIR *rdirp); 119 extern void util_split_path(char *path, char **p1, char **p2, char **p3); 120 extern int util_stat(const char *path, struct stat *sbuf); 121 extern int util_cd(const char *p); 122 123 extern void util_flushpro(void); 124 extern void util_dirtypro(char *path); 125 extern int util_both_pro(char *path, char **textp, 126 char **bmapp, u_int *bmaplen); 127 128 extern int util_process_file(char *path, int recursive, int depth, 129 int (*process_file)(char *, struct stat *, int), 130 int (*process_dir)(char *, int, char **), 131 void (*tidy_dir)(char *, int, char *)); 132 extern int util_process_arglist(char **argv, int (*procfn)(char *name)); 133 extern int util_print_protection(char *name); 134 135 extern void util_dirty_version(void); 136 extern int util_print_version(void); 137 138 extern void util_print_readme(void); 139 140 /* 141 ** kludge to allow validate_operation to act upon the filename specified 142 ** rather than the basename of the file; this is only really used by rmdir 143 */ 144 #define LITERAL_DIR 0x80000000 145 extern int validate_operation(const char *name, u_long opmask); 146 147 #define UTIL_PRINT_PROTECTION (0) 148 #define UTIL_PRINT_VERSION (0) 149 #define UTIL_CD (DIR_PRIV) 150 #define UTIL_DIR (DIR_PRIV) /* opendir/readdir/closedir */ 151 #define UTIL_DOWNLOAD (DIR_PRIV) 152 #define UTIL_STAT (DIR_PRIV) 153 #define UTIL_UPLOAD (DIR_ADD) 154 #define UTIL_PROCESS_FILE (UTIL_DIR | UTIL_STAT) 155 #define UTIL_GLOB (UTIL_DIR | UTIL_STAT) 156 #define UTIL_GRAB_FILE (UTIL_DOWNLOAD | DIR_DEL) 157 #define UTIL_PROCESS_ARGLIST (UTIL_GLOB) 158 159 /* externs from redirect.c */ 160 extern int askprompt; 161 extern int datestamp; 162 163 extern iobuffers global_iobuffers; 164 165 #define STDIN (global_iobuffers.in) 166 #define STDOUT (global_iobuffers.out) 167 #define STDERR (global_iobuffers.err) 168 #define STDPROMPT (global_iobuffers.prompt) 169 #define STDINFO (global_iobuffers.info) 170 #define STDWARN (global_iobuffers.warn) 171 #define STDDBG (global_iobuffers.dbg) 172 173 extern int dbug_flag; 174 extern char *pager_command; 175 176 /* externs from glob.c */ 177 #ifdef __STDC__ 178 typedef void VOIDDIR; 179 typedef void VOIDDIRENT; 180 #else 181 typedef char VOIDDIR; 182 typedef char VOIDDIRENT; 183 #endif 184 185 extern int glob_match(const char *pattern, char *string); 186 extern int glob_path(const char *pattern, char ***names); 187 extern char *expand_tilde(char *path); 188 extern char const **glob(const char *path); 189 extern void free_glob(char **argv); 190 extern void set_glob_routines(VOIDDIR *(*dopen)(char *dirname), 191 void (*dclose)(VOIDDIR *dirp), 192 VOIDDIRENT *(*dread)(VOIDDIR *dirp), 193 char *(*dgetname)(VOIDDIRENT *dp), 194 int (*dstat)(const char *buf, struct stat *s)); 195 void local_glob_routines(void); 196 void remote_glob_routines(void); 197 198 extern int standalone; 199 200 #define CMDPROTO(com,fun,glob,help) extern int fun(int argc, char * const argv[], char **envp); 201