1 /*
2 $Id$
3 */
4
5 #include <math.h>
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include <unistd.h>
9 #include <errno.h>
10 #include <string.h>
11 #include <sys/types.h>
12 #if !defined(__MINGW32__)
13 #include <sys/socket.h>
14 #include <sys/un.h>
15 #include <netinet/in.h>
16 #include <arpa/inet.h>
17 #include <netdb.h>
18 #endif
19 #include "typesf2c.h"
20
21
22
23 #if defined(CRAY) || defined(CRAY_T3D)
24 #include <fortran.h>
25 #if !defined(__crayx1)
26 #define USE_FCD
27 #endif
28 #endif
29
30 #if (defined(CRAY) || defined(CRAY_T3D) || defined(WIN32)) &&!defined(__crayx1) &&!defined(__MINGW32__)
31 #define nwpw_talker_ nwpw_talker
32 #define nwpw_talker_close_ nwpw_talker_close
33 #define nwpw_talker_write_ nwpw_talker_write
34 #define nwpw_talker_read_ nwpw_talker_read
35 #endif
36
nwpw_talker_(const _fcd fcd_addr_name,Integer * inet,Integer * n1,Integer * portin,Integer * sockout)37 void FATR nwpw_talker_
38 #if defined(USE_FCD)
39 ( const _fcd fcd_addr_name,
40 Integer *inet,
41 Integer *n1,
42 Integer *portin,
43 Integer *sockout)
44 {
45 char *addr_name = _fcdtocp(fcd_addr_name);
46
47 #else
48 (addr_name,inet,n1,portin,sockout)
49 char addr_name[];
50 Integer *inet;
51 Integer *n1;
52 Integer *portin;
53 Integer *sockout;
54 {
55
56 #endif
57
58 #if defined(__MINGW32__)
59 perror("nwpw_talker: not coded for this architecture");
60 exit(1);
61 #else
62 int sock = 0, valread;
63 int na = ((int) *n1);
64
65 addr_name[na] = 0;
66 addr_name[na+1] = 0;
67
68 if (*inet>0)
69 {
70 struct sockaddr_in serv_addr;
71 int port = ((int) *portin);
72
73 printf("nwpw_talker: addr_name=%s\n",addr_name);
74 printf("nwpw_talker: port=%d\n",port);
75
76 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
77 {
78 printf("\nnwpw_talker:Socket creation error \n");
79 exit(1);
80 }
81 serv_addr.sin_family = AF_INET;
82 serv_addr.sin_port = htons(port);
83
84 // Convert IPv4 and IPv6 addresses from text to binary form
85 if(inet_pton(AF_INET, addr_name, &serv_addr.sin_addr)<=0)
86 {
87 printf("\nnwpw_talker:Invalid address/ Address not supported \n");
88 exit(1);
89 }
90 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
91 {
92 printf("\nnwpw_talker:Connection Failed \n");
93 exit(1);
94 }
95 }
96 else
97 {
98 struct sockaddr_un serv_addr;
99 memset(&serv_addr, 0, sizeof(struct sockaddr_un));
100 serv_addr.sun_family = AF_UNIX;
101 strcpy(serv_addr.sun_path, "/tmp/ipi_");
102 strcpy(serv_addr.sun_path+9, addr_name);
103 if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
104 {
105 printf("\nnwpw_talker:Socket creation error \n");
106 exit(1);
107 }
108 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
109 {
110 printf("\nnwpw_talker:Failed to connect to UNIX socket \n");
111 exit(1);
112 }
113 }
114
115 printf("nwpw_talker: sockid=%d\n",sock);
116 *sockout = ((Integer) sock);
117 #endif
118 }
119
120
121
122
123 void FATR nwpw_talker_close_
124 #if defined(USE_FCD)
125 (Integer *socket1)
126 {
127 #else
128 (socket1)
129 Integer *socket1;
130 {
131 #endif
132 #if defined(__MINGW32__)
133 perror("nwpw_talker: not coded for this architecture");
134 exit(1);
135 #else
136 int sock = ((int) *socket1);
137 close(sock);
138 #endif
139 }
140
141
142 void FATR nwpw_talker_write_
143 #if defined(USE_FCD)
144 (Integer *socket1,
145 const _fcd fcd_buffer,
146 Integer *n1)
147 {
148 char *buffer = _fcdtocp(fcd_buffer);
149 #else
150 (socket1,buffer,n1)
151 Integer *socket1;
152 char buffer[];
153 Integer *n1;
154 {
155 #endif
156 #if defined(__MINGW32__)
157 perror("nwpw_talker_write: not coded for this architecture");
158 exit(1);
159 #else
160 int sock = ((int) *socket1);
161 int nbuf = ((int) *n1);
162 int it=0;
163 int n = 0;
164 while (((n += write(sock, &(buffer[n]), nbuf-n)) < nbuf) && (it<100)) {
165 buffer[n] = 0;
166 ++it;
167 }
168 //send(sock,buffer,nbuf,0);
169 //printf("nwpw_talker_write: sock=%d and n=%d nbuf=%d\n",sock,n,nbuf);
170 //printf("nwpw_talker_write: sock=%d and n=%d buf=%s\n",sock,nbuf,buffer);
171
172 #endif
173 }
174
175
176
177
178
179 void FATR nwpw_talker_read_
180 #if defined(USE_FCD)
181 (Integer *socket1,
182 const _fcd fcd_buffer,
183 Integer *n1)
184 {
185 char *buffer = _fcdtocp(fcd_buffer);
186 #else
187 (socket1,buffer,n1)
188 Integer *socket1;
189 char buffer[];
190 Integer *n1;
191 {
192 #endif
193 #if defined(__MINGW32__)
194 perror("nwpw_talker_read: not coded for this architecture");
195 exit(1);
196 #else
197 int sock = ((int) *socket1);
198 int nbuf = ((int) *n1);
199 int valread=0;
200 int readit=0;
201 bzero(buffer,nbuf+2);
202 while ((((valread += read(sock,&(buffer[valread]),nbuf-valread))) < nbuf) && (readit<100))
203 {
204 buffer[valread] = 0;
205 ++readit;
206 }
207
208 //printf("nwpw_talker_read: received %d bytes with nbuf=%d from sock:%d\n", valread,nbuf,sock);
209 //printf("nwpw_talker_read: message received: %s\n\n",buffer);
210
211 #endif
212 }
213
214
215
216
217
218
219 #if (defined(CRAY) || defined(CRAY_T3D) || defined(WIN32)) &&!defined(__crayx1) &&!defined(__MINGW32__)
220 #define nwpw_listener_ nwpw_listener
221 #endif
222
223 void FATR nwpw_listener_
224 #if defined(USE_FCD)
225 ( const _fcd fcd_addr_name,
226 Integer *n1,
227 Integer *portin,
228 const _fcd fcd_mesg,
229 Integer *n3)
230 {
231 char *addr_name = _fcdtocp(fcd_addr_name);
232 char *port_name = _fcdtocp(fcd_port_name);
233 char *buffer = _fcdtocp(fcd_mesg);
234
235 #else
236 (addr_name,n1,portin,buffer,n3)
237 char addr_name[];
238 Integer *n1;
239 Integer *portin;
240 char buffer[];
241 Integer *n3;
242 {
243
244 #endif
245
246 #if defined(__MINGW32__)
247 perror("nwpw_listener: not coded for this architecture");
248 exit(1);
249 #else
250 int sock = 0, valread;
251 struct sockaddr_in serv_addr;
252 int port = ((int) *portin);
253 int nbuf = ((int) *n3);
254
255 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
256 {
257 printf("\nnwpw_listener: Socket creation error \n");
258 exit(1);
259 }
260 serv_addr.sin_family = AF_INET;
261 serv_addr.sin_port = htons(port);
262
263 // Convert IPv4 and IPv6 addresses from text to binary form
264 if(inet_pton(AF_INET, addr_name, &serv_addr.sin_addr)<=0)
265 {
266 printf("\nnwpw_listener:Invalid address/ Address not supported \n");
267 exit(1);
268 }
269 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
270 {
271 printf("\nnwpw_listener:Connection Failed \n");
272 exit(1);
273 }
274 valread = read(sock,buffer,nbuf);
275
276 printf("nwpw_listener: received %d bytes to %s:%d\n", nbuf, addr_name,port);
277 printf("nwpw_listener: message received: %s\n\n",buffer);
278 close(sock);
279 #endif
280
281 }
282
283
284
285