aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Janouch <p.janouch@gmail.com>2016-12-30 08:30:59 +0100
committerPřemysl Janouch <p.janouch@gmail.com>2016-12-30 08:30:59 +0100
commit5b05b96ec0cbef6ed10adb1423cdedde09ee868e (patch)
tree69e15ab41f5367d07c2d1cff8d06d1022c7c0d7a
parenta9b41e41b7789924465a7e5596a463ed93d8fc26 (diff)
downloadtermo-5b05b96ec0cbef6ed10adb1423cdedde09ee868e.tar.gz
termo-5b05b96ec0cbef6ed10adb1423cdedde09ee868e.tar.xz
termo-5b05b96ec0cbef6ed10adb1423cdedde09ee868e.zip
Backport TERMKEY_FLAG_NOSTART and fix two leaks
...that are notably still present in the original library.
-rw-r--r--README.adoc2
-rw-r--r--termo.c21
-rw-r--r--termo.h4
3 files changed, 14 insertions, 13 deletions
diff --git a/README.adoc b/README.adoc
index 136f893..3252c4e 100644
--- a/README.adoc
+++ b/README.adoc
@@ -39,7 +39,7 @@ statically linked against the library, and hence they can be run as they are:
What's Different From the Original termkey?
-------------------------------------------
-The main change is throwing away any UTF-8 dependent code, making the library
+The main change is throwing out any UTF-8 dependent code, making the library
capable of handling all unibyte and multibyte encodings supported by iconv on
your system. The characters are still presented as Unicode in the end, however,
as the other sensible option is wchar_t and that doesn't really work well, see
diff --git a/termo.c b/termo.c
index 469af1d..d72a4f5 100644
--- a/termo.c
+++ b/termo.c
@@ -425,12 +425,12 @@ termo_new (int fd, const char *encoding, int flags)
termo_set_flags (tk, flags);
const char *term = getenv ("TERM");
- if (termo_init (tk, term, encoding)
- && termo_start (tk))
+ if (!termo_init (tk, term, encoding))
+ free (tk);
+ else if (!(flags & TERMO_FLAG_NOSTART) && !termo_start (tk))
+ termo_free (tk);
+ else
return tk;
-
- // FIXME: resource leak on termo_start() failure
- free (tk);
return NULL;
}
@@ -445,13 +445,12 @@ termo_new_abstract (const char *term, const char *encoding, int flags)
termo_set_flags (tk, flags);
if (!termo_init (tk, term, encoding))
- {
free (tk);
- return NULL;
- }
-
- termo_start (tk);
- return tk;
+ else if (!(flags & TERMO_FLAG_NOSTART) && !termo_start (tk))
+ termo_free (tk);
+ else
+ return tk;
+ return NULL;
}
void
diff --git a/termo.h b/termo.h
index f32d5f8..32eda4f 100644
--- a/termo.h
+++ b/termo.h
@@ -192,7 +192,9 @@ enum
// Allow Ctrl-C to be read as normal, disabling SIGINT
TERMO_FLAG_CTRLC = 1 << 6,
// Return ERROR on signal (EINTR) rather than retry
- TERMO_FLAG_EINTR = 1 << 7
+ TERMO_FLAG_EINTR = 1 << 7,
+ // Do not call termkey_start() in constructor
+ TERMO_FLAG_NOSTART = 1 << 8
};
enum