/usr/share/doc/apcupsd/examples/client.c is in apcupsd-doc 3.14.12-1.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | /*
* Client test program for apcnetd
* This program reads from standard input and passes the
* commands to the apcupsd network information server.
* It then prints to stdout the responses from the server.
*
* Build it with: cc -I../include client.c ../src/lib/libapc.a -o client
*
* Execute: ./client [host[:port]] [command]
* reads commands from STDIN if command is not present
* if command is present, it is sent to the daemon,
* the output is retrieved, then the program exits.
*
* The two commands currently (Apr 2001) accepted by the
* server are "status" and "events".
*
* For additional examples of code, see cgi/upsfetch.c
*/
#include "apc.h"
#ifdef HAVE_NISLIB
/* Default values, can be changed on command line */
#define SERV_TCP_PORT 3551
#define SERV_HOST_ADDR "127.0.0.1"
void handle_client(FILE *fp, int sockfd, char *cmd);
void error_abort(const char *msg)
{
fprintf(stderr, msg);
exit(1);
}
int main(int argc, char *argv[])
{
int sockfd, port;
char host[200];
char msg[200], *p, *cmd;
strcpy(host, SERV_HOST_ADDR);
port = SERV_TCP_PORT;
if (argc > 1) {
strcpy(host, argv[1]); /* get host from command line */
p = strchr(host, ':');
if (p) {
*p++ = 0;
port = atoi(p);
}
}
if (argc > 2) {
cmd = argv[2];
} else {
cmd = NULL;
}
if ((sockfd = net_open(host, NULL, port)) < 0) {
sprintf(msg, "client: tcp_open for host %s on %d failed\n", host, port);
error_abort(msg);
}
handle_client(stdin, sockfd, cmd); /* do it all */
net_close(sockfd);
exit(0);
}
/*
* Read the contents of the FILE *fp, write each line to the
* stream socket (to the server process), then read a line back from
* the socket and write it to the standard output.
*
* Return to the caller when an EOF is encountered on the input file.
*/
#define MAXLINE 5000
void handle_client(FILE *fp, int sockfd, char *cmd)
{
int n;
char sendline[MAXLINE];
char recvline[MAXLINE+1];
int quit = 0;
while (!quit) {
if (cmd) {
strcpy(sendline, cmd); /* one shot command */
quit = 1;
} else if (fgets(sendline, MAXLINE, fp) == NULL) {
break;
}
n = strlen(sendline);
if (net_send(sockfd, sendline, n) != n)
error_abort("handle_client: write error on socket");
while ((n = net_recv(sockfd, recvline, sizeof(recvline))) > 0) {
recvline[n] = 0;
fputs(recvline, stdout);
}
if (n < 0) {
char msg[200];
sprintf(msg, "handle_client: net_recv error: %s\n", strerror(-n));
error_abort(msg);
}
}
}
#else /* HAVE_NISLIB */
int main(int argc, char *argv[]) {
printf("Sorry, NIS code is not compiled in apcupsd.\n");
return 1;
}
#endif /* HAVE_NISLIB */
|