]> git.mxchange.org Git - flightgear.git/blob - scripts/example/fgfsclient.c
- don't use static buffer in class method
[flightgear.git] / scripts / example / fgfsclient.c
1 /* $Id$ */
2 /* gcc -O2 -g -pedantic -Wall fgfsclient.c -o fgfsclient */
3 /* Public Domain */
4
5 #include <stdio.h>
6 #include <errno.h>
7 #include <stdlib.h>
8 #include <unistd.h>
9 #include <sys/time.h>
10 #include <sys/types.h>
11 #include <sys/socket.h>
12 #include <netdb.h>
13 #include <netinet/in.h>
14 #include <stdarg.h>
15 #include <string.h>
16
17
18 #define DFLTHOST        "localhost"
19 #define DFLTPORT        5501
20 #define MAXMSG          256
21 #define fgfsclose       close
22
23
24 void init_sockaddr(struct sockaddr_in *name, const char *hostname, unsigned port);
25 int fgfswrite(int sock, char *msg, ...);
26 const char *fgfsread(int sock, int wait);
27 void fgfsflush(int sock);
28
29
30
31 int fgfswrite(int sock, char *msg, ...)
32 {
33         va_list va;
34         ssize_t len;
35         char buf[MAXMSG];
36
37         va_start(va, msg);
38         vsprintf(buf, msg, va);
39         va_end(va);
40         printf("SEND: \t<%s>\n", buf);
41         strcat(buf, "\015\012");
42
43         len = write(sock, buf, strlen(buf));
44         if (len < 0) {
45                 perror("fgfswrite");
46                 exit(EXIT_FAILURE);
47         }
48         return len;
49 }
50
51
52
53 const char *fgfsread(int sock, int timeout)
54 {
55         static char buf[MAXMSG];
56         char *p;
57         fd_set ready;
58         struct timeval tv;
59         ssize_t len;
60
61         FD_ZERO(&ready);
62         FD_SET(sock, &ready);
63         tv.tv_sec = timeout;
64         tv.tv_usec = 0;
65         if (!select(32, &ready, 0, 0, &tv))
66                 return NULL;
67
68         len = read(sock, buf, MAXMSG - 1);
69         if (len < 0) {
70                 perror("fgfsread");
71                 exit(EXIT_FAILURE);
72         } 
73         if (len == 0)
74                 return NULL;
75
76         for (p = &buf[len - 1]; p >= buf; p--)
77                 if (*p != '\015' && *p != '\012')
78                         break;
79         *++p = '\0';
80         return strlen(buf) ? buf : NULL;
81 }
82
83
84
85 void fgfsflush(int sock)
86 {
87         const char *p;
88         while ((p = fgfsread(sock, 0)) != NULL) {
89                 printf("IGNORE: \t<%s>\n", p);
90         }
91 }
92
93
94
95 int fgfsconnect(const char *hostname, const int port)
96 {
97         struct sockaddr_in serv_addr;
98         struct hostent *hostinfo;
99         int sock;
100
101         sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
102         if (sock < 0) {
103                 perror("fgfsconnect/socket");
104                 return -1;
105         }
106
107         hostinfo = gethostbyname(hostname);
108         if (hostinfo == NULL) {
109                 fprintf(stderr, "fgfsconnect: unknown host: \"%s\"\n", hostname);
110                 close(sock);
111                 return -2;
112         }
113
114         serv_addr.sin_family = AF_INET;
115         serv_addr.sin_port = htons(port);
116         serv_addr.sin_addr = *(struct in_addr *)hostinfo->h_addr;
117
118         if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
119                 perror("fgfsconnect/connect");
120                 close(sock);
121                 return -3;
122         }
123         return sock;
124 }
125
126
127
128 int main(int argc, char **argv)
129 {
130         int sock;
131         unsigned port;
132         const char *hostname, *p;
133
134         hostname = argc > 1 ? argv[1] : DFLTHOST;
135         port = argc > 2 ? atoi(argv[2]) : DFLTPORT;
136
137         sock = fgfsconnect(hostname, port);
138         if (sock < 0)
139                 return EXIT_FAILURE;
140
141         fgfswrite(sock, "data");
142         fgfswrite(sock, "set /controls/engines/engine[%d]/throttle %d", 0, 1);
143         fgfswrite(sock, "get /sim/aircraft");
144         p = fgfsread(sock, 3);
145         if (p != NULL)
146                 printf("READ: \t<%s>\n", p);
147         fgfswrite(sock, "quit");
148         fgfsclose(sock);
149         return EXIT_SUCCESS;
150 }
151
152