]> git.sur5r.net Git - i3/i3/commitdiff
introduce sasprintf() in libi3, use it everywhere
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 23 Oct 2011 12:16:56 +0000 (13:16 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 23 Oct 2011 12:16:56 +0000 (13:16 +0100)
18 files changed:
i3-config-wizard/cfgparse.y
i3-input/main.c
i3bar/Makefile
i3bar/src/config.c
include/libi3.h
libi3/safewrappers.c
src/assignments.c
src/cfgparse.y
src/cmdparse.y
src/config.c
src/floating.c
src/load_layout.c
src/main.c
src/manage.c
src/randr.c
src/util.c
src/workspace.c
src/xinerama.c

index 018b37b2220682efdcd712c4b66d0bdc32eb53d4..bbe119371430b0084605096dd9e0e8293fe824ab 100644 (file)
@@ -14,6 +14,8 @@
 
 #include <X11/Xlib.h>
 
+#include "libi3.h"
+
 extern Display *dpy;
 
 struct context {
@@ -141,7 +143,7 @@ bindcode:
         char *str = XKeysymToString(sym);
         char *modifiers = modifier_to_string($<number>3);
         // TODO: modifier to string
-        asprintf(&(context->result), "bindsym %s%s %s\n", modifiers, str, $<string>6);
+        sasprintf(&(context->result), "bindsym %s%s %s\n", modifiers, str, $<string>6);
         free(modifiers);
     }
     ;
index fbc776e2f6c1a1ca6b863cc099677ed847da071b..0d9d964e441bbab035bdfb5d43767a4ad0a68e35 100644 (file)
@@ -306,7 +306,7 @@ int main(int argc, char *argv[]) {
                 /* This option is deprecated, but will still work in i3 v4.1, 4.2 and 4.3 */
                 fprintf(stderr, "i3-input: WARNING: the -p option is DEPRECATED in favor of the -F (format) option\n");
                 FREE(format);
-                asprintf(&format, "%s%%s", optarg);
+                sasprintf(&format, "%s%%s", optarg);
                 break;
             case 'l':
                 limit = atoi(optarg);
index adf3b859443867c3e51df9883fa967a84bab75b5..79d0e7cd4e0e58f43d97bb1db4064503a5785ad9 100644 (file)
@@ -14,7 +14,7 @@ i3bar: $(TOPDIR)/libi3/libi3.a ${FILES}
        echo "[i3bar] LINK"
        $(CC) $(LDFLAGS) -o $@ $(filter-out libi3/libi3.a,$^) $(LIBS)
 
-$(TOPDIR)/libi3/%.a:
+$(TOPDIR)/libi3/%.a: $(TOPDIR)/libi3/*.c
        $(MAKE) -C $(TOPDIR)/libi3
 
 doc:
index 9e4552ed8ba0d085dba64231afad2f5696fbc7d2..92ba772fdc4d12d720ff83b9290e63d92d47ed3b 100644 (file)
@@ -89,13 +89,13 @@ static int config_string_cb(void *params_, const unsigned char *val, unsigned in
          * Therefore we save the command in 'config' and access it later in
          * got_bar_config() */
         DLOG("command = %.*s\n", len, val);
-        asprintf(&config.command, "%.*s", len, val);
+        sasprintf(&config.command, "%.*s", len, val);
         return 1;
     }
 
     if (!strcmp(cur_key, "font")) {
         DLOG("font = %.*s\n", len, val);
-        asprintf(&config.fontname, "%.*s", len, val);
+        sasprintf(&config.fontname, "%.*s", len, val);
         return 1;
     }
 
@@ -103,7 +103,7 @@ static int config_string_cb(void *params_, const unsigned char *val, unsigned in
         DLOG("+output %.*s\n", len, val);
         int new_num_outputs = config.num_outputs + 1;
         config.outputs = srealloc(config.outputs, sizeof(char*) * new_num_outputs);
-        asprintf(&config.outputs[config.num_outputs], "%.*s", len, val);
+        sasprintf(&config.outputs[config.num_outputs], "%.*s", len, val);
         config.num_outputs = new_num_outputs;
         return 1;
     }
@@ -111,7 +111,7 @@ static int config_string_cb(void *params_, const unsigned char *val, unsigned in
     if (!strcmp(cur_key, "tray_output")) {
         DLOG("tray_output %.*s\n", len, val);
         FREE(config.tray_output);
-        asprintf(&config.tray_output, "%.*s", len, val);
+        sasprintf(&config.tray_output, "%.*s", len, val);
         return 1;
     }
 
@@ -119,7 +119,7 @@ static int config_string_cb(void *params_, const unsigned char *val, unsigned in
     do { \
         if (!strcmp(cur_key, #json_name)) { \
             DLOG(#json_name " = " #struct_name " = %.*s\n", len, val); \
-            asprintf(&(config.colors.struct_name), "%.*s", len, val); \
+            sasprintf(&(config.colors.struct_name), "%.*s", len, val); \
             return 1; \
         } \
     } while (0)
index 123e5895d3a305b71441757fb2731ea6e3699142..9613b7f34945bc76dfe72b9e08724514c7730831 100644 (file)
@@ -5,6 +5,7 @@
 #ifndef _LIBI3_H
 #define _LIBI3_H
 
+#include <stdarg.h>
 #include <xcb/xcb.h>
 #include <xcb/xproto.h>
 
@@ -45,6 +46,13 @@ void *srealloc(void *ptr, size_t size);
  */
 char *sstrdup(const char *str);
 
+/**
+ * Safe-wrapper around asprintf which exits if it returns -1 (meaning that
+ * there is no more memory available)
+ *
+ */
+int sasprintf(char **strp, const char *fmt, ...);
+
 /**
  * Formats a message (payload) of the given size and type and sends it to i3 via
  * the given socket file descriptor.
index 82311fe3a2115bb96c956e514af3dd73415e37e6..2403578dc41da66bd32ce17f4a7d4f455255ab96 100644 (file)
@@ -10,6 +10,8 @@
  */
 #include <string.h>
 #include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
 #include <err.h>
 
 
@@ -45,3 +47,14 @@ char *sstrdup(const char *str) {
         err(EXIT_FAILURE, "strdup()");
     return result;
 }
+
+int sasprintf(char **strp, const char *fmt, ...) {
+    va_list args;
+    int result;
+
+    va_start(args, fmt);
+    if ((result = vasprintf(strp, fmt, args)) == -1)
+        err(EXIT_FAILURE, "asprintf(%s)", fmt);
+    va_end(args);
+    return result;
+}
index 1a586807b639d0b843241e3f58d1d802247a9091..7795d46a75105a1603c2111b07d257bc8c21b92d 100644 (file)
@@ -40,7 +40,7 @@ void run_assignments(i3Window *window) {
         if (current->type == A_COMMAND) {
             DLOG("execute command %s\n", current->dest.command);
             char *full_command;
-            asprintf(&full_command, "[id=\"%d\"] %s", window->id, current->dest.command);
+            sasprintf(&full_command, "[id=\"%d\"] %s", window->id, current->dest.command);
             char *json_result = parse_cmd(full_command);
             FREE(full_command);
             FREE(json_result);
index 8232ae572bc848f760bdb48283292aa1799d7607..178434d178da1c77243b7adec3aba21bd460f007 100644 (file)
@@ -280,10 +280,8 @@ static void start_configerror_nagbar(const char *config_path) {
     if (configerror_pid == 0) {
         char *editaction,
              *pageraction;
-        if (asprintf(&editaction, "i3-sensible-terminal -e sh -c \"i3-sensible-editor \\\"%s\\\" && i3-msg reload\"", config_path) == -1)
-            exit(1);
-        if (asprintf(&pageraction, "i3-sensible-terminal -e i3-sensible-pager \"%s\"", errorfilename) == -1)
-            exit(1);
+        sasprintf(&editaction, "i3-sensible-terminal -e sh -c \"i3-sensible-editor \\\"%s\\\" && i3-msg reload\"", config_path);
+        sasprintf(&pageraction, "i3-sensible-terminal -e i3-sensible-pager \"%s\"", errorfilename);
         char *argv[] = {
             NULL, /* will be replaced by the executable path */
             "-t",
@@ -938,7 +936,7 @@ word_or_number:
     WORD
     | NUMBER
     {
-        asprintf(&$$, "%d", $1);
+        sasprintf(&$$, "%d", $1);
     }
     ;
 
@@ -1345,7 +1343,7 @@ workspace:
         } else {
             char *ws_name = NULL;
             if ($5 == NULL) {
-                asprintf(&ws_name, "%d", ws_num);
+                sasprintf(&ws_name, "%d", ws_num);
             } else {
                 ws_name = $5;
             }
@@ -1422,20 +1420,14 @@ assign:
         if ((separator = strchr(criteria, '/')) != NULL) {
             *(separator++) = '\0';
             char *pattern;
-            if (asprintf(&pattern, "(?i)%s", separator) == -1) {
-                ELOG("asprintf failed\n");
-                break;
-            }
+            sasprintf(&pattern, "(?i)%s", separator);
             match->title = regex_new(pattern);
             free(pattern);
             printf("  title = %s\n", separator);
         }
         if (*criteria != '\0') {
             char *pattern;
-            if (asprintf(&pattern, "(?i)%s", criteria) == -1) {
-                ELOG("asprintf failed\n");
-                break;
-            }
+            sasprintf(&pattern, "(?i)%s", criteria);
             match->class = regex_new(pattern);
             free(pattern);
             printf("  class = %s\n", criteria);
index a43d2be0defc5ff16ef1cd2a339d9c298a718456..176213897d4b875d716b2c8c4e3bc69f24cc5c7f 100644 (file)
@@ -90,8 +90,8 @@ char *parse_cmd(const char *new) {
     context->filename = "cmd";
     if (cmdyyparse() != 0) {
         fprintf(stderr, "Could not parse command\n");
-        asprintf(&json_output, "{\"success\":false, \"error\":\"%s at position %d\"}",
-                 context->compact_error, context->first_column);
+        sasprintf(&json_output, "{\"success\":false, \"error\":\"%s at position %d\"}",
+                  context->compact_error, context->first_column);
         FREE(context->line_copy);
         FREE(context->compact_error);
         free(context);
@@ -433,8 +433,8 @@ focus:
             ELOG("You have to specify which window/container should be focused.\n");
             ELOG("Example: [class=\"urxvt\" title=\"irssi\"] focus\n");
 
-            asprintf(&json_output, "{\"success\":false, \"error\":\"You have to "
-                     "specify which window/container should be focused\"}");
+            sasprintf(&json_output, "{\"success\":false, \"error\":\"You have to "
+                      "specify which window/container should be focused\"}");
             break;
         }
 
@@ -623,7 +623,7 @@ open:
         printf("opening new container\n");
         Con *con = tree_open_con(NULL, NULL);
         con_focus(con);
-        asprintf(&json_output, "{\"success\":true, \"id\":%ld}", (long int)con);
+        sasprintf(&json_output, "{\"success\":true, \"id\":%ld}", (long int)con);
 
         tree_render();
     }
index a75d0aa6ebce506f00deb81b9090a25136880625..8efb491ece9657ec22465da7d873323d0ef38092 100644 (file)
@@ -196,8 +196,7 @@ static char *get_config_path(const char *override_configpath) {
         xdg_config_home = "~/.config";
 
     xdg_config_home = resolve_tilde(xdg_config_home);
-    if (asprintf(&config_path, "%s/i3/config", xdg_config_home) == -1)
-        die("asprintf() failed");
+    sasprintf(&config_path, "%s/i3/config", xdg_config_home);
     free(xdg_config_home);
 
     if (path_exists(config_path))
@@ -217,8 +216,7 @@ static char *get_config_path(const char *override_configpath) {
     char *tok = strtok(buf, ":");
     while (tok != NULL) {
         tok = resolve_tilde(tok);
-        if (asprintf(&config_path, "%s/i3/config", tok) == -1)
-            die("asprintf() failed");
+        sasprintf(&config_path, "%s/i3/config", tok);
         free(tok);
         if (path_exists(config_path)) {
             free(buf);
index 0f2d9b05a8a9b0f5e1009e2a4543ac6112a282fb..83e20ee21e4352f1f7e781b66a8dd0302160c03a 100644 (file)
@@ -90,7 +90,7 @@ void floating_enable(Con *con, bool automatic) {
     }
 
     char *name;
-    asprintf(&name, "[i3 con] floatingcon around %p", con);
+    sasprintf(&name, "[i3 con] floatingcon around %p", con);
     x_set_name(nc, name);
     free(name);
 
index eeb0cc75fc9f3c0db192b34cf130837627ad138b..ef787fd1a8356df2812c25665b2b270bb7eafb75 100644 (file)
@@ -117,7 +117,7 @@ static int json_string(void *ctx, const unsigned char *val, unsigned int len) {
             LOG("sticky_group of this container is %s\n", json_node->sticky_group);
         } else if (strcasecmp(last_key, "orientation") == 0) {
             char *buf = NULL;
-            asprintf(&buf, "%.*s", (int)len, val);
+            sasprintf(&buf, "%.*s", (int)len, val);
             if (strcasecmp(buf, "none") == 0)
                 json_node->orientation = NO_ORIENTATION;
             else if (strcasecmp(buf, "horizontal") == 0)
@@ -128,7 +128,7 @@ static int json_string(void *ctx, const unsigned char *val, unsigned int len) {
             free(buf);
         } else if (strcasecmp(last_key, "border") == 0) {
             char *buf = NULL;
-            asprintf(&buf, "%.*s", (int)len, val);
+            sasprintf(&buf, "%.*s", (int)len, val);
             if (strcasecmp(buf, "none") == 0)
                 json_node->border_style = BS_NONE;
             else if (strcasecmp(buf, "1pixel") == 0)
@@ -139,7 +139,7 @@ static int json_string(void *ctx, const unsigned char *val, unsigned int len) {
             free(buf);
         } else if (strcasecmp(last_key, "layout") == 0) {
             char *buf = NULL;
-            asprintf(&buf, "%.*s", (int)len, val);
+            sasprintf(&buf, "%.*s", (int)len, val);
             if (strcasecmp(buf, "default") == 0)
                 json_node->layout = L_DEFAULT;
             else if (strcasecmp(buf, "stacked") == 0)
@@ -154,7 +154,7 @@ static int json_string(void *ctx, const unsigned char *val, unsigned int len) {
             free(buf);
         } else if (strcasecmp(last_key, "mark") == 0) {
             char *buf = NULL;
-            asprintf(&buf, "%.*s", (int)len, val);
+            sasprintf(&buf, "%.*s", (int)len, val);
             json_node->mark = buf;
         }
     }
index 4f1dc78b57f3bf633bf4ba6d43618e24a92aa04e..a9d7141634e53d3ac86d8ab7509fec9d08e35b91 100644 (file)
@@ -339,8 +339,7 @@ int main(int argc, char *argv[]) {
                 payload = sstrdup(argv[optind]);
             } else {
                 char *both;
-                if (asprintf(&both, "%s %s", payload, argv[optind]) == -1)
-                    err(EXIT_FAILURE, "asprintf");
+                sasprintf(&both, "%s %s", payload, argv[optind]);
                 free(payload);
                 payload = both;
             }
@@ -647,8 +646,8 @@ int main(int argc, char *argv[]) {
     Barconfig *barconfig;
     TAILQ_FOREACH(barconfig, &barconfigs, configs) {
         char *command = NULL;
-        asprintf(&command, "i3bar --bar_id=%s --socket=\"%s\"",
-                 barconfig->id, current_socketpath);
+        sasprintf(&command, "i3bar --bar_id=%s --socket=\"%s\"",
+                  barconfig->id, current_socketpath);
         LOG("Starting bar process: %s\n", command);
         start_application(command);
         free(command);
index df4dc11e3030b745642f8a8b9525c6045a23a6dc..ee1b3d6c30bd77ad147014877655ba7af9afebd0 100644 (file)
@@ -265,7 +265,7 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
     nc->border_width = geom->border_width;
 
     char *name;
-    asprintf(&name, "[i3 con] container around %p", cwindow);
+    sasprintf(&name, "[i3 con] container around %p", cwindow);
     x_set_name(nc, name);
     free(name);
 
index 0329038ba2db31b379bb2e32463fb7d4fd728599..ac61dd882f707f96ba7e1d108b7bd383f39312e6 100644 (file)
@@ -243,7 +243,7 @@ void output_init_con(Output *output) {
     output->con = con;
 
     char *name;
-    asprintf(&name, "[i3 con] output %s", con->name);
+    sasprintf(&name, "[i3 con] output %s", con->name);
     x_set_name(con, name);
     FREE(name);
 
@@ -267,7 +267,7 @@ void output_init_con(Output *output) {
     FREE(topdock->name);
     topdock->name = sstrdup("topdock");
 
-    asprintf(&name, "[i3 con] top dockarea %s", con->name);
+    sasprintf(&name, "[i3 con] top dockarea %s", con->name);
     x_set_name(topdock, name);
     FREE(name);
     DLOG("attaching\n");
@@ -281,7 +281,7 @@ void output_init_con(Output *output) {
     FREE(content->name);
     content->name = sstrdup("content");
 
-    asprintf(&name, "[i3 con] content %s", con->name);
+    sasprintf(&name, "[i3 con] content %s", con->name);
     x_set_name(content, name);
     FREE(name);
     con_attach(content, con, false);
@@ -301,7 +301,7 @@ void output_init_con(Output *output) {
     FREE(bottomdock->name);
     bottomdock->name = sstrdup("bottomdock");
 
-    asprintf(&name, "[i3 con] bottom dockarea %s", con->name);
+    sasprintf(&name, "[i3 con] bottom dockarea %s", con->name);
     x_set_name(bottomdock, name);
     FREE(name);
     DLOG("attaching\n");
@@ -464,7 +464,7 @@ void init_ws_for_output(Output *output, Con *content) {
             c++;
 
             FREE(ws->name);
-            asprintf(&(ws->name), "%d", c);
+            sasprintf(&(ws->name), "%d", c);
 
             current = NULL;
             TAILQ_FOREACH(out, &(croot->nodes_head), nodes)
@@ -477,7 +477,7 @@ void init_ws_for_output(Output *output, Con *content) {
     }
     con_attach(ws, content, false);
 
-    asprintf(&name, "[i3 con] workspace %s", ws->name);
+    sasprintf(&name, "[i3 con] workspace %s", ws->name);
     x_set_name(ws, name);
     free(name);
 
@@ -562,7 +562,7 @@ static void handle_output(xcb_connection_t *conn, xcb_randr_output_t id,
     new->id = id;
     new->primary = (primary && primary->output == id);
     FREE(new->name);
-    asprintf(&new->name, "%.*s",
+    sasprintf(&new->name, "%.*s",
             xcb_randr_get_output_info_name_length(output),
             xcb_randr_get_output_info_name(output));
 
index 81ef083d9fb4703d43fdeda3dda9488c61fbaa13..fa50d2e82b641b31a06339a6933eeef0cbf30cd8 100644 (file)
@@ -85,7 +85,7 @@ void exec_i3_utility(char *name, char *argv[]) {
      * argv[0]’s dirname */
     char *pathbuf = strdup(start_argv[0]);
     char *dir = dirname(pathbuf);
-    asprintf(&migratepath, "%s/%s", dir, name);
+    sasprintf(&migratepath, "%s/%s", dir, name);
     argv[0] = migratepath;
     execvp(migratepath, argv);
 
@@ -97,7 +97,7 @@ void exec_i3_utility(char *name, char *argv[]) {
         exit(1);
     }
     dir = dirname(buffer);
-    asprintf(&migratepath, "%s/%s", dir, name);
+    sasprintf(&migratepath, "%s/%s", dir, name);
     argv[0] = migratepath;
     execvp(migratepath, argv);
 #endif
@@ -237,16 +237,10 @@ char *get_process_filename(const char *prefix) {
     if (dir == NULL) {
         struct passwd *pw = getpwuid(getuid());
         const char *username = pw ? pw->pw_name : "unknown";
-        if (asprintf(&dir, "/tmp/i3-%s", username) == -1) {
-            perror("asprintf()");
-            return NULL;
-        }
+        sasprintf(&dir, "/tmp/i3-%s", username);
     } else {
         char *tmp;
-        if (asprintf(&tmp, "%s/i3", dir) == -1) {
-            perror("asprintf()");
-            return NULL;
-        }
+        sasprintf(&tmp, "%s/i3", dir);
         dir = tmp;
     }
     if (!path_exists(dir)) {
@@ -256,11 +250,7 @@ char *get_process_filename(const char *prefix) {
         }
     }
     char *filename;
-    if (asprintf(&filename, "%s/%s.%d", dir, prefix, getpid()) == -1) {
-        perror("asprintf()");
-        filename = NULL;
-    }
-
+    sasprintf(&filename, "%s/%s.%d", dir, prefix, getpid());
     free(dir);
     return filename;
 }
index cca85e8333515e088337bc080a5654d88ec751d1..1721ec60f5b93d5b4fb1a73fc496d718fbf4ee0d 100644 (file)
@@ -46,7 +46,7 @@ Con *workspace_get(const char *num, bool *created) {
          * will handle CT_WORKSPACEs differently */
         workspace = con_new(NULL, NULL);
         char *name;
-        asprintf(&name, "[i3 con] workspace %s", num);
+        sasprintf(&name, "[i3 con] workspace %s", num);
         x_set_name(workspace, name);
         free(name);
         workspace->type = CT_WORKSPACE;
index 6f3a30db22d758d0ec9021c17f2e64dc55c28195..c3ad97c3d7ed62c22ff71412abdc6cb1a5f62850 100644 (file)
@@ -56,7 +56,7 @@ static void query_screens(xcb_connection_t *conn) {
             s->rect.height = min(s->rect.height, screen_info[screen].height);
         } else {
             s = scalloc(sizeof(Output));
-            asprintf(&(s->name), "xinerama-%d", num_screens);
+            sasprintf(&(s->name), "xinerama-%d", num_screens);
             DLOG("Created new Xinerama screen %s (%p)\n", s->name, s);
             s->active = true;
             s->rect.x = screen_info[screen].x_org;