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