Index: aim.c
===================================================================
--- aim.c	(revision 6b0b4f45d70ff57070fe617e46583f01ca1d8f78)
+++ aim.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -437,5 +437,5 @@
 
 /* caller must free the return */
-char *owl_aim_normalize_screenname(const char *in)
+G_GNUC_WARN_UNUSED_RESULT char *owl_aim_normalize_screenname(const char *in)
 {
   char *out;
Index: cmd.c
===================================================================
--- cmd.c	(revision aad166ad0f5eceb67f7f3b3f5866425dc5305b24)
+++ cmd.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -9,7 +9,8 @@
 /**************************************************************************/
 
-int owl_cmddict_setup(owl_cmddict *cd) {
+void owl_cmddict_setup(owl_cmddict *cd)
+{
   owl_cmddict_init(cd);
-  return owl_cmd_add_defaults(cd);
+  owl_cmd_add_defaults(cd);
 }
 
@@ -19,12 +20,10 @@
 
 /* for bulk initialization at startup */
-int owl_cmddict_add_from_list(owl_cmddict *cd, const owl_cmd *cmds) {
+void owl_cmddict_add_from_list(owl_cmddict *cd, const owl_cmd *cmds)
+{
   const owl_cmd *cur;
-  int ret = 0;
   for (cur = cmds; cur->name != NULL; cur++) {
-    ret = owl_cmddict_add_cmd(cd, cur);
-    if (ret < 0) break;
-  }
-  return ret;
+    owl_cmddict_add_cmd(cd, cur);
+  }
 }
 
@@ -38,5 +37,5 @@
 
 /* creates a new command alias */
-int owl_cmddict_add_alias(owl_cmddict *cd, const char *alias_from, const char *alias_to) {
+void owl_cmddict_add_alias(owl_cmddict *cd, const char *alias_from, const char *alias_to) {
   owl_cmd *cmd;
   cmd = g_new(owl_cmd, 1);
@@ -44,5 +43,4 @@
   owl_perlconfig_new_command(cmd->name);
   owl_dict_insert_element(cd, cmd->name, cmd, (void (*)(void *))owl_cmd_delete);
-  return(0);
 }
 
@@ -57,5 +55,7 @@
 }
 
-char *_owl_cmddict_execute(const owl_cmddict *cd, const owl_context *ctx, const char *const *argv, int argc, const char *buff) {
+/* caller must free the return */
+G_GNUC_WARN_UNUSED_RESULT char *_owl_cmddict_execute(const owl_cmddict *cd, const owl_context *ctx, const char *const *argv, int argc, const char *buff)
+{
   char *retval = NULL;
   const owl_cmd *cmd;
@@ -72,5 +72,7 @@
 }
 
-char *owl_cmddict_execute(const owl_cmddict *cd, const owl_context *ctx, const char *cmdbuff) {
+/* caller must free the return */
+G_GNUC_WARN_UNUSED_RESULT char *owl_cmddict_execute(const owl_cmddict *cd, const owl_context *ctx, const char *cmdbuff)
+{
   char **argv;
   int argc;
@@ -94,5 +96,7 @@
 }
 
-char *owl_cmddict_execute_argv(const owl_cmddict *cd, const owl_context *ctx, const char *const *argv, int argc) {
+/* caller must free the return */
+G_GNUC_WARN_UNUSED_RESULT char *owl_cmddict_execute_argv(const owl_cmddict *cd, const owl_context *ctx, const char *const *argv, int argc)
+{
   char *buff;
   char *retval = NULL;
@@ -121,10 +125,9 @@
 }
 
-int owl_cmd_create_alias(owl_cmd *cmd, const char *name, const char *aliased_to) {
+void owl_cmd_create_alias(owl_cmd *cmd, const char *name, const char *aliased_to) {
   memset(cmd, 0, sizeof(owl_cmd));
   cmd->name = g_strdup(name);
   cmd->cmd_aliased_to = g_strdup(aliased_to);
   cmd->summary = g_strdup_printf("%s%s", OWL_CMD_ALIAS_SUMMARY_PREFIX, aliased_to);
-  return(0);
 }
 
@@ -150,5 +153,7 @@
 }
 
-char *owl_cmd_execute(const owl_cmd *cmd, const owl_cmddict *cd, const owl_context *ctx, int argc, const char *const *argv, const char *cmdbuff) {
+/* caller must free the result */
+G_GNUC_WARN_UNUSED_RESULT char *owl_cmd_execute(const owl_cmd *cmd, const owl_cmddict *cd, const owl_context *ctx, int argc, const char *const *argv, const char *cmdbuff)
+{
   static int alias_recurse_depth = 0;
   int ival=0;
@@ -223,5 +228,6 @@
 
 /* returns a summary line describing this keymap.  the caller must free. */
-char *owl_cmd_describe(const owl_cmd *cmd) {
+G_GNUC_WARN_UNUSED_RESULT char *owl_cmd_describe(const owl_cmd *cmd)
+{
   if (!cmd || !cmd->name || !cmd->summary) return NULL;
   return g_strdup_printf("%-25s - %s", cmd->name, cmd->summary);
Index: commands.c
===================================================================
--- commands.c	(revision 7c80ea420a376203debe78b3474db80337ac8d1b)
+++ commands.c	(revision 7c80ea420a376203debe78b3474db80337ac8d1b)
@@ -41,5 +41,5 @@
 
 
-int owl_cmd_add_defaults(owl_cmddict *cd)
+void owl_cmd_add_defaults(owl_cmddict *cd)
 {
   owl_cmd commands_to_init[] = {
@@ -1040,9 +1040,8 @@
   };
 
-  int ret = owl_cmddict_add_from_list(cd, commands_to_init);
+  owl_cmddict_add_from_list(cd, commands_to_init);
   owl_cmd *cmd;
   for (cmd = commands_to_init; cmd->name != NULL; cmd++)
     owl_cmd_cleanup(cmd);
-  return ret;
 }
 
@@ -1374,5 +1373,5 @@
 }
 
-char *owl_command_smartfilter(int argc, const char *const *argv, const char *buff)
+G_GNUC_WARN_UNUSED_RESULT char *owl_command_smartfilter(int argc, const char *const *argv, const char *buff)
 {
   char *filtname = NULL;
@@ -1414,5 +1413,5 @@
 }
 
-char *owl_command_get_shift(int argc, const char *const *argv, const char *buff)
+G_GNUC_WARN_UNUSED_RESULT char *owl_command_get_shift(int argc, const char *const *argv, const char *buff)
 {
   if(argc != 1)
@@ -1645,35 +1644,35 @@
 
 
-char *owl_command_exec(int argc, const char *const *argv, const char *buff)
+G_GNUC_WARN_UNUSED_RESULT char *owl_command_exec(int argc, const char *const *argv, const char *buff)
 {
   return owl_function_exec(argc, argv, buff, OWL_OUTPUT_RETURN);
 }
 
-char *owl_command_pexec(int argc, const char *const *argv, const char *buff)
+G_GNUC_WARN_UNUSED_RESULT char *owl_command_pexec(int argc, const char *const *argv, const char *buff)
 {
   return owl_function_exec(argc, argv, buff, OWL_OUTPUT_POPUP);
 }
 
-char *owl_command_aexec(int argc, const char *const *argv, const char *buff)
+G_GNUC_WARN_UNUSED_RESULT char *owl_command_aexec(int argc, const char *const *argv, const char *buff)
 {
   return owl_function_exec(argc, argv, buff, OWL_OUTPUT_ADMINMSG);
 }
 
-char *owl_command_perl(int argc, const char *const *argv, const char *buff)
+G_GNUC_WARN_UNUSED_RESULT char *owl_command_perl(int argc, const char *const *argv, const char *buff)
 {
   return owl_function_perl(argc, argv, buff, OWL_OUTPUT_RETURN);
 }
 
-char *owl_command_pperl(int argc, const char *const *argv, const char *buff)
+G_GNUC_WARN_UNUSED_RESULT char *owl_command_pperl(int argc, const char *const *argv, const char *buff)
 {
   return owl_function_perl(argc, argv, buff, OWL_OUTPUT_POPUP);
 }
 
-char *owl_command_aperl(int argc, const char *const *argv, const char *buff)
+G_GNUC_WARN_UNUSED_RESULT char *owl_command_aperl(int argc, const char *const *argv, const char *buff)
 {
   return owl_function_perl(argc, argv, buff, OWL_OUTPUT_ADMINMSG);
 }
 
-char *owl_command_multi(int argc, const char *const *argv, const char *buff)
+G_GNUC_WARN_UNUSED_RESULT char *owl_command_multi(int argc, const char *const *argv, const char *buff)
 {
   char *lastrv = NULL, *newbuff;
@@ -2595,5 +2594,5 @@
 }
 
-char *owl_command_getstyle(int argc, const char *const *argv, const char *buff)
+G_GNUC_WARN_UNUSED_RESULT char *owl_command_getstyle(int argc, const char *const *argv, const char *buff)
 {
   const char *stylename;
@@ -2638,5 +2637,5 @@
 }
 
-char *owl_command_with_history(int argc, const char *const *argv, const char *buff)
+G_GNUC_WARN_UNUSED_RESULT char *owl_command_with_history(int argc, const char *const *argv, const char *buff)
 {
   owl_history *hist;
Index: context.c
===================================================================
--- context.c	(revision d4927a70549407fe7f56b4ae1d3949663a370205)
+++ context.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -6,5 +6,5 @@
 
 /* TODO: dependency from owl_context -> owl_window is annoying. */
-owl_context *owl_context_new(int mode, void *data, const char *keymap, owl_window *cursor)
+G_GNUC_WARN_UNUSED_RESULT owl_context *owl_context_new(int mode, void *data, const char *keymap, owl_window *cursor)
 {
   owl_context *c;
Index: dict.c
===================================================================
--- dict.c	(revision 4c7c21f786a0416a755645b78db0b851f75f8748)
+++ dict.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -107,5 +107,6 @@
 /* Doesn't free the value of the element, but does
  * return it so the caller can free it. */
-void *owl_dict_remove_element(owl_dict *d, const char *k) {
+G_GNUC_WARN_UNUSED_RESULT void *owl_dict_remove_element(owl_dict *d, const char *k)
+{
   int i;
   int pos, found;
Index: editcontext.c
===================================================================
--- editcontext.c	(revision 4a41f1621e8d6055c8a4ac848f34ea1acbf0ba0e)
+++ editcontext.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -8,5 +8,5 @@
 }
 
-owl_context *owl_editcontext_new(int mode, owl_editwin *e, const char *keymap, void (*deactivate_cb)(owl_context*), void *cbdata)
+G_GNUC_WARN_UNUSED_RESULT owl_context *owl_editcontext_new(int mode, owl_editwin *e, const char *keymap, void (*deactivate_cb)(owl_context*), void *cbdata)
 {
   owl_context *ctx = owl_context_new(mode, owl_editwin_ref(e), keymap,
Index: editwin.c
===================================================================
--- editwin.c	(revision 3b8a563ae4e07b1064fe005714793565ac720dc4)
+++ editwin.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -61,5 +61,5 @@
 static const char *oe_copy_buf(owl_editwin *e, const char *buf, int len);
 static int oe_copy_region(owl_editwin *e);
-static char *oe_chunk(owl_editwin *e, int start, int end);
+static G_GNUC_WARN_UNUSED_RESULT char *oe_chunk(owl_editwin *e, int start, int end);
 static void oe_destroy_cbdata(owl_editwin *e);
 static void oe_dirty(owl_editwin *e);
@@ -70,5 +70,5 @@
 #define WHITESPACE " \n\t"
 
-static owl_editwin *owl_editwin_allocate(void)
+static G_GNUC_WARN_UNUSED_RESULT owl_editwin *owl_editwin_allocate(void)
 {
   owl_editwin *e = g_new0(owl_editwin, 1);
@@ -142,5 +142,5 @@
 }
 
-owl_editwin *owl_editwin_new(owl_window *win, int winlines, int wincols, int style, owl_history *hist)
+G_GNUC_WARN_UNUSED_RESULT owl_editwin *owl_editwin_new(owl_window *win, int winlines, int wincols, int style, owl_history *hist)
 {
   owl_editwin *e = owl_editwin_allocate();
@@ -1369,5 +1369,5 @@
 }
 
-char *owl_editwin_get_region(owl_editwin *e)
+G_GNUC_WARN_UNUSED_RESULT char *owl_editwin_get_region(owl_editwin *e)
 {
   int start, end;
@@ -1388,5 +1388,5 @@
 }
 
-static char *oe_chunk(owl_editwin *e, int start, int end)
+static G_GNUC_WARN_UNUSED_RESULT char *oe_chunk(owl_editwin *e, int start, int end)
 {
   char *p;
Index: filter.c
===================================================================
--- filter.c	(revision e56303f7b60f05cc30e74453b06725fc031e9384)
+++ filter.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -200,5 +200,5 @@
 
 
-char* owl_filter_print(const owl_filter *f)
+char G_GNUC_WARN_UNUSED_RESULT *owl_filter_print(const owl_filter *f)
 {
   GString *out = g_string_new("");
Index: fmtext.c
===================================================================
--- fmtext.c	(revision 7b4f3bea704ed82f2c36ba19fcf354d7442a5bb7)
+++ fmtext.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -171,5 +171,5 @@
  * freeing the return
  */
-char *owl_fmtext_print_plain(const owl_fmtext *f)
+char G_GNUC_WARN_UNUSED_RESULT *owl_fmtext_print_plain(const owl_fmtext *f)
 {
   return owl_strip_format_chars(f->buff->str);
Index: functions.c
===================================================================
--- functions.c	(revision 7c80ea420a376203debe78b3474db80337ac8d1b)
+++ functions.c	(revision 7c80ea420a376203debe78b3474db80337ac8d1b)
@@ -14,5 +14,5 @@
 #include "filterproc.h"
 
-char *owl_function_command(const char *cmdbuff)
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_command(const char *cmdbuff)
 {
   owl_function_debugmsg("executing command: %s", cmdbuff);
@@ -21,5 +21,5 @@
 }
 
-char *owl_function_command_argv(const char *const *argv, int argc)
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_command_argv(const char *const *argv, int argc)
 {
   return owl_cmddict_execute_argv(owl_global_get_cmddict(&g),
@@ -95,5 +95,6 @@
 }
 
-char *owl_function_style_describe(const char *name) {
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_style_describe(const char *name)
+{
   const char *desc;
   char *s;
@@ -111,5 +112,5 @@
 }
 
-char *owl_function_cmd_describe(const char *name)
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_cmd_describe(const char *name)
 {
   const owl_cmd *cmd = owl_cmddict_find(owl_global_get_cmddict(&g), name);
@@ -249,5 +250,5 @@
  * owl_global_messagequeue_addmsg() for that.
  */
-owl_message *owl_function_make_outgoing_aim(const char *body, const char *to)
+G_GNUC_WARN_UNUSED_RESULT owl_message *owl_function_make_outgoing_aim(const char *body, const char *to)
 {
   owl_message *m;
@@ -270,5 +271,5 @@
  * owl_global_messagequeue_addmsg() for that.
  */
-owl_message *owl_function_make_outgoing_loopback(const char *body)
+G_GNUC_WARN_UNUSED_RESULT owl_message *owl_function_make_outgoing_loopback(const char *body)
 {
   owl_message *m;
@@ -1227,9 +1228,10 @@
 }
 
-static void _dirty_everything(owl_window *w) {
+static void _dirty_everything(gpointer data, gpointer user_data) {
+  owl_window *w = data;
   if (!owl_window_is_realized(w))
     return;
   owl_window_dirty(w);
-  owl_window_children_foreach(w, (GFunc)_dirty_everything, NULL);
+  owl_window_children_foreach(w, _dirty_everything, NULL);
 }
 
@@ -1237,5 +1239,5 @@
 {
   /* Ask every widget to redraw itself. */
-  _dirty_everything(owl_window_get_screen());
+  _dirty_everything(owl_window_get_screen(), NULL);
   /* Force ncurses to redisplay everything. */
   clearok(stdscr, TRUE);
@@ -1898,5 +1900,5 @@
 }
 
-owl_editwin *owl_function_start_question(const char *line)
+G_GNUC_WARN_UNUSED_RESULT owl_editwin *owl_function_start_question(const char *line)
 {
   owl_editwin *tw;
@@ -1913,5 +1915,5 @@
 }
 
-owl_editwin *owl_function_start_password(const char *line)
+G_GNUC_WARN_UNUSED_RESULT owl_editwin *owl_function_start_password(const char *line)
 {
   owl_editwin *tw;
@@ -1930,5 +1932,5 @@
 }
 
-char *owl_function_exec(int argc, const char *const *argv, const char *buff, int type)
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_exec(int argc, const char *const *argv, const char *buff, int type)
 {
   /* if type == 1 display in a popup
@@ -1973,5 +1975,5 @@
 }
 
-char *owl_function_perl(int argc, const char *const *argv, const char *buff, int type)
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_perl(int argc, const char *const *argv, const char *buff, int type)
 {
   /* if type == 1 display in a popup
@@ -2143,5 +2145,5 @@
  * Returns the name of the negated filter, which the caller must free.
  */
-char *owl_function_create_negative_filter(const char *filtername)
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_create_negative_filter(const char *filtername)
 {
   char *newname;
@@ -2240,5 +2242,5 @@
  * If 'related' is nonzero, encompass unclasses and .d classes as well.
  */
-char *owl_function_classinstfilt(const char *c, const char *i, int related) 
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_classinstfilt(const char *c, const char *i, int related) 
 {
   owl_filter *f;
@@ -2327,5 +2329,5 @@
  * the filter, which the caller must free.
  */
-char *owl_function_zuserfilt(const char *longuser)
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_zuserfilt(const char *longuser)
 {
   owl_filter *f;
@@ -2373,5 +2375,5 @@
  * Returns the name of the filter, which the caller must free.
  */
-char *owl_function_aimuserfilt(const char *user)
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_aimuserfilt(const char *user)
 {
   owl_filter *f;
@@ -2411,5 +2413,5 @@
 }
 
-char *owl_function_typefilt(const char *type)
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_typefilt(const char *type)
 {
   owl_filter *f;
@@ -2467,5 +2469,6 @@
 }
 
-static char *owl_function_smartfilter_cc(const owl_message *m) {
+static G_GNUC_WARN_UNUSED_RESULT char *owl_function_smartfilter_cc(const owl_message *m)
+{
   const char *ccs;
   char *ccs_quoted;
@@ -2518,5 +2521,5 @@
  *    name to the AIM conversation with that user 
  */
-char *owl_function_smartfilter(int type, int invert_related)
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_smartfilter(int type, int invert_related)
 {
   const owl_view *v;
@@ -2857,5 +2860,5 @@
 }
 
-char *owl_function_keymap_summary(const char *name)
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_keymap_summary(const char *name)
 {
   const owl_keymap *km 
@@ -2971,5 +2974,5 @@
 /* strips formatting from ztext and returns the unformatted text. 
  * caller is responsible for freeing. */
-char *owl_function_ztext_stylestrip(const char *zt)
+G_GNUC_WARN_UNUSED_RESULT char *owl_function_ztext_stylestrip(const char *zt)
 {
   owl_fmtext fm;
@@ -3152,33 +3155,28 @@
     }
     
-    /* if it exited, fork & exec a new one */
+    /* if it exited, spawn a new one */
     if (owl_global_get_newmsgproc_pid(&g)==0) {
-      pid_t i;
       int myargc;
-      i=fork();
-      if (i) {
-	/* parent set the child's pid */
-	owl_global_set_newmsgproc_pid(&g, i);
-	owl_function_debugmsg("I'm the parent and I started a new newmsgproc with pid %i", i);
-      } else {
-	/* child exec's the program */
-	char **parsed;
-	parsed=owl_parseline(owl_global_get_newmsgproc(&g), &myargc);
-	if (myargc < 0) {
-	  owl_function_debugmsg("Could not parse newmsgproc '%s': unbalanced quotes?", owl_global_get_newmsgproc(&g));
-	}
-	if (myargc <= 0) {
-	  _exit(127);
-	}
-	owl_function_debugmsg("About to exec \"%s\" with %d arguments", parsed[0], myargc);
-	
-	execvp(parsed[0], parsed);
-	
-	
-	/* was there an error exec'ing? */
-	owl_function_debugmsg("Cannot run newmsgproc '%s': cannot exec '%s': %s", 
-			      owl_global_get_newmsgproc(&g), parsed[0], strerror(errno));
-	_exit(127);
+      char **argv = owl_parseline(owl_global_get_newmsgproc(&g), &myargc);
+      if (myargc < 0) {
+        owl_function_debugmsg("Could not parse newmsgproc '%s': unbalanced quotes?",
+                              owl_global_get_newmsgproc(&g));
+      } else if (myargc > 0) {
+        /* Spawn the child. */
+        pid_t pid;
+        GError *error = NULL;
+        owl_function_debugmsg("About to exec \"%s\" with %d arguments", argv[0], myargc);
+        if (g_spawn_async(NULL, argv, NULL,
+                          G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
+                          NULL, NULL, &pid, &error)) {
+          owl_global_set_newmsgproc_pid(&g, pid);
+          owl_function_debugmsg("I'm the parent and I started a new newmsgproc with pid %i", pid);
+        } else {
+          owl_function_debugmsg("Cannot run newmsgproc '%s': %s",
+                                owl_global_get_newmsgproc(&g), error->message);
+          g_error_free(error);
+        }
       }
+      g_strfreev(argv);
     }
   }
Index: global.c
===================================================================
--- global.c	(revision 87ab6e54832af5fbf31c28e58f7c9bd68fcc25b9)
+++ global.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -172,5 +172,6 @@
 /* Pops the current context from the context stack and returns it. Caller is
  * responsible for freeing. */
-owl_context *owl_global_pop_context_no_delete(owl_global *g) {
+G_GNUC_WARN_UNUSED_RESULT owl_context *owl_global_pop_context_no_delete(owl_global *g)
+{
   owl_context *c;
   if (!g->context_stack)
@@ -724,5 +725,5 @@
  * necessary.
  */
-owl_message *owl_global_messagequeue_popmsg(owl_global *g)
+owl_message G_GNUC_WARN_UNUSED_RESULT *owl_global_messagequeue_popmsg(owl_global *g)
 {
   owl_message *out;
Index: keybinding.c
===================================================================
--- keybinding.c	(revision 3b8a563ae4e07b1064fe005714793565ac720dc4)
+++ keybinding.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -14,5 +14,5 @@
 
 /* sets up a new keybinding for a command */
-owl_keybinding *owl_keybinding_new(const char *keyseq, const char *command, void (*function_fn)(void), const char *desc)
+G_GNUC_WARN_UNUSED_RESULT owl_keybinding *owl_keybinding_new(const char *keyseq, const char *command, void (*function_fn)(void), const char *desc)
 {
   owl_keybinding *kb = g_new(owl_keybinding, 1);
@@ -85,5 +85,5 @@
 }
 
-char *owl_keybinding_stack_tostring(int *j, int len)
+G_GNUC_WARN_UNUSED_RESULT char *owl_keybinding_stack_tostring(int *j, int len)
 {
   GString *string;
@@ -100,5 +100,5 @@
 }
 
-char *owl_keybinding_tostring(const owl_keybinding *kb)
+G_GNUC_WARN_UNUSED_RESULT char *owl_keybinding_tostring(const owl_keybinding *kb)
 {
   return owl_keybinding_stack_tostring(kb->keys, kb->len);
Index: keymap.c
===================================================================
--- keymap.c	(revision 4c7c21f786a0416a755645b78db0b851f75f8748)
+++ keymap.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -51,6 +51,6 @@
     }
   }
-  return owl_list_append_element(&km->bindings, kb);  
-
+  owl_list_append_element(&km->bindings, kb);
+  return 0;
 }
 
@@ -80,5 +80,5 @@
 
 /* returns a summary line describing this keymap.  the caller must free. */
-char *owl_keymap_summary(const owl_keymap *km)
+G_GNUC_WARN_UNUSED_RESULT char *owl_keymap_summary(const owl_keymap *km)
 {
   if (!km || !km->name || !km->desc) return NULL;
Index: keypress.c
===================================================================
--- keypress.c	(revision d07af84683f667d7c34814c1b0a12823b08f6df0)
+++ keypress.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -129,5 +129,5 @@
 /* OWL_META is definied in owl.h */
 
-char *owl_keypress_tostring(int j, int esc)
+char G_GNUC_WARN_UNUSED_RESULT *owl_keypress_tostring(int j, int esc)
 {
   GString *kb;
Index: list.c
===================================================================
--- list.c	(revision fda61d3fe64381f30e32bc0091ab5ab59d95524f)
+++ list.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -53,12 +53,12 @@
 }
 
-int owl_list_append_element(owl_list *l, void *element)
+void owl_list_append_element(owl_list *l, void *element)
 {
-  return owl_list_insert_element(l, l->size, element);
+  owl_list_insert_element(l, l->size, element);
 }
 
-int owl_list_prepend_element(owl_list *l, void *element)
+void owl_list_prepend_element(owl_list *l, void *element)
 {
-  return owl_list_insert_element(l, 0, element);
+  owl_list_insert_element(l, 0, element);
 }
 
Index: logging.c
===================================================================
--- logging.c	(revision cc305b53e93deb26ad26d3eb1beaf34d53c0d6ac)
+++ logging.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -80,5 +80,6 @@
 }
 
-char *owl_log_zephyr(const owl_message *m) {
+G_GNUC_WARN_UNUSED_RESULT char *owl_log_zephyr(const owl_message *m)
+{
     char *tmp = NULL;
     GString *buffer = NULL;
@@ -103,5 +104,6 @@
 }
 
-char *owl_log_aim(const owl_message *m) {
+G_GNUC_WARN_UNUSED_RESULT char *owl_log_aim(const owl_message *m)
+{
     GString *buffer = NULL;
     buffer = g_string_new("");
@@ -120,5 +122,6 @@
 }
 
-char *owl_log_jabber(const owl_message *m) {
+G_GNUC_WARN_UNUSED_RESULT char *owl_log_jabber(const owl_message *m)
+{
     GString *buffer = NULL;
     buffer = g_string_new("");
@@ -132,5 +135,6 @@
 }
 
-char *owl_log_generic(const owl_message *m) {
+G_GNUC_WARN_UNUSED_RESULT char *owl_log_generic(const owl_message *m)
+{
     GString *buffer;
     buffer = g_string_new("");
Index: message.c
===================================================================
--- message.c	(revision 259e60a8abc2d2d41bc7a484b02a334fdd13857f)
+++ message.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -580,5 +580,5 @@
 
 /* caller must free return value. */
-char *owl_message_get_cc(const owl_message *m)
+G_GNUC_WARN_UNUSED_RESULT char *owl_message_get_cc(const owl_message *m)
 {
   const char *cur;
@@ -597,5 +597,5 @@
 
 /* caller must free return value */
-GList *owl_message_get_cc_without_recipient(const owl_message *m)
+G_GNUC_WARN_UNUSED_RESULT GList *owl_message_get_cc_without_recipient(const owl_message *m)
 {
   char *cc, *shortuser, *recip;
Index: messagelist.c
===================================================================
--- messagelist.c	(revision 66a8cd6f82c4a4dc47992bd57b12563500abb001)
+++ messagelist.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -42,7 +42,7 @@
 }
 
-int owl_messagelist_append_element(owl_messagelist *ml, void *element)
+void owl_messagelist_append_element(owl_messagelist *ml, void *element)
 {
-  return(owl_list_append_element(&(ml->list), element));
+  owl_list_append_element(&ml->list, element);
 }
 
Index: owl.h
===================================================================
--- owl.h	(revision 2bc6bb1631398bd9cd2eaeee9ed91c2a15649b30)
+++ owl.h	(revision 2bc6bb1631398bd9cd2eaeee9ed91c2a15649b30)
@@ -251,5 +251,5 @@
 				 * WARNING:  this approach is hard to make
 				 * thread-safe... */
-  char *(*get_tostring_fn)(const struct _owl_variable *v, const void *val);
+  char G_GNUC_WARN_UNUSED_RESULT *(*get_tostring_fn)(const struct _owl_variable *v, const void *val);
                                 /* converts val to a string;
 				 * caller must free the result */
@@ -313,5 +313,5 @@
   
   /* These don't take any context */
-  char *(*cmd_args_fn)(int argc, const char *const *argv, const char *buff);  
+  char G_GNUC_WARN_UNUSED_RESULT *(*cmd_args_fn)(int argc, const char *const *argv, const char *buff);
 				/* takes argv and the full command as buff.
 				 * caller must free return value if !NULL */
@@ -320,5 +320,5 @@
 
   /* The following also take the active context if it's valid */
-  char *(*cmd_ctxargs_fn)(void *ctx, int argc, const char *const *argv, const char *buff);  
+  char G_GNUC_WARN_UNUSED_RESULT *(*cmd_ctxargs_fn)(void *ctx, int argc, const char *const *argv, const char *buff);
 				/* takes argv and the full command as buff.
 				 * caller must free return value if !NULL */
Index: perlconfig.c
===================================================================
--- perlconfig.c	(revision bcde7926f64b37bec0e1c92962e8110187f58242)
+++ perlconfig.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -23,5 +23,5 @@
 
 
-SV *owl_new_sv(const char * str)
+G_GNUC_WARN_UNUSED_RESULT SV *owl_new_sv(const char * str)
 {
   SV *ret = newSVpv(str, 0);
@@ -36,5 +36,5 @@
 }
 
-AV *owl_new_av(const owl_list *l, SV *(*to_sv)(const void *))
+G_GNUC_WARN_UNUSED_RESULT AV *owl_new_av(const owl_list *l, SV *(*to_sv)(const void *))
 {
   AV *ret;
@@ -52,5 +52,5 @@
 }
 
-HV *owl_new_hv(const owl_dict *d, SV *(*to_sv)(const void *))
+G_GNUC_WARN_UNUSED_RESULT HV *owl_new_hv(const owl_dict *d, SV *(*to_sv)(const void *))
 {
   HV *ret;
@@ -75,5 +75,5 @@
 }
 
-SV *owl_perlconfig_message2hashref(const owl_message *m)
+G_GNUC_WARN_UNUSED_RESULT SV *owl_perlconfig_message2hashref(const owl_message *m)
 {
   HV *h, *stash;
@@ -165,5 +165,5 @@
 }
 
-SV *owl_perlconfig_curmessage2hashref(void)
+G_GNUC_WARN_UNUSED_RESULT SV *owl_perlconfig_curmessage2hashref(void)
 {
   int curmsg;
@@ -183,5 +183,5 @@
    This has been somewhat addressed, but is still not lossless.
  */
-owl_message * owl_perlconfig_hashref2message(SV *msg)
+G_GNUC_WARN_UNUSED_RESULT owl_message *owl_perlconfig_hashref2message(SV *msg)
 {
   owl_message * m;
@@ -251,5 +251,5 @@
 /* Calls in a scalar context, passing it a hash reference.
    If return value is non-null, caller must free. */
-char *owl_perlconfig_call_with_message(const char *subname, const owl_message *m)
+G_GNUC_WARN_UNUSED_RESULT char *owl_perlconfig_call_with_message(const char *subname, const owl_message *m)
 {
   dSP ;
@@ -300,5 +300,5 @@
    If the return value is non-null, the caller must free it.
  */
-char * owl_perlconfig_message_call_method(const owl_message *m, const char *method, int argc, const char ** argv)
+G_GNUC_WARN_UNUSED_RESULT char *owl_perlconfig_message_call_method(const owl_message *m, const char *method, int argc, const char **argv)
 {
   dSP;
@@ -349,6 +349,6 @@
 }
 
-
-char *owl_perlconfig_initperl(const char * file, int *Pargc, char ***Pargv, char *** Penv)
+/* caller must free result, if not NULL */
+G_GNUC_WARN_UNUSED_RESULT char *owl_perlconfig_initperl(const char *file, int *Pargc, char ***Pargv, char ***Penv)
 {
   int ret;
@@ -436,5 +436,5 @@
 
 /* caller is responsible for freeing returned string */
-char *owl_perlconfig_execute(const char *line)
+G_GNUC_WARN_UNUSED_RESULT char *owl_perlconfig_execute(const char *line)
 {
   STRLEN len;
@@ -505,5 +505,6 @@
 }
 
-char *owl_perlconfig_perlcmd(const owl_cmd *cmd, int argc, const char *const *argv)
+/* caller must free the result */
+G_GNUC_WARN_UNUSED_RESULT char *owl_perlconfig_perlcmd(const owl_cmd *cmd, int argc, const char *const *argv)
 {
   int i, count;
Index: popwin.c
===================================================================
--- popwin.c	(revision ddbbcffae8064f4d266a9735a16225e4feef1a3c)
+++ popwin.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -1,5 +1,5 @@
 #include "owl.h"
 
-owl_popwin *owl_popwin_new(void)
+G_GNUC_WARN_UNUSED_RESULT owl_popwin *owl_popwin_new(void)
 {
   owl_popwin *pw = g_new0(owl_popwin, 1);
Index: regex.c
===================================================================
--- regex.c	(revision d4927a70549407fe7f56b4ae1d3949663a370205)
+++ regex.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -39,9 +39,10 @@
 {
   char *quoted;
+  int ret;
   
-  quoted=owl_text_quote(string, OWL_REGEX_QUOTECHARS, OWL_REGEX_QUOTEWITH);
-  owl_regex_create(re, quoted);
+  quoted = owl_text_quote(string, OWL_REGEX_QUOTECHARS, OWL_REGEX_QUOTEWITH);
+  ret = owl_regex_create(re, quoted);
   g_free(quoted);
-  return(0);
+  return ret;
 }
 
Index: text.c
===================================================================
--- text.c	(revision 7865479440dd042766ecbbc1119b45e5eb7cd6a6)
+++ text.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -7,5 +7,5 @@
 /* Returns a copy of 'in' with each line indented 'n'
  * characters. Result must be freed with g_free. */
-char *owl_text_indent(const char *in, int n)
+G_GNUC_WARN_UNUSED_RESULT char *owl_text_indent(const char *in, int n)
 {
   const char *ptr1, *ptr2, *last;
@@ -48,5 +48,5 @@
 
 /* caller must free the return */
-char *owl_text_htmlstrip(const char *in)
+G_GNUC_WARN_UNUSED_RESULT char *owl_text_htmlstrip(const char *in)
 {
   const char *ptr1, *end, *ptr2, *ptr3;
@@ -129,5 +129,5 @@
 
 /* Caller must free return */
-char *owl_text_expand_tabs(const char *in)
+G_GNUC_WARN_UNUSED_RESULT char *owl_text_expand_tabs(const char *in)
 {
   int len = 0;
@@ -188,5 +188,5 @@
 
 /* caller must free the return */
-char *owl_text_wordwrap(const char *in, int col)
+G_GNUC_WARN_UNUSED_RESULT char *owl_text_wordwrap(const char *in, int col)
 {
   char *out;
@@ -269,5 +269,5 @@
  * Caller must free returned string.
  */
-char *owl_text_substitute(const char *in, const char *from, const char *to)
+G_GNUC_WARN_UNUSED_RESULT char *owl_text_substitute(const char *in, const char *from, const char *to)
 {
   char **split = g_strsplit(in, from, 0), *out;
@@ -284,5 +284,5 @@
  * On success returns the string, on error returns NULL.
  */
-char *owl_text_quote(const char *in, const char *toquote, const char *quotestr)
+G_GNUC_WARN_UNUSED_RESULT char *owl_text_quote(const char *in, const char *toquote, const char *quotestr)
 {
   int i, x, r, place, escape;
Index: util.c
===================================================================
--- util.c	(revision 83a4af3422d232d9ef981a5a009e31549c839a14)
+++ util.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -35,5 +35,5 @@
  * duplicate slashes are removed.  Caller must free the return.
  */
-char *owl_util_makepath(const char *in)
+G_GNUC_WARN_UNUSED_RESULT char *owl_util_makepath(const char *in)
 {
   int i, j, x;
@@ -102,5 +102,5 @@
    to -1, argv will be NULL and the caller does not need to free anything. The
    returned vector is NULL-terminated. */
-char **owl_parseline(const char *line, int *argc)
+G_GNUC_WARN_UNUSED_RESULT char **owl_parseline(const char *line, int *argc)
 {
   GPtrArray *argv;
@@ -245,5 +245,5 @@
 }
 
-char *owl_string_build_quoted(const char *tmpl, ...)
+G_GNUC_WARN_UNUSED_RESULT char *owl_string_build_quoted(const char *tmpl, ...)
 {
   GString *buf = g_string_new("");
@@ -257,5 +257,5 @@
 /* Returns a quoted version of arg suitable for placing in a
  * command-line. Result should be freed with g_free. */
-char *owl_arg_quote(const char *arg)
+G_GNUC_WARN_UNUSED_RESULT char *owl_arg_quote(const char *arg)
 {
   GString *buf = g_string_new("");;
@@ -265,5 +265,5 @@
 
 /* caller must free the return */
-char *owl_util_minutes_to_timestr(int in)
+G_GNUC_WARN_UNUSED_RESULT char *owl_util_minutes_to_timestr(int in)
 {
   int days, hours;
@@ -331,5 +331,5 @@
 
 /* Get the default tty name.  Caller must free the return */
-char *owl_util_get_default_tty(void)
+G_GNUC_WARN_UNUSED_RESULT char *owl_util_get_default_tty(void)
 {
   const char *tmp;
@@ -353,5 +353,5 @@
  * return.
  */
-char *owl_util_stripnewlines(const char *in)
+G_GNUC_WARN_UNUSED_RESULT char *owl_util_stripnewlines(const char *in)
 {
   
@@ -384,5 +384,5 @@
  * Error conditions are the same as g_file_read_link.
  */
-gchar *owl_util_recursive_resolve_link(const char *filename)
+G_GNUC_WARN_UNUSED_RESULT gchar *owl_util_recursive_resolve_link(const char *filename)
 {
   gchar *last_path = g_strdup(filename);
@@ -511,5 +511,5 @@
    The caller is responsible for freeing the allocated string.
 */
-char * owl_util_baseclass(const char * class)
+G_GNUC_WARN_UNUSED_RESULT char *owl_util_baseclass(const char *class)
 {
   char *start, *end;
@@ -546,6 +546,6 @@
 
 /* Strips format characters from a valid utf-8 string. Returns the
-   empty string if 'in' does not validate. */
-char * owl_strip_format_chars(const char *in)
+   empty string if 'in' does not validate.  Caller must free the return. */
+G_GNUC_WARN_UNUSED_RESULT char *owl_strip_format_chars(const char *in)
 {
   char *r;
@@ -584,6 +584,7 @@
  * out characters in Unicode Plane 16, as we use that plane internally
  * for formatting.
- */
-char * owl_validate_or_convert(const char *in)
+ * Caller must free the return.
+ */
+G_GNUC_WARN_UNUSED_RESULT char *owl_validate_or_convert(const char *in)
 {
   if (g_utf8_validate(in, -1, NULL)) {
@@ -599,6 +600,7 @@
  * Validate 'in' as UTF-8, and either return a copy of it, or an empty
  * string if it is invalid utf-8.
- */
-char * owl_validate_utf8(const char *in)
+ * Caller must free the return.
+ */
+G_GNUC_WARN_UNUSED_RESULT char *owl_validate_utf8(const char *in)
 {
   char *out;
@@ -632,5 +634,6 @@
 }
 
-char *owl_escape_highbit(const char *str)
+/* caller must free the return */
+G_GNUC_WARN_UNUSED_RESULT char *owl_escape_highbit(const char *str)
 {
   GString *out = g_string_new("");
@@ -695,5 +698,5 @@
 
 /* Read the rest of the input available in fp into a string. */
-char *owl_slurp(FILE *fp)
+G_GNUC_WARN_UNUSED_RESULT char *owl_slurp(FILE *fp)
 {
   char *buf = NULL;
Index: variable.c
===================================================================
--- variable.c	(revision 72146c707fab7ab99e38b8bd3019068a62483784)
+++ variable.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -646,5 +646,6 @@
 }
 
-owl_variable * owl_variable_newvar(const char *name, const char *summary, const char * description) {
+G_GNUC_WARN_UNUSED_RESULT owl_variable *owl_variable_newvar(const char *name, const char *summary, const char *description)
+{
   owl_variable * var = g_new0(owl_variable, 1);
   var->name = g_strdup(name);
@@ -824,5 +825,6 @@
 }
 
-char *owl_variable_get_tostring(const owl_vardict *d, const char *name) {
+G_GNUC_WARN_UNUSED_RESULT char *owl_variable_get_tostring(const owl_vardict *d, const char *name)
+{
   owl_variable *v;
   if (!name) return NULL;
@@ -832,5 +834,6 @@
 }
 
-char *owl_variable_get_default_tostring(const owl_vardict *d, const char *name) {
+G_GNUC_WARN_UNUSED_RESULT char *owl_variable_get_default_tostring(const owl_vardict *d, const char *name)
+{
   owl_variable *v;
   if (!name) return NULL;
@@ -992,5 +995,6 @@
 }
 
-char *owl_variable_bool_get_tostring_default(const owl_variable *v, const void *val) {
+G_GNUC_WARN_UNUSED_RESULT char *owl_variable_bool_get_tostring_default(const owl_variable *v, const void *val)
+{
   if (val == NULL) {
     return g_strdup("<null>");
@@ -1027,5 +1031,6 @@
 }
 
-char *owl_variable_int_get_tostring_default(const owl_variable *v, const void *val) {
+G_GNUC_WARN_UNUSED_RESULT char *owl_variable_int_get_tostring_default(const owl_variable *v, const void *val)
+{
   if (val == NULL) {
     return g_strdup("<null>");
@@ -1066,5 +1071,6 @@
 }
 
-char *owl_variable_enum_get_tostring(const owl_variable *v, const void *val) {
+G_GNUC_WARN_UNUSED_RESULT char *owl_variable_enum_get_tostring(const owl_variable *v, const void *val)
+{
   char **enums;
   int nenums, i;
@@ -1106,5 +1112,6 @@
 }
 
-char *owl_variable_string_get_tostring_default(const owl_variable *v, const void *val) {
+G_GNUC_WARN_UNUSED_RESULT char *owl_variable_string_get_tostring_default(const owl_variable *v, const void *val)
+{
   if (val == NULL) {
     return g_strdup("<null>");
Index: viewwin.c
===================================================================
--- viewwin.c	(revision 4fd211f3a533efcedaf4d0dc7c01e02087ad2e39)
+++ viewwin.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -12,5 +12,5 @@
  * will be used by the viewwin
  */
-owl_viewwin *owl_viewwin_new_text(owl_window *win, const char *text)
+G_GNUC_WARN_UNUSED_RESULT owl_viewwin *owl_viewwin_new_text(owl_window *win, const char *text)
 {
   owl_viewwin *v = g_new0(owl_viewwin, 1);
@@ -34,5 +34,5 @@
  * will be used by the viewwin
  */
-owl_viewwin *owl_viewwin_new_fmtext(owl_window *win, const owl_fmtext *fmtext)
+G_GNUC_WARN_UNUSED_RESULT owl_viewwin *owl_viewwin_new_fmtext(owl_window *win, const owl_fmtext *fmtext)
 {
   char *text;
@@ -237,5 +237,5 @@
 }
 
-owl_editwin *owl_viewwin_set_typwin_active(owl_viewwin *v, owl_history *hist) {
+G_GNUC_WARN_UNUSED_RESULT owl_editwin *owl_viewwin_set_typwin_active(owl_viewwin *v, owl_history *hist) {
   int lines, cols;
   owl_editwin *cmdline;
Index: window.c
===================================================================
--- window.c	(revision 4cc49bce5bdc20cd8da2b4e305f60d04ae879d4f)
+++ window.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -569,5 +569,6 @@
 };
 
-GSource *owl_window_redraw_source_new(void) {
+G_GNUC_WARN_UNUSED_RESULT GSource *owl_window_redraw_source_new(void)
+{
   GSource *source;
   source = g_source_new(&redraw_funcs, sizeof(GSource));
Index: zcrypt.c
===================================================================
--- zcrypt.c	(revision 5b197f71370f5a5b3c3c09935c5679d6c90fa4c2)
+++ zcrypt.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -53,8 +53,8 @@
 } ZWRITEOPTIONS;
 
-char *GetZephyrVarKeyFile(const char *whoami, const char *class, const char *instance);
+G_GNUC_WARN_UNUSED_RESULT char *GetZephyrVarKeyFile(const char *whoami, const char *class, const char *instance);
 int ParseCryptSpec(const char *spec, const char **keyfile);
-char *BuildArgString(char **argv, int start, int end);
-char *read_keystring(const char *keyfile);
+G_GNUC_WARN_UNUSED_RESULT char *BuildArgString(char **argv, int start, int end);
+G_GNUC_WARN_UNUSED_RESULT char *read_keystring(const char *keyfile);
 
 int do_encrypt(int zephyr, const char *class, const char *instance,
@@ -364,5 +364,5 @@
 /* Build a space-separated string from argv from elements between start  *
  * and end - 1.  malloc()'s the returned string. */
-char *BuildArgString(char **argv, int start, int end)
+G_GNUC_WARN_UNUSED_RESULT char *BuildArgString(char **argv, int start, int end)
 {
   int len = 1;
@@ -401,5 +401,5 @@
 #define MAX_SEARCH 3
 /* Find the class/instance in the .crypt-table */
-char *GetZephyrVarKeyFile(const char *whoami, const char *class, const char *instance)
+G_GNUC_WARN_UNUSED_RESULT char *GetZephyrVarKeyFile(const char *whoami, const char *class, const char *instance)
 {
   char *keyfile = NULL;
@@ -579,5 +579,5 @@
 }
 
-char *slurp_stdin(int ignoredot, int *length) {
+G_GNUC_WARN_UNUSED_RESULT char *slurp_stdin(int ignoredot, int *length) {
   char *buf;
   char *inptr;
@@ -611,5 +611,5 @@
 }
 
-char *GetInputBuffer(ZWRITEOPTIONS *zoptions, int *length) {
+G_GNUC_WARN_UNUSED_RESULT char *GetInputBuffer(ZWRITEOPTIONS *zoptions, int *length) {
   char *buf;
 
@@ -637,5 +637,5 @@
 }
 
-char *read_keystring(const char *keyfile) {
+G_GNUC_WARN_UNUSED_RESULT char *read_keystring(const char *keyfile) {
   char *keystring;
   FILE *fkey = fopen(keyfile, "r");
Index: zephyr.c
===================================================================
--- zephyr.c	(revision e146cd7daa6e098d58e1d6cbbf8c74225bcd2da8)
+++ zephyr.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -524,5 +524,5 @@
  */
 #ifdef HAVE_LIBZEPHYR
-char *owl_zephyr_get_field(const ZNotice_t *n, int j)
+G_GNUC_WARN_UNUSED_RESULT char *owl_zephyr_get_field(const ZNotice_t *n, int j)
 {
   int i, count, save;
@@ -552,5 +552,5 @@
 }
 
-char *owl_zephyr_get_field_as_utf8(const ZNotice_t *n, int j)
+G_GNUC_WARN_UNUSED_RESULT char *owl_zephyr_get_field_as_utf8(const ZNotice_t *n, int j)
 {
   int i, count, save;
@@ -584,9 +584,9 @@
 }
 #else
-char *owl_zephyr_get_field(void *n, int j)
+G_GNUC_WARN_UNUSED_RESULT char *owl_zephyr_get_field(void *n, int j)
 {
   return(g_strdup(""));
 }
-char *owl_zephyr_get_field_as_utf8(void *n, int j)
+G_GNUC_WARN_UNUSED_RESULT char *owl_zephyr_get_field_as_utf8(void *n, int j)
 {
   return owl_zephyr_get_field(n, j);
@@ -621,5 +621,5 @@
  * caller must free the return
  */
-char *owl_zephyr_get_message(const ZNotice_t *n, const owl_message *m)
+G_GNUC_WARN_UNUSED_RESULT char *owl_zephyr_get_message(const ZNotice_t *n, const owl_message *m)
 {
 #define OWL_NFIELDS	5
@@ -942,5 +942,5 @@
 #endif
 
-char *owl_zephyr_zlocate(const char *user, int auth)
+G_GNUC_WARN_UNUSED_RESULT char *owl_zephyr_zlocate(const char *user, int auth)
 {
 #ifdef HAVE_LIBZEPHYR
@@ -1042,5 +1042,5 @@
 
 /* caller must free the return */
-char *owl_zephyr_makesubline(const char *class, const char *inst, const char *recip)
+G_GNUC_WARN_UNUSED_RESULT char *owl_zephyr_makesubline(const char *class, const char *inst, const char *recip)
 {
   return g_strdup_printf("%s,%s,%s\n", class, inst, !strcmp(recip, "") ? "*" : recip);
@@ -1122,5 +1122,5 @@
  * free the return.
  */
-char *owl_zephyr_getsubs(void)
+G_GNUC_WARN_UNUSED_RESULT char *owl_zephyr_getsubs(void)
 {
 #ifdef HAVE_LIBZEPHYR
@@ -1242,5 +1242,5 @@
  * The caller must free the return
  */
-char *short_zuser(const char *in)
+G_GNUC_WARN_UNUSED_RESULT char *short_zuser(const char *in)
 {
   char *ptr = strrchr(in, '@');
@@ -1254,5 +1254,5 @@
  * The caller must free the return.
  */
-char *long_zuser(const char *in)
+G_GNUC_WARN_UNUSED_RESULT char *long_zuser(const char *in)
 {
   char *ptr = strrchr(in, '@');
@@ -1282,5 +1282,5 @@
  * caller must free the return.
  */
-char *owl_zephyr_smartstripped_user(const char *in)
+G_GNUC_WARN_UNUSED_RESULT char *owl_zephyr_smartstripped_user(const char *in)
 {
   char *slash, *dot, *realm, *out;
Index: zwrite.c
===================================================================
--- zwrite.c	(revision 3b8a563ae4e07b1064fe005714793565ac720dc4)
+++ zwrite.c	(revision d427f08508a96769e6a7fd429711b6349caf5b57)
@@ -5,5 +5,5 @@
 #include "owl.h"
 
-owl_zwrite *owl_zwrite_new(const char *line)
+G_GNUC_WARN_UNUSED_RESULT owl_zwrite *owl_zwrite_new(const char *line)
 {
   owl_zwrite *z = g_new(owl_zwrite, 1);
@@ -15,5 +15,5 @@
 }
 
-int owl_zwrite_create_from_line(owl_zwrite *z, const char *line)
+G_GNUC_WARN_UNUSED_RESULT int owl_zwrite_create_from_line(owl_zwrite *z, const char *line)
 {
   int argc, badargs, myargc;
@@ -321,5 +321,5 @@
 
 /* Caller must free the result. */
-char *owl_zwrite_get_recip_n_with_realm(const owl_zwrite *z, int n)
+G_GNUC_WARN_UNUSED_RESULT char *owl_zwrite_get_recip_n_with_realm(const owl_zwrite *z, int n)
 {
   if (z->realm[0]) {
@@ -370,5 +370,5 @@
  * If not a CC, only the recip_index'th user will be replied to.
  */
-char *owl_zwrite_get_replyline(const owl_zwrite *z, int recip_index)
+G_GNUC_WARN_UNUSED_RESULT char *owl_zwrite_get_replyline(const owl_zwrite *z, int recip_index)
 {
   /* Match ordering in zwrite help. */
