// readline library does strange things when stdin is nonblocking.
// if (fcntl(0, F_SETFL, O_NONBLOCK) < 0)
- // die("fcntl: %m");
+ // DIE("fcntl");
}
static void
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
+#include <errno.h>
#include <sys/ioctl.h>
#include <signal.h>
tty.c_lflag &= (~ICANON);
if (tcsetattr (0, TCSANOW, &tty) < 0)
- die("tcsetattr: %m");
+ DIE("tcsetattr");
more_active = 1;
}
more_active = 0;
if (tcsetattr (0, TCSANOW, &stored_tty) < 0)
- die("tcsetattr: %m");
+ DIE("tcsetattr");
}
static void
return;
if (tcgetattr(0, &stored_tty) < 0)
- die("tcgetattr: %m");
+ DIE("tcgetattr");
if (signal(SIGINT, sig_handler) == SIG_IGN)
signal(SIGINT, SIG_IGN);
server_fd = socket(AF_UNIX, SOCK_STREAM, 0);
if (server_fd < 0)
- die("Cannot create socket: %m");
+ DIE("Cannot create socket");
if (strlen(server_path) >= sizeof(sa.sun_path))
die("server_connect: path too long");
sa.sun_family = AF_UNIX;
strcpy(sa.sun_path, server_path);
if (connect(server_fd, (struct sockaddr *) &sa, SUN_LEN(&sa)) < 0)
- die("Unable to connect to server control socket (%s): %m", server_path);
+ DIE("Unable to connect to server control socket (%s)", server_path);
if (fcntl(server_fd, F_SETFL, O_NONBLOCK) < 0)
- die("fcntl: %m");
+ DIE("fcntl");
}
redo:
c = read(server_fd, server_read_pos, server_read_buf + sizeof(server_read_buf) - server_read_pos);
if (!c)
- die("Connection closed by server.");
+ die("Connection closed by server");
if (c < 0)
{
if (errno == EINTR)
goto redo;
else
- die("Server read error: %m");
+ DIE("Server read error");
}
start = server_read_buf;
if (errno == EINTR)
continue;
else
- die("select: %m");
+ DIE("select");
}
if (FD_ISSET(0, &select_fds))
if (errno == EINTR)
continue;
else
- die("select: %m");
+ DIE("select");
}
if (FD_ISSET(server_fd, &set))
else if (errno == EINTR)
continue;
else
- die("Server write error: %m");
+ DIE("Server write error");
}
else
{
}
}
-
-/* XXXX
-
- get_term_size();
-
- if (tcgetattr(0, &tty_save) != 0)
- {
- perror("tcgetattr error");
- return(EXIT_FAILURE);
- }
- }
-
- */
int
main(int argc, char **argv)
{
/* client.c */
void submit_command(char *cmd_raw);
+
+/* die() with system error messages */
+#define DIE(x, y...) die(x ": %s", ##y, strerror(errno))
if (!new)
{
int size = sizeof(struct cmd_node) + c-d;
- new = xmalloc(size);
+ new = malloc(size);
bzero(new, size);
*old->plastson = new;
old->plastson = &new->sibling;
puts("No such command. Press `?' for help.");
return NULL;
}
- b = xmalloc(strlen(n->cmd->command) + strlen(args) + 1);
+ b = malloc(strlen(n->cmd->command) + strlen(args) + 1);
sprintf(b, "%s%s", n->cmd->command, args);
return b;
}
{
char buf[1024];
- if (bvsnprintf(buf, sizeof(buf)-1, msg, args) < 0)
- bsprintf(buf + sizeof(buf) - 100, " ... <too long>");
+ int n = vsnprintf(buf, sizeof(buf), msg, args);
+ if (n < 0)
+ snprintf(buf, sizeof(buf), "???");
+ if (n >= sizeof(buf))
+ snprintf(buf + sizeof(buf) - 100, 100, " ... <too long>");
fputs(buf, stderr);
fputc('\n', stderr);
}