static Backend *back;
static void *backhandle;
+static Config cfg;
static void source(char *src);
static void rsource(char *src);
static void tell_user(FILE * stream, char *fmt, ...)
{
- char str[0x100]; /* Make the size big enough */
+ char *str, *str2;
va_list ap;
va_start(ap, fmt);
- vsprintf(str, fmt, ap);
+ str = dupvprintf(fmt, ap);
va_end(ap);
- strcat(str, "\n");
- tell_str(stream, str);
+ str2 = dupcat(str, "\n", NULL);
+ sfree(str);
+ tell_str(stream, str2);
+ sfree(str2);
}
static void gui_update_stats(char *name, unsigned long size,
*/
void fatalbox(char *fmt, ...)
{
- char str[0x100]; /* Make the size big enough */
+ char *str, *str2;
va_list ap;
va_start(ap, fmt);
- strcpy(str, "Fatal: ");
- vsprintf(str + strlen(str), fmt, ap);
+ str = dupvprintf(fmt, ap);
+ str2 = dupcat("Fatal: ", str, "\n", NULL);
+ sfree(str);
va_end(ap);
- strcat(str, "\n");
- tell_str(stderr, str);
+ tell_str(stderr, str2);
+ sfree(str2);
errs++;
if (gui_mode) {
}
void modalfatalbox(char *fmt, ...)
{
- char str[0x100]; /* Make the size big enough */
+ char *str, *str2;
va_list ap;
va_start(ap, fmt);
- strcpy(str, "Fatal: ");
- vsprintf(str + strlen(str), fmt, ap);
+ str = dupvprintf(fmt, ap);
+ str2 = dupcat("Fatal: ", str, "\n", NULL);
+ sfree(str);
va_end(ap);
- strcat(str, "\n");
- tell_str(stderr, str);
+ tell_str(stderr, str2);
+ sfree(str2);
errs++;
if (gui_mode) {
cleanup_exit(1);
}
-void connection_fatal(char *fmt, ...)
+void connection_fatal(void *frontend, char *fmt, ...)
{
- char str[0x100]; /* Make the size big enough */
+ char *str, *str2;
va_list ap;
va_start(ap, fmt);
- strcpy(str, "Fatal: ");
- vsprintf(str + strlen(str), fmt, ap);
+ str = dupvprintf(fmt, ap);
+ str2 = dupcat("Fatal: ", str, "\n", NULL);
+ sfree(str);
va_end(ap);
- strcat(str, "\n");
- tell_str(stderr, str);
+ tell_str(stderr, str2);
+ sfree(str2);
errs++;
if (gui_mode) {
extern int select_result(WPARAM, LPARAM);
/*
+ * In pscp, all agent requests should be synchronous, so this is a
+ * never-called stub.
+ */
+void agent_schedule_callback(void (*callback)(void *, void *, int),
+ void *callback_ctx, void *data, int len)
+{
+ assert(!"We shouldn't be here");
+}
+
+/*
* Receive a block of data from the SSH link. Block until all data
* is available.
*
static unsigned outlen; /* how much data required */
static unsigned char *pending = NULL; /* any spare data */
static unsigned pendlen = 0, pendsize = 0; /* length and phys. size of buffer */
-int from_backend(void *frontend, int is_stderr, char *data, int datalen)
+int from_backend(void *frontend, int is_stderr, const char *data, int datalen)
{
unsigned char *p = (unsigned char *) data;
unsigned len = (unsigned) datalen;
if (len > 0) {
if (pendsize < pendlen + len) {
pendsize = pendlen + len + 4096;
- pending = (pending ? srealloc(pending, pendsize) :
- smalloc(pendsize));
+ pending = sresize(pending, pendsize, unsigned char);
if (!pending)
fatalbox("Out of memory");
}
*/
static void bump(char *fmt, ...)
{
- char str[0x100]; /* Make the size big enough */
+ char *str, *str2;
va_list ap;
va_start(ap, fmt);
- strcpy(str, "Fatal: ");
- vsprintf(str + strlen(str), fmt, ap);
+ str = dupvprintf(fmt, ap);
va_end(ap);
- strcat(str, "\n");
- tell_str(stderr, str);
+ str2 = dupcat(str, "\n", NULL);
+ sfree(str);
+ tell_str(stderr, str2);
+ sfree(str2);
errs++;
if (back != NULL && back->socket(backhandle) != NULL) {
*/
static void do_cmd(char *host, char *user, char *cmd)
{
- char *err, *realhost;
+ const char *err;
+ char *realhost;
DWORD namelen;
if (host == NULL || host[0] == '\0')
/*
* Enact command-line overrides.
*/
- cmdline_run_saved();
+ cmdline_run_saved(&cfg);
/*
* Trim leading whitespace off the hostname if it's there.
namelen = 0;
if (GetUserName(user, &namelen) == FALSE)
bump("Empty user name");
- user = smalloc(namelen * sizeof(char));
+ user = snewn(namelen, char);
GetUserName(user, &namelen);
if (verbose)
tell_user(stderr, "Guessing user name: %s", user);
back = &ssh_backend;
- err = back->init(NULL, &backhandle, cfg.host, cfg.port, &realhost, 0);
+ err = back->init(NULL, &backhandle, &cfg, cfg.host, cfg.port, &realhost,0);
if (err != NULL)
bump("ssh_init: %s", err);
+ logctx = log_init(NULL, &cfg);
+ back->provide_logctx(backhandle, logctx);
+ console_provide_logctx(logctx);
ssh_scp_init();
if (verbose && realhost != NULL)
tell_user(stderr, "Connected to %s\n", realhost);
if (nnames + names->nnames >= namesize) {
namesize += names->nnames + 128;
- ournames =
- srealloc(ournames, namesize * sizeof(*ournames));
+ ournames = sresize(ournames, namesize, struct fxp_name);
}
for (i = 0; i < names->nnames; i++)
* wildcardness comes before the final slash) and arrange
* things so that a dirstack entry will be set up.
*/
- newsource = smalloc(1+strlen(source));
+ newsource = snewn(1+strlen(source), char);
if (!wc_unescape(newsource, source)) {
/* Yes, here we go; it's a wildcard. Bah. */
char *dupsource, *lastpart, *dirpart, *wildcard;
* wildcard escapes from the directory part, throwing
* an error if it contains a real wildcard.
*/
- dirpart = smalloc(1+strlen(dupsource));
+ dirpart = snewn(1+strlen(dupsource), char);
if (!wc_unescape(dirpart, dupsource)) {
tell_user(stderr, "%s: multiple-level wildcards unsupported",
source);
}
if (nnames + names->nnames >= namesize) {
namesize += names->nnames + 128;
- ournames =
- srealloc(ournames, namesize * sizeof(*ournames));
+ ournames = sresize(ournames, namesize, struct fxp_name);
}
for (i = 0; i < names->nnames; i++)
ournames[nnames++] = names->names[i];
}
fxp_close(dirhandle);
- newitem = smalloc(sizeof(struct scp_sftp_dirstack));
+ newitem = snew(struct scp_sftp_dirstack);
newitem->next = scp_sftp_dirstack_head;
newitem->names = ournames;
newitem->namepos = 0;
bump("Lost connection");
if (i >= bufsize) {
bufsize = i + 128;
- act->buf = srealloc(act->buf, bufsize);
+ act->buf = sresize(act->buf, bufsize, char);
}
act->buf[i++] = ch;
} while (ch != '\n');
*/
static void run_err(const char *fmt, ...)
{
- char str[2048];
+ char *str, *str2;
va_list ap;
va_start(ap, fmt);
errs++;
- strcpy(str, "scp: ");
- vsprintf(str + strlen(str), fmt, ap);
- strcat(str, "\n");
- scp_send_errmsg(str);
- tell_user(stderr, "%s", str);
+ str = dupvprintf(fmt, ap);
+ str2 = dupcat("scp: ", str, "\n", NULL);
+ sfree(str);
+ scp_send_errmsg(str2);
+ tell_user(stderr, "%s", str2);
va_end(ap);
+ sfree(str2);
}
/*
FindClose(fh);
}
- cmd = smalloc(strlen(targ) + 100);
- sprintf(cmd, "scp%s%s%s%s -t %s",
- verbose ? " -v" : "",
- recursive ? " -r" : "",
- preserve ? " -p" : "",
- targetshouldbedirectory ? " -d" : "", targ);
+ cmd = dupprintf("scp%s%s%s%s -t %s",
+ verbose ? " -v" : "",
+ recursive ? " -r" : "",
+ preserve ? " -p" : "",
+ targetshouldbedirectory ? " -d" : "", targ);
do_cmd(host, user, cmd);
sfree(cmd);
user = NULL;
}
- cmd = smalloc(strlen(src) + 100);
- sprintf(cmd, "scp%s%s%s%s -f %s",
- verbose ? " -v" : "",
- recursive ? " -r" : "",
- preserve ? " -p" : "",
- targetshouldbedirectory ? " -d" : "", src);
+ cmd = dupprintf("scp%s%s%s%s -f %s",
+ verbose ? " -v" : "",
+ recursive ? " -r" : "",
+ preserve ? " -p" : "",
+ targetshouldbedirectory ? " -d" : "", src);
do_cmd(host, user, cmd);
sfree(cmd);
user = NULL;
}
- cmd = smalloc(4 * strlen(src) + 100);
+ cmd = snewn(4 * strlen(src) + 100, char);
strcpy(cmd, "ls -la '");
p = cmd + strlen(cmd);
for (q = src; *q; q++) {
va_start(ap, p);
vfprintf(stderr, p, ap);
va_end(ap);
- fputc('\n', stderr);
+ fprintf(stderr, "\n try typing just \"pscp\" for help\n");
exit(1);
}
default_protocol = PROT_TELNET;
- flags = FLAG_STDERR;
+ flags = FLAG_STDERR | FLAG_SYNCAGENT;
cmdline_tooltype = TOOLTYPE_FILETRANSFER;
ssh_get_line = &console_get_line;
init_winsock();
int ret;
if (argv[i][0] != '-')
break;
- ret = cmdline_process_param(argv[i], i+1<argc?argv[i+1]:NULL, 1);
+ ret = cmdline_process_param(argv[i], i+1<argc?argv[i+1]:NULL, 1, &cfg);
if (ret == -2) {
cmdline_error("option \"%s\" requires an argument", argv[i]);
} else if (ret == 2) {
} else if (strcmp(argv[i], "--") == 0) {
i++;
break;
- } else
- usage();
+ } else {
+ cmdline_error("unknown option \"%s\"", argv[i]);
+ }
}
argc -= i;
argv += i;