From 93f162ff4827152efc6c269f5949d4241aeeebfb Mon Sep 17 00:00:00 2001 From: boercher Date: Sun, 17 Jul 2005 16:14:07 +0000 Subject: [PATCH] - new socket function sock_send_error() and sock_printf_error(): factored out the 'huh?-stuff, added error report log) - use sock_printf() and sock_printf_error() if necessary (no need to use sprintf()) --- server/commands/client_commands.c | 39 ++++++--------- server/commands/screen_commands.c | 82 +++++++++++++++---------------- server/commands/server_commands.c | 22 ++++----- server/commands/widget_commands.c | 81 ++++++++++++++---------------- server/parse.c | 13 ++--- server/sock.c | 4 +- shared/sockets.c | 44 +++++++++++++++++ shared/sockets.h | 2 + 8 files changed, 156 insertions(+), 131 deletions(-) diff --git a/server/commands/client_commands.c b/server/commands/client_commands.c index 0cb8d5f..bac9dda 100644 --- a/server/commands/client_commands.c +++ b/server/commands/client_commands.c @@ -66,7 +66,7 @@ hello_func (Client * c, int argc, char **argv) /* TODO: Give *real* info about the server/lcd...*/ if (argc > 1) { - sock_send_string (c->sock, "huh? extra parameters ignored\n"); + sock_send_error(c->sock, "extra parameters ignored\n"); } debug(RPT_INFO, "Hello!"); @@ -96,7 +96,7 @@ int client_set_func (Client * c, int argc, char **argv) { int i; - char str[16], buf[80]; + char str[16]; memset(str, '\0', sizeof(str)); if (!c->ack) @@ -105,13 +105,13 @@ client_set_func (Client * c, int argc, char **argv) if (argc != 3) { switch (argc) { case 1: - sock_send_string (c->sock, "huh? usage: client_set -name \n"); + sock_send_error(c->sock, "usage: client_set -name \n"); break; case 2: - sock_send_string (c->sock, "huh? Not enough parameters\n"); + sock_send_error(c->sock, "Not enough parameters\n"); break; default: - sock_send_string (c->sock, "huh? Too many parameters\n"); + sock_send_error(c->sock, "Too many parameters\n"); break; } return 0; @@ -130,13 +130,12 @@ client_set_func (Client * c, int argc, char **argv) if (strcmp (p, "name") == 0) { i++; if (argv[i] == '\0') { - snprintf (buf, sizeof(buf), "huh? internal error: no parameter #%d\n", i); - sock_send_string (c->sock, buf); + sock_printf_error(c->sock, "internal error: no parameter #%d\n", i); continue; } if (strlen(argv[i]) > sizeof(str) -1) { - sock_send_string (c->sock, "huh? name too long\n"); + sock_send_error(c->sock, "name too long\n"); } else { strncpy(str, argv[i], sizeof(str) - 1); @@ -147,15 +146,14 @@ client_set_func (Client * c, int argc, char **argv) free (c->name); if ((c->name = strdup (str)) == NULL) { - sock_send_string(c->sock, "huh? error allocating memory!\n"); + sock_send_error(c->sock, "error allocating memory!\n"); } else { sock_send_string(c->sock, "success\n"); i++; /* bypass argument (name string)*/ } } } else { - snprintf (buf, sizeof(buf), "huh? invalid parameter (%s)\n", p); - sock_send_string (c->sock, buf); + sock_printf_error(c->sock, "invalid parameter (%s)\n", p); } } while (++i < argc); @@ -174,7 +172,6 @@ client_add_key_func (Client * c, int argc, char **argv) { int exclusively = 0; int argnr; - char errmsg[BUFLEN]; if (!c->ack) return 1; @@ -182,7 +179,7 @@ client_add_key_func (Client * c, int argc, char **argv) if (argc < 2) { switch (argc) { case 1: - sock_send_string (c->sock, "huh? Usage: client_add_key [-exclusively|-shared] {}+\n"); + sock_send_error(c->sock, "Usage: client_add_key [-exclusively|-shared] {}+\n"); break; } return 0; @@ -197,17 +194,13 @@ client_add_key_func (Client * c, int argc, char **argv) exclusively = 1; } else { - snprintf( errmsg, BUFLEN-1, "huh? Invalid option: %s\n", argv[argnr] ); - errmsg[BUFLEN-1] = 0; - sock_send_string( c->sock, errmsg ); + sock_printf_error(c->sock, "Invalid option: %s\n", argv[argnr]); } argnr ++; } for ( ; argnr < argc; argnr++ ) { if( input_reserve_key( argv[argnr], exclusively, c ) < 0 ) { - snprintf( errmsg, BUFLEN-1, "huh? Could not reserve key \"%s\"\n", argv[argnr] ); - errmsg[BUFLEN-1] = 0; - sock_send_string( c->sock, errmsg ); + sock_printf_error(c->sock, "Could not reserve key \"%s\"\n", argv[argnr]); } } sock_send_string(c->sock, "success\n"); @@ -230,7 +223,7 @@ client_del_key_func (Client * c, int argc, char **argv) return 1; if (argc < 2) { - sock_send_string (c->sock, "huh? Usage: client_del_key {}+\n"); + sock_send_error(c->sock, "Usage: client_del_key {}+\n"); return 0; } @@ -256,10 +249,10 @@ backlight_func (Client * c, int argc, char **argv) if (argc != 2) { switch (argc) { case 1: - sock_send_string (c->sock, "huh? usage: backlight \n"); + sock_send_error(c->sock, "usage: backlight \n"); break; default: - sock_send_string (c->sock, "huh? Too many parameters...\n"); + sock_send_error(c->sock, "Too many parameters...\n"); break; } return 0; @@ -306,7 +299,7 @@ info_func (Client * c, int argc, char **argv) char str[1024]; if (argc > 1) { - sock_send_string (c->sock, "huh? Extra arguments ignored...\n"); + sock_send_error(c->sock, "Extra arguments ignored...\n"); } memset(str, '\0', sizeof(str)); diff --git a/server/commands/screen_commands.c b/server/commands/screen_commands.c index 6ed613c..0938436 100644 --- a/server/commands/screen_commands.c +++ b/server/commands/screen_commands.c @@ -50,10 +50,10 @@ screen_add_func (Client * c, int argc, char **argv) if (argc != 2) { switch (argc) { case 1: - sock_send_string (c->sock, "huh? Usage: screen_add \n"); + sock_send_error(c->sock, "Usage: screen_add \n"); break; default: - sock_send_string (c->sock, "huh? Too many parameters...\n"); + sock_send_error(c->sock, "Too many parameters...\n"); break; } return 0; @@ -63,14 +63,13 @@ screen_add_func (Client * c, int argc, char **argv) s = client_find_screen (c, argv[1]); if (s) { - sock_send_string(c->sock, "huh? Screen already exists\n"); + sock_send_error(c->sock, "Screen already exists\n"); return 0; } s = screen_create (argv[1], c); if (!s) { - report(RPT_ERR, "screen_add_func: Error creating screen"); - sock_send_string (c->sock, "huh? failed to create screen\n"); + sock_send_error(c->sock, "failed to create screen\n"); return 0; } @@ -79,8 +78,7 @@ screen_add_func (Client * c, int argc, char **argv) if (err == 0) { sock_send_string(c->sock, "success\n"); } else { - report(RPT_WARNING, "screen_add_func: Error adding screen"); - sock_send_string (c->sock, "huh? Failed to add screen\n"); + sock_send_error(c->sock, "failed to add screen\n"); } report(RPT_INFO, "Client on socket %d added added screen \"%s\"", c->sock, s->id); return 0; @@ -102,9 +100,9 @@ screen_del_func (Client * c, int argc, char **argv) if (argc != 2) { if (argc == 1) - sock_send_string (c->sock, "huh? Usage: screen_del \n"); + sock_send_error(c->sock, "Usage: screen_del \n"); else - sock_send_string (c->sock, "huh? Too many parameters...\n"); + sock_send_error(c->sock, "Too many parameters...\n"); return 0; } @@ -112,7 +110,7 @@ screen_del_func (Client * c, int argc, char **argv) s = client_find_screen (c, argv[1]); if (!s) { - sock_send_string(c->sock, "huh? Unknown screen id\n"); + sock_send_error(c->sock, "Unknown screen id\n"); return 0; } @@ -120,10 +118,9 @@ screen_del_func (Client * c, int argc, char **argv) if ( err == 0 ) sock_send_string(c->sock, "success\n"); else if (err < 0) { - report(RPT_WARNING, "screen_del_func: Error removing screen"); - sock_send_string(c->sock, "huh? Failed to remove screen\n"); + sock_send_error(c->sock, "failed to remove screen\n"); } else - sock_send_string (c->sock, "huh? Unknown screen id\n"); + sock_send_error(c->sock, "Unknown screen id\n"); report(RPT_INFO, "Client on socket %d removed screen \"%s\"", c->sock, s->id); @@ -152,17 +149,19 @@ screen_set_func (Client * c, int argc, char **argv) return 1; if (argc == 1) { - sock_send_string (c->sock, "huh? Usage: screen_set [ -priority ] [ -name ] [ -duration ] [ -wid ] [ -hgt ] [ -heartbeat ]\n"); + sock_send_error(c->sock, "Usage: screen_set [ -priority ]" + " [ -name ] [ -duration ] [ -wid ]" + " [ -hgt ] [ -heartbeat ]\n"); return 0; } else if (argc == 2) { - sock_send_string (c->sock, "huh? What do you want to set?\n"); + sock_send_error(c->sock, "What do you want to set?\n"); return 0; } id = argv[1]; s = client_find_screen (c, id); if (!s) { - sock_send_string (c->sock, "huh? Unknown screen id\n"); + sock_send_error(c->sock, "Unknown screen id\n"); return 0; } /* Handle the rest of the parameters*/ @@ -190,7 +189,7 @@ screen_set_func (Client * c, int argc, char **argv) s->name = strdup (argv[i]); sock_send_string(c->sock, "success\n"); } else { - sock_send_string (c->sock, "huh? -name requires a parameter\n"); + sock_send_error(c->sock, "-name requires a parameter\n"); } } /* Handle the "priority" parameter*/ @@ -217,10 +216,10 @@ screen_set_func (Client * c, int argc, char **argv) s->priority = number; sock_send_string(c->sock, "success\n"); } else { - sock_send_string(c->sock, "huh? invalid argument at -priority\n"); + sock_send_error(c->sock, "invalid argument at -priority\n"); } } else { - sock_send_string (c->sock, "huh? -priority requires a parameter\n"); + sock_send_error(c->sock, "-priority requires a parameter\n"); } } /* Handle the "duration" parameter*/ @@ -235,7 +234,7 @@ screen_set_func (Client * c, int argc, char **argv) s->duration = number; sock_send_string(c->sock, "success\n"); } else { - sock_send_string (c->sock, "huh? -duration requires a parameter\n"); + sock_send_error(c->sock, "-duration requires a parameter\n"); } } /* Handle the "heartbeat" parameter*/ @@ -253,7 +252,7 @@ screen_set_func (Client * c, int argc, char **argv) s->heartbeat = HEARTBEAT_OPEN; sock_send_string(c->sock, "success\n"); } else { - sock_send_string (c->sock, "huh? -heartbeat requires a parameter\n"); + sock_send_error(c->sock, "-heartbeat requires a parameter\n"); } } /* Handle the "wid" parameter*/ @@ -268,7 +267,7 @@ screen_set_func (Client * c, int argc, char **argv) s->width = number; sock_send_string(c->sock, "success\n"); } else { - sock_send_string (c->sock, "huh? -wid requires a parameter\n"); + sock_send_error(c->sock, "-wid requires a parameter\n"); } } @@ -284,7 +283,7 @@ screen_set_func (Client * c, int argc, char **argv) s->height = number; sock_send_string(c->sock, "success\n"); } else { - sock_send_string (c->sock, "huh? -hgt requires a parameter\n"); + sock_send_error(c->sock, "-hgt requires a parameter\n"); } } /* Handle the "timeout" parameter*/ @@ -303,7 +302,7 @@ screen_set_func (Client * c, int argc, char **argv) } sock_send_string(c->sock, "success\n"); } else { - sock_send_string (c->sock, "huh? -timeout requires a parameter\n"); + sock_send_error(c->sock, "-timeout requires a parameter\n"); } } /* Handle the "backlight" parameter*/ @@ -340,7 +339,7 @@ screen_set_func (Client * c, int argc, char **argv) } sock_send_string(c->sock, "success\n"); } else { - sock_send_string (c->sock, "huh? -backlight requires a parameter\n"); + sock_send_error(c->sock, "-backlight requires a parameter\n"); } } /* Handle the "cursor" parameter */ @@ -360,7 +359,7 @@ screen_set_func (Client * c, int argc, char **argv) s->cursor = CURSOR_BLOCK; sock_send_string(c->sock, "success\n"); } else { - sock_send_string (c->sock, "huh? -cursor requires a parameter\n"); + sock_send_error(c->sock, "-cursor requires a parameter\n"); } } /* Handle the "cursor_x" parameter */ @@ -376,10 +375,10 @@ screen_set_func (Client * c, int argc, char **argv) sock_send_string(c->sock, "success\n"); } else { - sock_send_string(c->sock, "huh? Cursor position outside screen\n"); + sock_send_error(c->sock, "Cursor position outside screen\n"); } } else { - sock_send_string (c->sock, "huh? -cursor_x requires a parameter\n"); + sock_send_error(c->sock, "-cursor_x requires a parameter\n"); } } /* Handle the "cursor_y" parameter */ @@ -395,14 +394,14 @@ screen_set_func (Client * c, int argc, char **argv) sock_send_string(c->sock, "success\n"); } else { - sock_send_string(c->sock, "huh? Cursor position outside screen\n"); + sock_send_error(c->sock, "Cursor position outside screen\n"); } } else { - sock_send_string (c->sock, "huh? -cursor_y requires a parameter\n"); + sock_send_error(c->sock, "-cursor_y requires a parameter\n"); } } - else sock_send_string (c->sock, "huh? invalid parameter\n"); + else sock_send_error(c->sock, "invalid parameter\n"); }/* done checking argv*/ return 0; } @@ -427,13 +426,13 @@ screen_add_key_func (Client * c, int argc, char **argv) if (argc != 3) { switch (argc) { case 1: - sock_send_string (c->sock, "huh? Usage: screen_add_key \n"); + sock_send_error(c->sock, "Usage: screen_add_key \n"); break; case 2: - sock_send_string (c->sock, "huh? You must specify a key list\n"); + sock_send_error(c->sock, "You must specify a key list\n"); break; default: - sock_send_string (c->sock, "huh? Too many parameters...\n"); + sock_send_error(c->sock, "Too many parameters...\n"); break; } return 0; @@ -446,7 +445,7 @@ screen_add_key_func (Client * c, int argc, char **argv) /* Find the screen*/ s = client_find_screen (c, id); if (!s) { - sock_send_string (c->sock, "huh? Unknown screen id\n"); + sock_send_error(c->sock, "Unknown screen id\n"); return 0; } @@ -469,14 +468,13 @@ screen_add_key_func (Client * c, int argc, char **argv) free (s->keys); s->keys = new_keys; } else { - report (RPT_WARNING, "screen_add_key: Allocation error"); - sock_send_string(c->sock, "huh? Could not add new keys\n"); + sock_send_error(c->sock, "Could not add new keys\n"); return 0; } } if (!s->keys) { - sock_send_string(c->sock, "huh? failed\n"); + sock_send_error(c->sock, "failed\n"); } else sock_send_string(c->sock, "success\n"); @@ -503,13 +501,13 @@ screen_del_key_func (Client * c, int argc, char **argv) if (argc != 3) { switch (argc) { case 1: - sock_send_string (c->sock, "huh? Usage: screen_del_key \n"); + sock_send_error(c->sock, "Usage: screen_del_key \n"); break; case 2: - sock_send_string (c->sock, "huh? You must specify a key list\n"); + sock_send_error(c->sock, "You must specify a key list\n"); break; default: - sock_send_string (c->sock, "huh? Too many parameters\n"); + sock_send_error(c->sock, "Too many parameters\n"); break; } return 0; @@ -523,7 +521,7 @@ screen_del_key_func (Client * c, int argc, char **argv) s = client_find_screen (c, id); if (!s) { - sock_send_string (c->sock, "huh? Unknown screen id\n"); + sock_send_error(c->sock, "Unknown screen id\n"); return 0; } diff --git a/server/commands/server_commands.c b/server/commands/server_commands.c index b0aa2ac..4f5a1e7 100644 --- a/server/commands/server_commands.c +++ b/server/commands/server_commands.c @@ -48,9 +48,9 @@ output_func (Client * c, int argc, char **argv) if (argc != 2) { if (argc == 1) - sock_send_string (c->sock, "huh? usage: output -- num may be decimal, hex, or octal\n"); + sock_send_error(c->sock, "usage: output -- num may be decimal, hex, or octal\n"); else - sock_send_string (c->sock, "huh? Too many parameters...\n"); + sock_send_error(c->sock, "Too many parameters...\n"); return 0; } @@ -88,18 +88,18 @@ output_func (Client * c, int argc, char **argv) if (errno) { int space; - strcat(str, "huh? number argument: "); + strcat(str, "number argument: "); space = sizeof(str) - 3 - strlen(str); strncat(str, strerror(errno), space); strcat(str, "\n"); - sock_send_string (c->sock, str); + sock_send_error(c->sock, str); return 0; } else if (*p != '\0' && *endptr == '\0') { output_state = out; } else { - sock_send_string (c->sock, "huh? invalid parameter...\n"); + sock_send_error(c->sock, "invalid parameter...\n"); return 0; } } @@ -135,9 +135,9 @@ sleep_func (Client * c, int argc, char **argv) if (argc != 2) { if (argc == 1) - sock_send_string (c->sock, "huh? usage: sleep \n"); + sock_send_error(c->sock, "usage: sleep \n"); else - sock_send_string (c->sock, "huh? Too many parameters...\n"); + sock_send_error(c->sock, "Too many parameters...\n"); return 0; } @@ -162,20 +162,20 @@ sleep_func (Client * c, int argc, char **argv) if (errno) { int space; - strcat(str, "huh? number argument: "); + strcat(str, "number argument: "); space = sizeof(str) - 3 - strlen(str); strncat(str, strerror(errno), space); strcat(str, "\n"); - sock_send_string (c->sock, str); + sock_send_error(c->sock, str); return 0; } else if (*p != '\0' && *endptr == '\0') { secs = out; out = out > MAX_SECS ? MAX_SECS : out; out = out < MIN_SECS ? MIN_SECS : out; } else { - sock_send_string (c->sock, "huh? invalid parameter...\n"); + sock_send_error(c->sock, "invalid parameter...\n"); return 0; } @@ -190,7 +190,7 @@ sleep_func (Client * c, int argc, char **argv) * while ((secs = sleep(secs)) > 0) */ ; - sock_send_string (c->sock, "huh? ignored (not fully implemented)\n"); + sock_send_error(c->sock, "ignored (not fully implemented)\n"); return 0; } diff --git a/server/commands/widget_commands.c b/server/commands/widget_commands.c index 26beb87..5d7227c 100644 --- a/server/commands/widget_commands.c +++ b/server/commands/widget_commands.c @@ -55,7 +55,7 @@ widget_add_func (Client * c, int argc, char **argv) return 1; if ((argc < 4) || (argc > 6)) { - sock_send_string (c->sock, "huh? Usage: widget_add [ -in ]\n"); + sock_send_error(c->sock, "Usage: widget_add [ -in ]\n"); return 0; } @@ -64,14 +64,14 @@ widget_add_func (Client * c, int argc, char **argv) s = client_find_screen (c, sid); if (!s) { - sock_send_string (c->sock, "huh? Invalid screen id\n"); + sock_send_error(c->sock, "Invalid screen id\n"); return 0; } /* Find widget type */ wtype = widget_typename_to_type (argv[3]); if (wtype == WID_NONE) { - sock_send_string (c->sock, "huh? Invalid widget type\n"); + sock_send_error(c->sock, "Invalid widget type\n"); return 0; } @@ -88,7 +88,7 @@ widget_add_func (Client * c, int argc, char **argv) Widget * frame; if (argc < 6) { - sock_send_string (c->sock, "huh? Specify a frame to place widget in\n"); + sock_send_error(c->sock, "Specify a frame to place widget in\n"); return 0; } @@ -98,8 +98,7 @@ widget_add_func (Client * c, int argc, char **argv) */ frame = screen_find_widget(s, argv[5]); if (!frame) { - report(RPT_WARNING, "widget_add_func: Error finding frame "); - sock_send_string(c->sock, "huh? Failed\n"); + sock_send_error(c->sock, "Error finding frame\n"); return 0; } s = frame->frame_screen; @@ -109,8 +108,7 @@ widget_add_func (Client * c, int argc, char **argv) /* Create the widget */ w = widget_create (wid, wtype, s); if (!w) { - report(RPT_WARNING, "widget_add_func: Error adding widget"); - sock_send_string(c->sock, "huh? Failed\n"); + sock_send_error(c->sock, "Error adding widget\n"); return 0; } @@ -119,8 +117,7 @@ widget_add_func (Client * c, int argc, char **argv) if (err == 0) sock_send_string(c->sock, "success\n"); else { - report(RPT_WARNING, "widget_add_func: Error adding widget"); - sock_send_string(c->sock, "huh? Failed\n"); + sock_send_error(c->sock, "Error adding widget\n"); } return 0; @@ -147,13 +144,13 @@ widget_del_func (Client * c, int argc, char **argv) if (argc != 3) { switch (argc) { case 1: - sock_send_string (c->sock, "huh? Usage: widget_del \n"); + sock_send_error(c->sock, "Usage: widget_del \n"); break; case 2: - sock_send_string (c->sock, "huh? Specify a widget #id\n"); + sock_send_error(c->sock, "Specify a widget #id\n"); break; default: - sock_send_string (c->sock, "huh? Too many parameters...\n"); + sock_send_error(c->sock, "Too many parameters...\n"); break; } return 0; @@ -166,13 +163,13 @@ widget_del_func (Client * c, int argc, char **argv) s = client_find_screen (c, sid); if (!s) { - sock_send_string (c->sock, "huh? Invalid screen id\n"); + sock_send_error(c->sock, "Invalid screen id\n"); return 0; } w = screen_find_widget (s, wid); if (!w) { - sock_send_string (c->sock, "huh? Invalid widget id\n"); + sock_send_error(c->sock, "Invalid widget id\n"); return 0; } @@ -180,8 +177,7 @@ widget_del_func (Client * c, int argc, char **argv) if (err == 0) sock_send_string(c->sock, "success\n"); else { - report( RPT_WARNING, "widget_del_func: Error removing widget"); - sock_send_string(c->sock, "huh? Failed\n"); + sock_send_error(c->sock, "Error removing widget\n"); } return 0; @@ -220,7 +216,7 @@ widget_set_func (Client * c, int argc, char **argv) */ if (argc < 4) { - sock_send_string (c->sock, "huh? Usage: widget_set \n"); + sock_send_error(c->sock, "Usage: widget_set \n"); return 0; } @@ -228,18 +224,18 @@ widget_set_func (Client * c, int argc, char **argv) sid = argv[1]; s = client_find_screen (c, sid); if (!s) { - sock_send_string (c->sock, "huh? Unknown screen id\n"); + sock_send_error(c->sock, "Unknown screen id\n"); return 0; } /* Find widget */ wid = argv[2]; w = screen_find_widget (s, wid); if (!w) { - sock_send_string (c->sock, "huh? Unknown widget id\n"); + sock_send_error(c->sock, "Unknown widget id\n"); /* Client Debugging...*/ { int i; - report( RPT_WARNING, "huh? Unknown widget id (%s)", argv[2]); + report( RPT_WARNING, "Unknown widget id (%s)", argv[2]); for (i = 0; i < argc; i++) report( RPT_WARNING, " %.40s ", argv[i]); } @@ -249,11 +245,11 @@ widget_set_func (Client * c, int argc, char **argv) switch (w->type) { case WID_STRING: /* String takes "x y text"*/ if (argc != i + 3) - sock_send_string (c->sock, "huh? Wrong number of arguments\n"); + sock_send_error(c->sock, "Wrong number of arguments\n"); else { if ((!isdigit ((unsigned int) argv[i][0])) || (!isdigit ((unsigned int) argv[i + 1][0]))) { - sock_send_string (c->sock, "huh? Invalid coordinates\n"); + sock_send_error(c->sock, "Invalid coordinates\n"); } else /* Set all the data...*/ { x = atoi (argv[i]); @@ -275,11 +271,11 @@ widget_set_func (Client * c, int argc, char **argv) break; case WID_HBAR: /* Hbar takes "x y length"*/ if (argc != i + 3) - sock_send_string (c->sock, "huh? Wrong number of arguments\n"); + sock_send_error(c->sock, "Wrong number of arguments\n"); else { if ((!isdigit ((unsigned int) argv[i][0])) || (!isdigit ((unsigned int) argv[i + 1][0]))) { - sock_send_string (c->sock, "huh? Invalid coordinates\n"); + sock_send_error(c->sock, "Invalid coordinates\n"); } else { x = atoi (argv[i]); y = atoi (argv[i + 1]); @@ -294,11 +290,11 @@ widget_set_func (Client * c, int argc, char **argv) break; case WID_VBAR: /* Vbar takes "x y length"*/ if (argc != i + 3) - sock_send_string (c->sock, "huh? Wrong number of arguments\n"); + sock_send_error(c->sock, "Wrong number of arguments\n"); else { if ((!isdigit ((unsigned int) argv[i][0])) || (!isdigit ((unsigned int) argv[i + 1][0]))) { - sock_send_string (c->sock, "huh? Invalid coordinates\n"); + sock_send_error(c->sock, "Invalid coordinates\n"); } else { x = atoi (argv[i]); y = atoi (argv[i + 1]); @@ -313,18 +309,18 @@ widget_set_func (Client * c, int argc, char **argv) break; case WID_ICON: /* Icon takes "x y icon"*/ if (argc != i + 3) - sock_send_string (c->sock, "huh? Wrong number of arguments\n"); + sock_send_error(c->sock, "Wrong number of arguments\n"); else { if ((!isdigit ((unsigned int) argv[i][0])) || (!isdigit ((unsigned int) argv[i + 1][0]))) { - sock_send_string (c->sock, "huh? Invalid coordinates\n"); + sock_send_error(c->sock, "Invalid coordinates\n"); } else { int icon; x = atoi (argv[i]); y = atoi (argv[i + 1]); icon = widget_iconname_to_icon (argv[i + 2]); if (icon == -1) { - sock_send_string (c->sock, "huh? Invalid icon name\n"); + sock_send_error(c->sock, "Invalid icon name\n"); } else { w->x = x; w->y = y; @@ -336,7 +332,7 @@ widget_set_func (Client * c, int argc, char **argv) break; case WID_TITLE: /* title takes "text"*/ if (argc != i + 1) - sock_send_string (c->sock, "huh? Wrong number of arguments\n"); + sock_send_error(c->sock, "Wrong number of arguments\n"); else { if (w->text) free (w->text); @@ -353,13 +349,13 @@ widget_set_func (Client * c, int argc, char **argv) break; case WID_SCROLLER: /* Scroller takes "left top right bottom direction speed text"*/ if (argc != i + 7) { - sock_send_string (c->sock, "huh? Wrong number of arguments\n"); + sock_send_error(c->sock, "Wrong number of arguments\n"); } else { if ((!isdigit ((unsigned int) argv[i][0])) || (!isdigit ((unsigned int) argv[i + 1][0])) || (!isdigit ((unsigned int) argv[i + 2][0])) || (!isdigit ((unsigned int) argv[i + 3][0]))) { - sock_send_string (c->sock, "huh? Invalid coordinates\n"); + sock_send_error(c->sock, "Invalid coordinates\n"); } else { left = atoi (argv[i]); /*debug("left: %d",left);*/ @@ -376,7 +372,7 @@ widget_set_func (Client * c, int argc, char **argv) /* Direction must be m, v or h*/ if (((char) direction != 'h') && ((char) direction != 'v') && ((char) direction != 'm')) { - sock_send_string (c->sock, "huh? Invalid direction\n"); + sock_send_error(c->sock, "Invalid direction\n"); } else { w->left = left; w->top = top; @@ -388,8 +384,7 @@ widget_set_func (Client * c, int argc, char **argv) free (w->text); w->text = strdup (argv[i + 6]); if (!w->text) { - sock_send_string(c->sock, "huh? Failed\n"); - report( RPT_WARNING, "widget_set_func: Allocation error"); + sock_send_error(c->sock, "Allocation error\n"); return -1; } debug (RPT_DEBUG, "Widget %s set to %s", wid, w->text); @@ -400,7 +395,7 @@ widget_set_func (Client * c, int argc, char **argv) break; case WID_FRAME: /* Frame takes "left top right bottom wid hgt direction speed"*/ if (argc != i + 8) { - sock_send_string (c->sock, "huh? Wrong number of arguments\n"); + sock_send_error(c->sock, "Wrong number of arguments\n"); } else { if ((!isdigit ((unsigned int) argv[i][0])) || (!isdigit ((unsigned int) argv[i + 1][0])) || @@ -408,7 +403,7 @@ widget_set_func (Client * c, int argc, char **argv) (!isdigit ((unsigned int) argv[i + 3][0])) || (!isdigit ((unsigned int) argv[i + 4][0])) || (!isdigit ((unsigned int) argv[i + 5][0]))) { - sock_send_string (c->sock, "huh? Invalid coordinates\n"); + sock_send_error(c->sock, "Invalid coordinates\n"); } else { left = atoi (argv[i]); /*debug("left: %d",left);*/ @@ -428,7 +423,7 @@ widget_set_func (Client * c, int argc, char **argv) /*debug("speed: %d",speed);*/ /* Direction must be v or h*/ if (((char) direction != 'h') && ((char) direction != 'v')) { - sock_send_string (c->sock, "huh? Invalid direction\n"); + sock_send_error(c->sock, "Invalid direction\n"); } else { w->left = left; w->top = top; @@ -446,12 +441,12 @@ widget_set_func (Client * c, int argc, char **argv) break; case WID_NUM: /* Num takes "x num"*/ if (argc != i + 2) - sock_send_string (c->sock, "huh? Wrong number of arguments\n"); + sock_send_error(c->sock, "Wrong number of arguments\n"); else { if (!isdigit ((unsigned int) argv[i][0])) { - sock_send_string (c->sock, "huh? Invalid coordinates\n"); + sock_send_error(c->sock, "Invalid coordinates\n"); } else if (!isdigit ((unsigned int) argv[i + 1][0])) { - sock_send_string (c->sock, "huh? Invalid number\n"); + sock_send_error(c->sock, "Invalid number\n"); } else { x = atoi (argv[i]); y = atoi (argv[i + 1]); @@ -464,7 +459,7 @@ widget_set_func (Client * c, int argc, char **argv) break; case WID_NONE: default: - sock_send_string (c->sock, "huh? Widget has no type\n"); + sock_send_error(c->sock, "Widget has no type\n"); break; } diff --git a/server/parse.c b/server/parse.c index 03e0073..ec2f72b 100644 --- a/server/parse.c +++ b/server/parse.c @@ -53,7 +53,6 @@ static int parse_message (const char *str, Client *c) typedef enum { ST_INITIAL, ST_WHITESPACE, ST_ARGUMENT, ST_FINAL } State; State state = ST_INITIAL; - char errmsg[256]; int error = 0; char quote = '\0'; /* The quote used to open a quote string */ int pos = 0; @@ -83,7 +82,7 @@ static int parse_message (const char *str, Client *c) arg_space = malloc(strlen(str)+1); if (arg_space == NULL) { report (RPT_ERR, "%s: Could not allocate memory", __FUNCTION__); - sock_send_string(c->sock, "huh? error allocating memory!\n"); + sock_send_error(c->sock, "error allocating memory!\n"); } argv[0] = arg_space; @@ -163,9 +162,7 @@ static int parse_message (const char *str, Client *c) error = 1; if (error) { - report( RPT_WARNING, "Could not parse command from client on socket %d: %.40s", c->sock, str ); - snprintf (errmsg, sizeof(errmsg), "huh? Could not parse command\n"); - sock_send_string (c->sock, errmsg); + sock_send_error(c->sock, "Could not parse command\n"); free( arg_space ); return 0; } @@ -183,14 +180,12 @@ static int parse_message (const char *str, Client *c) if (function != NULL) { error = function (c, argc, argv); if (error) { - snprintf (errmsg, sizeof(errmsg), "huh? Function returned error \"%.40s\"\n", argv[0]); - sock_send_string (c->sock, errmsg); + sock_printf_error(c->sock, "Function returned error \"%.40s\"\n", argv[0]); report( RPT_WARNING, "Command function returned an error after command from client on socket %d: %.40s", c->sock, str ); } } else { - snprintf (errmsg, sizeof(errmsg), "huh? Invalid command \"%.40s\"\n", argv[0]); - sock_send_string (c->sock, errmsg); + sock_printf_error(c->sock, "Invalid command \"%.40s\"\n", argv[0]); report( RPT_WARNING, "Invalid command from client on socket %d: %.40s", c->sock, str ); } diff --git a/server/sock.c b/server/sock.c index 26016de..ce08b76 100644 --- a/server/sock.c +++ b/server/sock.c @@ -409,9 +409,7 @@ sock_read_from_client(struct ClientSocketMap* clientSocketMap) return -1; } else if (nbytes > (MAXMSG - (MAXMSG / 8))) /* Very noisy client...*/ { - sock_send_string(clientSocketMap->socket, "huh? Too much data received... quiet down!\n"); - report(RPT_WARNING, "%s: Too much data received on socket %d", - __FUNCTION__, clientSocketMap->socket); + sock_send_error(clientSocketMap->socket, "Too much data received... quiet down!\n"); return -1; } else /* Data Read*/ { diff --git a/shared/sockets.c b/shared/sockets.c index 81aa0eb..864afd0 100644 --- a/shared/sockets.c +++ b/shared/sockets.c @@ -292,3 +292,47 @@ sock_geterror(void) #endif } +/** prints error to logfile and sends it to the client. + * @param fd socket + * @param message the message to send (without the "huh? ") */ +int sock_send_error(int fd, char* message) +{ + // simple: performance penalty isn't worth more work... + return sock_printf_error(fd, message); +} + +/** prints printf-like formatted output to logfile and sends it to the + * client. + * @param fd socket + * @param message the message to send (without the "huh? ") */ +int +sock_printf_error(int fd, const char *format, .../*args*/ ) +{ + char buf[MAXMSG]; + static const int huhsize = sizeof("huh? ") - 1; + char *p = buf + huhsize; + + va_list ap; + int size = 0; + + va_start(ap, format); + size = vsnprintf(buf, sizeof(buf), format, ap); + va_end(ap); + + if (size < 0) { + report(RPT_ERR, "sock_printf_error: vsnprintf failed"); + return -1; + } + if (size > sizeof(buf)) + report(RPT_WARNING, "sock_printf_error: vsnprintf truncated message"); + + /* prepend the "huh? " */ + if (size > sizeof(buf) - huhsize) + size = sizeof(buf) - huhsize; + + memmove(p, buf, size); + memcpy(buf, "huh? ", huhsize); + + report(RPT_ERR, "error: %s", buf); + return sock_send_string(fd, buf); +} diff --git a/shared/sockets.h b/shared/sockets.h index a186fdf..04a8193 100644 --- a/shared/sockets.h +++ b/shared/sockets.h @@ -36,6 +36,8 @@ int sock_recv (int fd, void *dest, size_t maxlen); /* Return error message string for the socket function */ char *sock_geterror(void); +int sock_send_error(int fd, char* message); +int sock_printf_error(int fd, const char *format, .../*args*/); // Er, ignore the rest of this file. I'll clean it up sometime...