1
0
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:
Simon Tatham
2011-10-02 11:01:57 +00:00
parent 342690f7cb
commit 62cbc7dc0b
29 changed files with 289 additions and 234 deletions

View File

@ -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,

View File

@ -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;

View File

@ -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 */

View File

@ -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);
{

View File

@ -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);

View File

@ -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)

View File

@ -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; }

View File

@ -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)