FreeCalypso > hg > fc-rfcal-tools
annotate autocal/tsidsock.c @ 80:b0da2db4e36b
fc-rfcal-txband: basis run implemented
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sat, 15 Jul 2017 21:22:38 +0000 |
| parents | f67f46e56355 |
| children |
| rev | line source |
|---|---|
|
14
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * TSID local socket interface |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 */ |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 #include <sys/types.h> |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <sys/socket.h> |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <sys/un.h> |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <stdio.h> |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <string.h> |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <strings.h> |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include <stdlib.h> |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 #include <unistd.h> |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 #include <rvinterf/exitcodes.h> |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 char *tsid_socket_pathname = "/tmp/fc_rftest_socket"; |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 int tsid_socket; |
|
19
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
17 char tsid_response[4096]; |
|
14
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 connect_tsid_socket() |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 { |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 /* local socket binding voodoo copied from osmocon */ |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 struct sockaddr_un local; |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 unsigned int namelen; |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 int rc; |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 tsid_socket = socket(AF_UNIX, SOCK_STREAM, 0); |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 if (tsid_socket < 0) { |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 perror("socket(AF_UNIX, SOCK_STREAM, 0)"); |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 exit(ERROR_UNIX); |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 } |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 local.sun_family = AF_UNIX; |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 strncpy(local.sun_path, tsid_socket_pathname, sizeof(local.sun_path)); |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 local.sun_path[sizeof(local.sun_path) - 1] = '\0'; |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 /* we use the same magic that X11 uses in Xtranssock.c for |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 * calculating the proper length of the sockaddr */ |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 #if defined(BSD44SOCKETS) || defined(__UNIXWARE__) |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 local.sun_len = strlen(local.sun_path); |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 #endif |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 #if defined(BSD44SOCKETS) || defined(SUN_LEN) |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 namelen = SUN_LEN(&local); |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 #else |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 namelen = strlen(local.sun_path) + |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 offsetof(struct sockaddr_un, sun_path) + 1; |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 #endif |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 rc = connect(tsid_socket, (struct sockaddr *) &local, namelen); |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 if (rc != 0) { |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 perror(tsid_socket_pathname); |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 exit(ERROR_RFTEST); |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 } |
|
19
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
53 collect_tsid_response(); |
|
14
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 return(0); |
|
93e5194e5511
autocal/tsidsock.c written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 } |
|
19
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
56 |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
57 collect_tsid_response() |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
58 { |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
59 char buf[BUFSIZ]; |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
60 int cc, pos; |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
61 |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
62 for (pos = 0; ; ) { |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
63 cc = read(tsid_socket, buf, sizeof buf); |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
64 if (cc <= 0) { |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
65 perror("read from TSID socket"); |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
66 exit(ERROR_RFTEST); |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
67 } |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
68 if (pos + cc > sizeof tsid_response) { |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
69 fprintf(stderr, |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
70 "error: response from TSID exceeds our buffer size\n"); |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
71 exit(ERROR_RFTEST); |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
72 } |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
73 bcopy(buf, tsid_response + pos, cc); |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
74 pos += cc; |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
75 if (tsid_response[pos-1] == '\n') |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
76 break; |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
77 } |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
78 tsid_response[pos-1] = '\0'; |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
79 if (tsid_response[0] != '+') { |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
80 fprintf(stderr, "Error from TSID: %s\n", tsid_response); |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
81 exit(ERROR_RFTEST); |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
82 } |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
83 return(0); |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
84 } |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
85 |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
86 tsid_command(cmd) |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
87 char *cmd; |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
88 { |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
89 write(tsid_socket, cmd, strlen(cmd)); |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
90 collect_tsid_response(); |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
91 return(0); |
|
f67f46e56355
autocal/tsidsock.c: implemented command/response protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
14
diff
changeset
|
92 } |
