cmdline (merge-intel): fix warnings when compiing with -D_FORTIFY_SOURCE=2
[libcmdline.git] / src / lib / cmdline.c
index bafaace..e6662bd 100644 (file)
@@ -97,13 +97,16 @@ cmdline_complete_buffer(struct rdline *rdl, const char *buf,
        return cmdline_complete(cl, buf, state, dstbuf, dstsize);
 }
 
-void
+int
 cmdline_write_char(struct rdline *rdl, char c)
 {
+       int ret = -1;
        struct cmdline *cl = rdl->opaque;
-       if (cl->s_out >= 0) {
-               write(cl->s_out, &c, 1);
-       }
+
+       if (cl->s_out >= 0)
+               ret = write(cl->s_out, &c, 1);
+
+       return ret;
 }
 
 
@@ -149,14 +152,33 @@ void
 cmdline_printf(const struct cmdline *cl, const char *fmt, ...)
 {
        va_list ap;
-       char buffer[BUFSIZ];
 
+#ifdef _GNU_SOURCE
+       if (cl->s_out < 0)
+               return;
        va_start(ap, fmt);
-       vsnprintf(buffer, 512, fmt, ap);
+       vdprintf(cl->s_out, fmt, ap);
        va_end(ap);
-       if (cl->s_out >= 0) {
-               write(cl->s_out, buffer, strlen(buffer));
-       }
+#else
+       int ret;
+       char *buf;
+
+       if (cl->s_out < 0)
+               return;
+
+       buf = malloc(BUFSIZ);
+       if (buf == NULL)
+               return;
+       va_start(ap, fmt);
+       ret = vsnprintf(buf, BUFSIZ, fmt, ap);
+       va_end(ap);
+       if (ret < 0)
+               return;
+       if (ret >= BUFSIZ)
+               ret = BUFSIZ - 1;
+       write(cl->s_out, buf, ret);
+       free(buf);
+#endif
 }
 
 int
@@ -203,10 +225,10 @@ cmdline_interact(struct cmdline *cl)
 
        c = -1;
        while (1) {
-               read(cl->s_in, &c, 1);
-               if (cmdline_in(cl, &c, 1) < 0) {
+               if (read(cl->s_in, &c, 1) < 0)
+                       break;
+               if (cmdline_in(cl, &c, 1) < 0)
                        break;
-               }
        }
        cmdline_free(cl);
 }