mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-06-30 11:02:48 -05:00
Turn 'Filename' into a dynamically allocated type with no arbitrary
length limit, just as I did to FontSpec yesterday. [originally from svn r9316]
This commit is contained in:
@ -906,24 +906,22 @@ void dlg_label_change(union control *ctrl, void *dlg, char const *text)
|
||||
}
|
||||
}
|
||||
|
||||
void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn)
|
||||
void dlg_filesel_set(union control *ctrl, void *dlg, Filename *fn)
|
||||
{
|
||||
struct dlgparam *dp = (struct dlgparam *)dlg;
|
||||
struct uctrl *uc = dlg_find_byctrl(dp, ctrl);
|
||||
assert(uc->ctrl->generic.type == CTRL_FILESELECT);
|
||||
assert(uc->entry != NULL);
|
||||
gtk_entry_set_text(GTK_ENTRY(uc->entry), fn.path);
|
||||
gtk_entry_set_text(GTK_ENTRY(uc->entry), fn->path);
|
||||
}
|
||||
|
||||
void dlg_filesel_get(union control *ctrl, void *dlg, Filename *fn)
|
||||
Filename *dlg_filesel_get(union control *ctrl, void *dlg)
|
||||
{
|
||||
struct dlgparam *dp = (struct dlgparam *)dlg;
|
||||
struct uctrl *uc = dlg_find_byctrl(dp, ctrl);
|
||||
assert(uc->ctrl->generic.type == CTRL_FILESELECT);
|
||||
assert(uc->entry != NULL);
|
||||
strncpy(fn->path, gtk_entry_get_text(GTK_ENTRY(uc->entry)),
|
||||
lenof(fn->path));
|
||||
fn->path[lenof(fn->path)-1] = '\0';
|
||||
return filename_from_str(gtk_entry_get_text(GTK_ENTRY(uc->entry)));
|
||||
}
|
||||
|
||||
void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec *fs)
|
||||
@ -3741,7 +3739,7 @@ void logevent_dlg(void *estuff, const char *string)
|
||||
es->nevents++;
|
||||
}
|
||||
|
||||
int askappend(void *frontend, Filename filename,
|
||||
int askappend(void *frontend, Filename *filename,
|
||||
void (*callback)(void *ctx, int result), void *ctx)
|
||||
{
|
||||
static const char msgtemplate[] =
|
||||
@ -3753,7 +3751,7 @@ int askappend(void *frontend, Filename filename,
|
||||
char *mbtitle;
|
||||
int mbret;
|
||||
|
||||
message = dupprintf(msgtemplate, FILENAME_MAX, filename.path);
|
||||
message = dupprintf(msgtemplate, FILENAME_MAX, filename->path);
|
||||
mbtitle = dupprintf("%s Log to File", appname);
|
||||
|
||||
mbret = messagebox(get_window(frontend), mbtitle, message,
|
||||
|
@ -159,14 +159,12 @@ FontSpec *platform_default_fontspec(const char *name)
|
||||
return fontspec_new("");
|
||||
}
|
||||
|
||||
Filename platform_default_filename(const char *name)
|
||||
Filename *platform_default_filename(const char *name)
|
||||
{
|
||||
Filename ret;
|
||||
if (!strcmp(name, "LogFileName"))
|
||||
strcpy(ret.path, "putty.log");
|
||||
return filename_from_str("putty.log");
|
||||
else
|
||||
*ret.path = '\0';
|
||||
return ret;
|
||||
return filename_from_str("");
|
||||
}
|
||||
|
||||
char *platform_default_s(const char *name)
|
||||
@ -2648,13 +2646,13 @@ int do_cmdline(int argc, char **argv, int do_everything, int *allow_launch,
|
||||
conf_set_str(conf, CONF_wintitle, val);
|
||||
|
||||
} else if (!strcmp(p, "-log")) {
|
||||
Filename fn;
|
||||
Filename *fn;
|
||||
EXPECTS_ARG;
|
||||
SECOND_PASS_ONLY;
|
||||
strncpy(fn.path, val, sizeof(fn.path));
|
||||
fn.path[sizeof(fn.path)-1] = '\0';
|
||||
conf_set_filename(conf, CONF_logfilename, &fn);
|
||||
fn = filename_from_str(val);
|
||||
conf_set_filename(conf, CONF_logfilename, fn);
|
||||
conf_set_int(conf, CONF_logtype, LGTYP_DEBUG);
|
||||
filename_free(fn);
|
||||
|
||||
} else if (!strcmp(p, "-ut-") || !strcmp(p, "+ut")) {
|
||||
SECOND_PASS_ONLY;
|
||||
|
@ -13,9 +13,9 @@
|
||||
#include "charset.h"
|
||||
|
||||
struct Filename {
|
||||
char path[FILENAME_MAX];
|
||||
char *path;
|
||||
};
|
||||
FILE *f_open(struct Filename, char const *, int);
|
||||
FILE *f_open(const struct Filename *, char const *, int);
|
||||
|
||||
struct FontSpec {
|
||||
char *name; /* may be "" to indicate no selected font at all */
|
||||
|
@ -235,7 +235,7 @@ int askalg(void *frontend, const char *algtype, const char *algname,
|
||||
* Ask whether to wipe a session log file before writing to it.
|
||||
* Returns 2 for wipe, 1 for append, 0 for cancel (don't log).
|
||||
*/
|
||||
int askappend(void *frontend, Filename filename,
|
||||
int askappend(void *frontend, Filename *filename,
|
||||
void (*callback)(void *ctx, int result), void *ctx)
|
||||
{
|
||||
static const char msgtemplate[] =
|
||||
@ -256,11 +256,11 @@ int askappend(void *frontend, Filename filename,
|
||||
|
||||
premsg(&cf);
|
||||
if (console_batch_mode) {
|
||||
fprintf(stderr, msgtemplate_batch, FILENAME_MAX, filename.path);
|
||||
fprintf(stderr, msgtemplate_batch, FILENAME_MAX, filename->path);
|
||||
fflush(stderr);
|
||||
return 0;
|
||||
}
|
||||
fprintf(stderr, msgtemplate, FILENAME_MAX, filename.path);
|
||||
fprintf(stderr, msgtemplate, FILENAME_MAX, filename->path);
|
||||
fflush(stderr);
|
||||
|
||||
{
|
||||
|
@ -27,27 +27,58 @@ unsigned long getticks(void)
|
||||
return tv.tv_sec * 1000 + tv.tv_usec / 1000 + tickcount_offset;
|
||||
}
|
||||
|
||||
Filename filename_from_str(const char *str)
|
||||
Filename *filename_from_str(const char *str)
|
||||
{
|
||||
Filename ret;
|
||||
strncpy(ret.path, str, sizeof(ret.path));
|
||||
ret.path[sizeof(ret.path)-1] = '\0';
|
||||
Filename *ret = snew(Filename);
|
||||
ret->path = dupstr(str);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Filename *filename_copy(const Filename *fn)
|
||||
{
|
||||
return filename_from_str(fn->path);
|
||||
}
|
||||
|
||||
const char *filename_to_str(const Filename *fn)
|
||||
{
|
||||
return fn->path;
|
||||
}
|
||||
|
||||
int filename_equal(Filename f1, Filename f2)
|
||||
int filename_equal(const Filename *f1, const Filename *f2)
|
||||
{
|
||||
return !strcmp(f1.path, f2.path);
|
||||
return !strcmp(f1->path, f2->path);
|
||||
}
|
||||
|
||||
int filename_is_null(Filename fn)
|
||||
int filename_is_null(const Filename *fn)
|
||||
{
|
||||
return !*fn.path;
|
||||
return !fn->path[0];
|
||||
}
|
||||
|
||||
void filename_free(Filename *fn)
|
||||
{
|
||||
sfree(fn->path);
|
||||
sfree(fn);
|
||||
}
|
||||
|
||||
int filename_serialise(const Filename *f, void *vdata)
|
||||
{
|
||||
char *data = (char *)vdata;
|
||||
int len = strlen(f->path) + 1; /* include trailing NUL */
|
||||
if (data) {
|
||||
strcpy(data, f->path);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
Filename *filename_deserialise(void *vdata, int maxsize, int *used)
|
||||
{
|
||||
char *data = (char *)vdata;
|
||||
char *end;
|
||||
end = memchr(data, '\0', maxsize);
|
||||
if (!end)
|
||||
return NULL;
|
||||
end++;
|
||||
*used = end - data;
|
||||
return filename_from_str(data);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
@ -135,16 +166,15 @@ int cloexec(int fd) {
|
||||
return fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC);
|
||||
}
|
||||
|
||||
FILE *f_open(struct Filename filename, char const *mode, int is_private)
|
||||
FILE *f_open(const Filename *filename, char const *mode, int is_private)
|
||||
{
|
||||
if (!is_private) {
|
||||
return fopen(filename.path, mode);
|
||||
return fopen(filename->path, mode);
|
||||
} else {
|
||||
int fd;
|
||||
assert(mode[0] == 'w'); /* is_private is meaningless for read,
|
||||
and tricky for append */
|
||||
fd = open(filename.path, O_WRONLY | O_CREAT | O_TRUNC,
|
||||
0700);
|
||||
fd = open(filename->path, O_WRONLY | O_CREAT | O_TRUNC, 0700);
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
return fdopen(fd, mode);
|
||||
|
@ -130,14 +130,12 @@ FontSpec *platform_default_fontspec(const char *name)
|
||||
return fontspec_new("");
|
||||
}
|
||||
|
||||
Filename platform_default_filename(const char *name)
|
||||
Filename *platform_default_filename(const char *name)
|
||||
{
|
||||
Filename ret;
|
||||
if (!strcmp(name, "LogFileName"))
|
||||
strcpy(ret.path, "putty.log");
|
||||
return filename_from_str("putty.log");
|
||||
else
|
||||
*ret.path = '\0';
|
||||
return ret;
|
||||
return filename_from_str("");
|
||||
}
|
||||
|
||||
char *x_get_default(const char *key)
|
||||
|
@ -58,14 +58,12 @@ FontSpec *platform_default_fontspec(const char *name)
|
||||
return fontspec_new("");
|
||||
}
|
||||
|
||||
Filename platform_default_filename(const char *name)
|
||||
Filename *platform_default_filename(const char *name)
|
||||
{
|
||||
Filename ret;
|
||||
if (!strcmp(name, "LogFileName"))
|
||||
strcpy(ret.path, "putty.log");
|
||||
return filename_from_str("putty.log");
|
||||
else
|
||||
*ret.path = '\0';
|
||||
return ret;
|
||||
return filename_from_str("");
|
||||
}
|
||||
|
||||
char *get_ttymode(void *frontend, const char *mode) { return NULL; }
|
||||
|
@ -395,16 +395,15 @@ FontSpec *read_setting_fontspec(void *handle, const char *name)
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
int read_setting_filename(void *handle, const char *name, Filename *result)
|
||||
Filename *read_setting_filename(void *handle, const char *name)
|
||||
{
|
||||
char *tmp = read_setting_s(handle, name);
|
||||
if (tmp) {
|
||||
strncpy(result->path, tmp, sizeof(result->path)-1);
|
||||
result->path[sizeof(result->path)-1] = '\0';
|
||||
Filename *ret = filename_from_str(tmp);
|
||||
sfree(tmp);
|
||||
return TRUE;
|
||||
return ret;
|
||||
} else
|
||||
return FALSE;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void write_setting_fontspec(void *handle, const char *name, FontSpec *fs)
|
||||
@ -418,9 +417,9 @@ void write_setting_fontspec(void *handle, const char *name, FontSpec *fs)
|
||||
write_setting_s(handle, suffname, fs->name);
|
||||
sfree(suffname);
|
||||
}
|
||||
void write_setting_filename(void *handle, const char *name, Filename result)
|
||||
void write_setting_filename(void *handle, const char *name, Filename *result)
|
||||
{
|
||||
write_setting_s(handle, name, result.path);
|
||||
write_setting_s(handle, name, result->path);
|
||||
}
|
||||
|
||||
void close_settings_r(void *handle)
|
||||
|
Reference in New Issue
Block a user