1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
void send_cmd(char *sockname, char *cmd)
{
int sock;
struct sockaddr_un addr;
int total, tbw;
fprintf(stderr, "sending '%s' on '%s'\n", cmd, sockname);
if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
{
perror("socket");
exit(1);
}
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, sockname);
if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("connect");
exit(1);
}
total = strlen(cmd);
tbw = 0;
while (tbw < total)
{
int bw;
if ((bw = write(sock, cmd + tbw, total - tbw)) < 0)
{
switch (errno)
{
case EAGAIN:
case EINTR:
continue;
default:
close(sock);
perror("socket");
exit(1);
}
}
tbw += bw;
}
close(sock);
return;
}
int
main(int argc, char **argv)
{
if (argc != 3)
{
fprintf(stderr, "usage: lw-ctl <control file> <command>\n"
"\tcommand be one of:\n"
"\tRUN: put loadwatch into sticky run mode\n"
"\tSTOP: put loadwatch into sticky stop mode\n"
"\tWATCH: put loadwatch into regular load watching mode\n");
}
else
{
send_cmd(argv[1], argv[2]);
}
return 0;
}
|