#define EXTERN
#include "ftptool.h"
#pragma ident "@(#)main.c 1.10 94/08/25"
unsigned short icon_array[] = {
#include "./ftptool.icon"
};
static unsigned short busy1_icon_array[] = {
#include "./busy1.ftptool.icon"
};
static unsigned short busy2_icon_array[] = {
#include "./busy2.ftptool.icon"
};
static unsigned short busy3_icon_array[] = {
#include "./busy3.ftptool.icon"
};
static unsigned short busy4_icon_array[] = {
#include "./busy4.ftptool.icon"
};
static unsigned short directory_pr_array[] = {
#include "./directory.pr"
};
static unsigned short file_pr_array[] = {
#include "./file.pr"
};
static unsigned short dotdot_pr_array[] = {
#include "./dotdot.pr"
};
static unsigned short link_pr_array[] = {
#include "./link.pr"
};
static unsigned short unknown_pr_array[] = {
#include "./unknown.pr"
};
int nbusyicons = 4;
Server_image busy_glyphs[4];
Server_image ftptool_glyph;
static struct itimerval date_timer = {
{300, 0},
{300, 0},
};
#ifdef USE_PROTOTYPES
int main(int argc, char **argv)
#else
int main(argc, argv)
int argc;
char **argv;
#endif
{
char *helppath;
int closed = 0;
struct servent *servent;
/* FTP inits */
data = -1;
abrtflag = 0;
verbose = 1;
debug = 0;
code = -1;
cpend = 0;
curtype = 0;
crflag = 1;
runique = 0;
sendport = -1;
bzero((char *)&local_dircache, sizeof (local_dircache));
bzero((char *)&remote_dircache, sizeof (remote_dircache));
bzero((char *)&schedule_list, sizeof (schedule_list));
program_name = argv[0];
#ifdef SOCKS
SOCKSinit(program_name);
#endif
/*
* Determine port numbers to use
*/
servent = getservbyname("ftp", "tcp");
if (servent != NULL) {
ftp_port = servent->s_port;
} else {
fprintf(stderr, "Couldn't find 'ftp' service. Using %d.\n",
FTP_PORT);
ftp_port = htons(FTP_PORT);
}
servent = getservbyname("ftp-passthru", "tcp");
if (servent != NULL) {
ftp_passthru_port = servent->s_port;
} else {
ftp_passthru_port = htons(FTP_PASSTHRU_PORT);
}
try_proxy = 1;
sprintf(scratch, "Ftptool Version %d.%d", VERSION, PATCHLEVEL);
header_name = strdup(scratch);
if (header_name == NULL) {
perror("malloc");
exit(1);
}
/*
* Initialize XView.
*/
xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, NULL);
if ((helppath = getenv("HELPPATH")) == NULL) {
putenv("HELPPATH=/usr/local/lib/help:.");
} else {
sprintf(scratch, "HELPPATH=%s:/usr/local/lib/help:.", helppath);
putenv(strdup(scratch));
}
load_xdefaults();
netrc_filename = find_dotfile(".netrc");
if (argc > 1) {
handle_tarfile(argv[1]);
}
/* initialize UNIX pattern */
unix_dir_pattern = dir_parse_to_pattern(UNIX_DIR_PATTERN);
if (unix_dir_pattern == NULL) {
perror("malloc");
exit(1);
}
other_dir_pattern = NULL;
ftptool_glyph = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
XV_WIDTH, 64,
XV_HEIGHT, 64,
SERVER_IMAGE_DEPTH, 1,
SERVER_IMAGE_BITS, icon_array,
NULL);
directory_glyph = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
XV_WIDTH, 16,
XV_HEIGHT, 16,
SERVER_IMAGE_DEPTH, 1,
SERVER_IMAGE_BITS, directory_pr_array,
NULL);
file_glyph = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
XV_WIDTH, 16,
XV_HEIGHT, 16,
SERVER_IMAGE_DEPTH, 1,
SERVER_IMAGE_BITS, file_pr_array,
NULL);
dotdot_glyph = (Server_image)xv_create(XV_NULL,
SERVER_IMAGE,
XV_WIDTH, 16,
XV_HEIGHT, 16,
SERVER_IMAGE_DEPTH, 1,
SERVER_IMAGE_BITS, dotdot_pr_array,
NULL);
link_glyph = (Server_image)xv_create(XV_NULL,
SERVER_IMAGE,
XV_WIDTH, 16,
XV_HEIGHT, 16,
SERVER_IMAGE_DEPTH, 1,
SERVER_IMAGE_BITS, link_pr_array,
NULL);
unknown_glyph = (Server_image)xv_create(XV_NULL,
SERVER_IMAGE,
XV_WIDTH, 16,
XV_HEIGHT, 16,
SERVER_IMAGE_DEPTH, 1,
SERVER_IMAGE_BITS, unknown_pr_array,
NULL);
create_base_window();
frame_icon = (Icon)xv_get(base_window.frame, FRAME_ICON);
xv_set(frame_icon,
ICON_IMAGE, ftptool_glyph,
ICON_TRANSPARENT, TRUE,
NULL);
normal_cursor = xv_create(base_window.frame,
CURSOR,
CURSOR_SRC_CHAR, OLC_BASIC_PTR,
CURSOR_MASK_CHAR, OLC_BASIC_MASK_PTR,
CURSOR_OP, PIX_SRC | PIX_DST,
NULL);
busy_cursor = xv_create(base_window.frame,
CURSOR,
CURSOR_SRC_CHAR, OLC_BUSY_PTR,
CURSOR_MASK_CHAR, OLC_BUSY_MASK_PTR,
CURSOR_OP, PIX_SRC | PIX_DST,
NULL);
busy_glyphs[0] = (Server_image)xv_create(XV_NULL,
SERVER_IMAGE,
XV_WIDTH, 64,
XV_HEIGHT, 64,
SERVER_IMAGE_DEPTH, 1,
SERVER_IMAGE_BITS, busy1_icon_array,
NULL);
busy_glyphs[1] = (Server_image)xv_create(XV_NULL,
SERVER_IMAGE,
XV_WIDTH, 64,
XV_HEIGHT, 64,
SERVER_IMAGE_DEPTH, 1,
SERVER_IMAGE_BITS, busy2_icon_array,
NULL);
busy_glyphs[2] = (Server_image)xv_create(XV_NULL,
SERVER_IMAGE,
XV_WIDTH, 64,
XV_HEIGHT, 64,
SERVER_IMAGE_DEPTH, 1,
SERVER_IMAGE_BITS, busy3_icon_array,
NULL);
busy_glyphs[3] = (Server_image)xv_create(XV_NULL,
SERVER_IMAGE,
XV_WIDTH, 64,
XV_HEIGHT, 64,
SERVER_IMAGE_DEPTH, 1,
SERVER_IMAGE_BITS, busy4_icon_array,
NULL);
create_local_window();
create_host_popup();
create_session_log();
create_property_window();
create_file_property_window(&local_file_properties,
"Ftptool:Local File Properties");
create_file_property_window(&remote_file_properties,
"Ftptool:Remote File Properties");
create_tar_file_popup();
create_about_window();
create_feedback_window();
create_schedule_window();
create_status_window();
load_extensions();
/* make it so ftp doesn't blow when the data connection is closed */
/* if the remote filesystem fills up. */
signal(SIGPIPE, SIG_IGN);
/*
* Turn control over to XView.
*/
notify_interpose_destroy_func(base_window.frame, destroy_func);
notify_set_signal_func(base_window.frame, sig_func, SIGINT,
NOTIFY_SYNC);
notify_set_itimer_func(schedule_window.current_time, date_wrapper,
ITIMER_REAL, &date_timer, (struct itimerval *)NULL);
change_local_dir(".", 0);
xv_set(base_window.frame,
XV_SHOW, TRUE,
NULL);
XFlush(dpy);
update_date(1);
closed = xv_get(base_window.frame, FRAME_CLOSED);
XFlush(dpy);
if (host_window.visible) {
xv_set(host_window.frame,
XV_SHOW, TRUE,
#ifdef XVIEW3
FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_IN,
#else
FRAME_CMD_PUSHPIN_IN, TRUE,
#endif
FRAME_CLOSED, closed,
NULL);
}
if (host_window.advanced.visible)
plus_proc();
XFlush(dpy);
if (local_window.visible) {
xv_set(local_window.frame,
XV_SHOW, TRUE,
#ifdef XVIEW3
FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_IN,
#else
FRAME_CMD_PUSHPIN_IN, TRUE,
#endif
FRAME_CLOSED, closed,
NULL);
}
XFlush(dpy);
if (schedule_window.visible) {
xv_set(schedule_window.frame,
XV_SHOW, TRUE,
#ifdef XVIEW3
FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_IN,
#else
FRAME_CMD_PUSHPIN_IN, TRUE,
#endif
FRAME_CLOSED, closed,
NULL);
}
XFlush(dpy);
if (status_window.visible) {
xv_set(status_window.frame,
XV_SHOW, TRUE,
#ifdef XVIEW3
FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_IN,
#else
FRAME_CMD_PUSHPIN_IN, TRUE,
#endif
FRAME_CLOSED, closed,
NULL);
}
XFlush(dpy);
if (logging) {
xv_set(session_window.frame,
XV_SHOW, TRUE,
#ifdef XVIEW3
FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_IN,
#else
FRAME_CMD_PUSHPIN_IN, TRUE,
#endif
FRAME_CLOSED, closed,
NULL);
}
XFlush(dpy);
for (;;) {
XFlush(dpy);
notify_start();
abort_transfer = 0;
switch (dowhat) {
case DOCONNECT:
(void) doconnect();
break;
case DOGET:
doget();
break;
case DOBATCHGET:
dobatchget();
break;
case DOPUT:
doput();
break;
case DOBATCHPUT:
dobatchput();
break;
case DOLOCALVIEW:
case DOREMOTEVIEW:
doview(dowhat);
break;
case DOUNCOMPRESS:
case DOEXTRACT:
case DOCOMPRESS:
case DOTAR:
case DOGETTARFILENAME:
dofileop(dowhat);
break;
case DOREMOTECD:
doremotecd(0);
break;
case DOREMOTECDFORCE:
doremotecd(1);
break;
case DOREMOTEDOUBLECLICK:
remote_doubleclick();
break;
case DOSCHEDULE:
doschedule();
break;
case DODIR:
case DOLS:
list_remote_dir();
break;
case DOQUIT:
exit(0);
break;
}
}
}
#ifdef USE_PROTOTYPES
void load_xdefaults(void)
#else
void load_xdefaults()
#endif
{
char *str;
int ct;
char *xapplresdir, res_file[MAXPATHLEN + 10];
char *ftptool_defaults;
char *ftptool_layout;
if ((xapplresdir = getenv("XAPPLRESDIR")) != NULL) {
sprintf(res_file, "%s/Ftptool", xapplresdir);
if (access(res_file, R_OK) == 0) {
defaults_load_db(res_file);
}
}
ftptool_defaults = find_dotfile(FTPTOOL_DEFAULTS);
if (ftptool_defaults) {
defaults_load_db(ftptool_defaults);
free(ftptool_defaults);
}
ftptool_layout = find_dotfile(FTPTOOL_LAYOUT);
if (ftptool_layout) {
defaults_load_db(ftptool_layout);
free(ftptool_layout);
}
ct = defaults_get_integer(
"openWindows.multiClickTimeout",
"OpenWindows.MultiClickTimeout", 4);
click_timeout = ct/10.0;
drag_threshold = defaults_get_integer(
"openWindows.dragThreshold", "OpenWindows.DragThreshold", 5);
logging = defaults_get_boolean(
"ftptool.LogSession", "Ftptool.LogSession", FALSE);
keepalive = defaults_get_boolean(
"ftptool.KeepConnectionAlive", "Ftptool.KeepConnectionAlive",
FALSE);
if (keepalive != FALSE)
keepalive = 1 << 1;
auto_connect = defaults_get_boolean(
"ftptool.AutoConnect", "Ftptool.AutoConnect", FALSE);
show_status = defaults_get_boolean(
"ftptool.AutoShowStatus", "Ftptool.AutoShowStatus", FALSE);
if (show_status != FALSE)
show_status = 1 << 1;
try_proxy = defaults_get_boolean(
"ftptool.TryProxy", "Ftptool.TryProxy", FALSE);
if (try_proxy != FALSE)
try_proxy = 1 << 2;
unique_local_names = defaults_get_boolean(
"ftptool.GenUniqueLocalNames", "Ftptool.GenUniqueLocalNames",
FALSE);
unique_remote_names = defaults_get_boolean(
"ftptool.GenUniqueRemoteNames", "Ftptool.GenUniqueRemoteNames",
FALSE);
if (unique_remote_names != FALSE)
unique_remote_names = 1 << 1;
str = defaults_get_string(
"ftptool.TransferMode", "Ftptool.TransferMode", "Binary");
confirmdeletes = defaults_get_boolean(
"ftptool.ConfirmDeletes", "Ftptool.ConfirmDeletes", TRUE);
confirmoverwrites = defaults_get_boolean(
"ftptool.ConfirmOverWrites", "Ftptool.ConfirmOverWrites",
FALSE);
if (confirmoverwrites != FALSE)
confirmoverwrites = 1 << 1;
dircache_size = defaults_get_integer_check(
"ftptool.DirectoryCacheSize", "Ftptool.DirectoryCacheSize",
5, 0, 20);
str = defaults_get_string(
"ftptool.SortField", "Ftptool.SortField", "Name");
remote_sort_mode = SORTBYNAME;
if (!strcmp(str, "Date"))
remote_sort_mode = SORTBYDATE;
else if (!strcmp(str, "Size"))
remote_sort_mode = SORTBYSIZE;
remote_sort_direction = defaults_get_integer(
"ftptool.SortOrder", "Ftptool.SortOrder", ASCENDING);
remote_showdotfiles = defaults_get_boolean(
"ftptool.ShowHiddenFiles", "Ftptool.ShowHiddenFiles", FALSE);
group_remote_files = defaults_get_boolean(
"ftptool.SortGrouping", "Ftptool.SortGrouping", FALSE);
str = defaults_get_string(
"ftptool.LocalSortField", "Ftptool.LocalSortField", "Name");
local_sort_mode = SORTBYNAME;
if (!strcmp(str, "Date"))
local_sort_mode = SORTBYDATE;
else if (!strcmp(str, "Size"))
local_sort_mode = SORTBYSIZE;
local_sort_direction = defaults_get_integer(
"ftptool.LocalSortOrder", "Ftptool.LocalSortOrder", ASCENDING);
local_showdotfiles = defaults_get_boolean(
"ftptool.LocalShowHiddenFiles", "Ftptool.LocalShowHiddenFiles",
FALSE);
group_local_files = defaults_get_boolean(
"ftptool.LocalSortGrouping", "Ftptool.LocalSortGrouping", FALSE);
anonftp_password = defaults_get_string(
"ftptool.InitialPassword", "Ftptool.InitialPassword",
(char *)NULL);
if (anonftp_password)
anonftp_password = strdup(anonftp_password);
default_viewer = defaults_get_string(
"ftptool.DefaultViewer", "Ftptool.DefaultViewer", "textedit %f");
default_viewer = strdup(default_viewer);
default_compressor = defaults_get_string(
"ftptool.DefaultCompressor", "Ftptool.DefaultCompressor",
"compress -vf %f");
default_compressor = strdup(default_compressor);
openlook_mode = defaults_get_boolean(
"ftptool.OpenLookMode", "Ftptool.OpenLookMode", TRUE);
ignore_case = defaults_get_boolean(
"ftptool.IgnoreCase", "Ftptool.IgnoreCase", FALSE);
/* Windows */
host_window.visible = defaults_get_boolean(
"ftptool.HostInfoVisible", "Ftptool.HostInfoVisible", FALSE);
host_window.advanced.visible = defaults_get_boolean(
"ftptool.HostInfoAdvancedVisible",
"Ftptool.HostInfoAdvancedVisible", FALSE);
local_window.visible = defaults_get_boolean(
"ftptool.LocalWindowVisible", "Ftptool.LocalWindowVisible",
FALSE);
schedule_window.visible = defaults_get_boolean(
"ftptool.BatchWindowVisible", "Ftptool.BatchWindowVisible",
FALSE);
status_window.visible = defaults_get_boolean(
"ftptool.StatusWindowVisible", "Ftptool.StatusWindowVisible",
FALSE);
strcpy(base_window.geometry,
defaults_get_string("ftptool.RemoteWindowGeometry",
"Ftptool.RemoteWindowGeometry", ""));
strcpy(local_window.geometry,
defaults_get_string("ftptool.LocalWindowGeometry",
"Ftptool.LocalWindowGeometry", ""));
strcpy(host_window.geometry,
defaults_get_string("ftptool.HostWindowGeometry",
"Ftptool.HostWindowGeometry", ""));
strcpy(schedule_window.geometry,
defaults_get_string("ftptool.BatchWindowGeometry",
"Ftptool.BatchWindowGeometry", ""));
strcpy(session_window.geometry,
defaults_get_string("ftptool.SessionWindowGeometry",
"Ftptool.SessionWindowGeometry", ""));
strcpy(status_window.geometry,
defaults_get_string("ftptool.StatusWindowGeometry",
"Ftptool.StatusWindowGeometry", ""));
}
#ifdef USE_PROTOTYPES
void set_xdefaults(void)
#else
void set_xdefaults()
#endif
{
char *str;
defaults_set_boolean("ftptool.LogSession", logging & 0x1);
defaults_set_boolean("ftptool.KeepConnectionAlive", keepalive & 0x2);
defaults_set_boolean("ftptool.GenUniqueLocalNames",
unique_local_names & 0x1);
defaults_set_boolean("ftptool.GenUniqueRemoteNames",
unique_remote_names & 0x2);
defaults_set_boolean("ftptool.ConfirmDeletes", confirmdeletes);
defaults_set_boolean("ftptool.ConfirmOverWrites",
confirmoverwrites & 0x2);
defaults_set_boolean("ftptool.AutoConnect", auto_connect & 0x1);
defaults_set_boolean("ftptool.AutoShowStatus", show_status & 0x2);
defaults_set_boolean("ftptool.TryProxy", try_proxy & 0x4);
defaults_set_integer("ftptool.DirectoryCacheSize", dircache_size);
switch (remote_sort_mode) {
default:
fprintf(stderr, "Unknown remote sort mode in set_xdefaults.\n");
/* Fall through */
case SORTBYNAME:
str = "Name";
break;
case SORTBYDATE:
str = "Date";
break;
case SORTBYSIZE:
str = "Size";
break;
}
defaults_set_string("ftptool.SortField", str);
defaults_set_integer("ftptool.SortOrder", remote_sort_direction);
defaults_set_boolean("ftptool.ShowHiddenFiles", remote_showdotfiles);
defaults_set_boolean("ftptool.SortGrouping", group_remote_files);
switch (local_sort_mode) {
default:
fprintf(stderr, "Unknown local sort mode in set_xdefaults.\n");
/* Fall through */
case SORTBYNAME:
str = "Name";
break;
case SORTBYDATE:
str = "Date";
break;
case SORTBYSIZE:
str = "Size";
break;
}
defaults_set_string("ftptool.LocalSortField", str);
defaults_set_integer("ftptool.LocalSortOrder", local_sort_direction);
defaults_set_boolean("ftptool.LocalShowHiddenFiles",
local_showdotfiles);
defaults_set_boolean("ftptool.LocalSortGrouping", group_local_files);
defaults_set_boolean("ftptool.OpenLookMode", openlook_mode);
defaults_set_string("ftptool.DefaultViewer", default_viewer);
defaults_set_string("ftptool.DefaultCompressor", default_compressor);
defaults_set_string("ftptool.InitialPassword", anonftp_password);
}
#ifdef USE_PROTOTYPES
void save_xdefaults(void)
#else
void save_xdefaults()
#endif
{
char *filename = NULL;
FILE *fp;
char *str;
char *true = "True";
char *false = "False";
filename = find_dotfile(FTPTOOL_DEFAULTS);
if (filename == NULL)
if ((filename = create_dotfile(FTPTOOL_DEFAULTS, 0644)) == NULL)
return;
if ((fp = fopen(filename, "w")) == NULL) {
footer_message("Could not save defaults: %s",
sys_errlist[errno]);
return;
}
fprintf(fp, "ftptool.AutoConnect:\t%s\n",
(auto_connect == 0) ? false : true);
fprintf(fp, "ftptool.AutoShowStatus:\t%s\n",
((show_status & 2) == 0) ? false : true);
fprintf(fp, "ftptool.ConfirmDeletes:\t%s\n",
(confirmdeletes == 0) ? false : true);
fprintf(fp, "ftptool.ConfirmOverWrites:\t%s\n",
(confirmoverwrites == 0) ? false : true);
fprintf(fp, "ftptool.DefaultCompressor:\t%s\n", default_compressor);
fprintf(fp, "ftptool.DefaultViewer:\t%s\n", default_viewer);
fprintf(fp, "ftptool.DirectoryCacheSize:\t%d\n", dircache_size);
fprintf(fp, "ftptool.GenUniqueLocalNames:\t%s\n",
((unique_local_names & 1) == 0) ? false : true);
fprintf(fp, "ftptool.GenUniqueRemoteNames:\t%s\n",
((unique_remote_names & 2) == 0) ? false : true);
fprintf(fp, "ftptool.IgnoreCase:\t%s\n",
(ignore_case == 0) ? false : true);
fprintf(fp, "ftptool.InitialPassword:\t%s\n", anonftp_password);
fprintf(fp, "ftptool.KeepConnectionAlive:\t%s\n",
((keepalive & 2) == 0) ? false : true);
fprintf(fp, "ftptool.LocalShowHiddenFiles:\t%s\n",
(local_showdotfiles == 0) ? false : true);
switch (local_sort_mode) {
default:
fprintf(stderr, "Unknown local sort mode in save_xdefaults.\n");
/* Fall through */
case SORTBYNAME:
str = "Name";
break;
case SORTBYDATE:
str = "Date";
break;
case SORTBYSIZE:
str = "Size";
break;
}
fprintf(fp, "ftptool.LocalSortField:\t%s\n", str);
fprintf(fp, "ftptool.LocalSortGrouping:\t%d\n", group_local_files);
fprintf(fp, "ftptool.LocalSortOrder:\t%d\n", local_sort_direction);
fprintf(fp, "ftptool.LogSession:\t%s\n",
((logging & 1) == 0) ? false : true);
fprintf(fp, "ftptool.OpenLookMode:\t%s\n",
(openlook_mode == 0) ? false : true);
fprintf(fp, "ftptool.ShowHiddenFiles:\t%s\n",
(remote_showdotfiles == 0) ? false : true);
switch (remote_sort_mode) {
default:
fprintf(stderr,
"Unknown remote sort mode in save_xdefaults.\n");
/* Fall through */
case SORTBYNAME:
str = "Name";
break;
case SORTBYDATE:
str = "Date";
break;
case SORTBYSIZE:
str = "Size";
break;
}
fprintf(fp, "ftptool.SortField:\t%s\n", str);
fprintf(fp, "ftptool.SortGrouping:\t%d\n", group_remote_files);
fprintf(fp, "ftptool.SortOrder:\t%d\n", remote_sort_direction);
fprintf(fp, "ftptool.TryProxy:\t%s\n",
(try_proxy == 0) ? false : true);
fclose(fp);
footer_message("Defaults saved to %s.", filename);
free(filename);
}
syntax highlighted by Code2HTML, v. 0.9.1