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