for pointing it out).
git-svn-id: http://svn.tartarus.org/sgt/putty@1612
cda61777-01e9-0310-a592-
d414129be87e
*/
static int sftp_ls_compare(const void *av, const void *bv)
{
*/
static int sftp_ls_compare(const void *av, const void *bv)
{
- const struct fxp_name *a = (const struct fxp_name *) av;
- const struct fxp_name *b = (const struct fxp_name *) bv;
- return strcmp(a->filename, b->filename);
+ const struct fxp_name *const *a = (const struct fxp_name *const *) av;
+ const struct fxp_name *const *b = (const struct fxp_name *const *) bv;
+ return strcmp((*a)->filename, (*b)->filename);
}
int sftp_cmd_ls(struct sftp_command *cmd)
{
struct fxp_handle *dirh;
struct fxp_names *names;
}
int sftp_cmd_ls(struct sftp_command *cmd)
{
struct fxp_handle *dirh;
struct fxp_names *names;
- struct fxp_name *ournames;
+ struct fxp_name **ournames;
int nnames, namesize;
char *dir, *cdir;
int i;
int nnames, namesize;
char *dir, *cdir;
int i;
}
for (i = 0; i < names->nnames; i++)
}
for (i = 0; i < names->nnames; i++)
- ournames[nnames++] = names->names[i];
+ ournames[nnames++] = fxp_dup_name(&names->names[i]);
- names->nnames = 0; /* prevent free_names */
fxp_free_names(names);
}
fxp_close(dirh);
fxp_free_names(names);
}
fxp_close(dirh);
- for (i = 0; i < nnames; i++)
- printf("%s\n", ournames[i].longname);
+ for (i = 0; i < nnames; i++) {
+ printf("%s\n", ournames[i]->longname);
+ fxp_free_name(ournames[i]);
+ }
+ sfree(ournames);
sfree(names->names);
sfree(names);
}
sfree(names->names);
sfree(names);
}
+
+/*
+ * Duplicate an fxp_name structure.
+ */
+struct fxp_name *fxp_dup_name(struct fxp_name *name)
+{
+ struct fxp_name *ret;
+ ret = smalloc(sizeof(struct fxp_name));
+ ret->filename = dupstr(name->filename);
+ ret->longname = dupstr(name->longname);
+ ret->attrs = name->attrs; /* structure copy */
+ return ret;
+}
+
+/*
+ * Free up an fxp_name structure.
+ */
+void fxp_free_name(struct fxp_name *name)
+{
+ int i;
+
+ sfree(name->filename);
+ sfree(name->longname);
+ sfree(name);
+}
* Free up an fxp_names structure.
*/
void fxp_free_names(struct fxp_names *names);
* Free up an fxp_names structure.
*/
void fxp_free_names(struct fxp_names *names);
+
+/*
+ * Duplicate and free fxp_name structures.
+ */
+struct fxp_name *fxp_dup_name(struct fxp_name *name);
+void fxp_free_name(struct fxp_name *name);