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