FACT++  1.0
dna.c
Go to the documentation of this file.
1 
2 /*
3  * DNA (Delphi Network Access) implements the network layer for the DIM
4  * (Delphi Information Managment) System.
5  *
6  * Started date : 10-11-91
7  * Written by : C. Gaspar
8  * UNIX adjustment: G.C. Ballintijn
9  *
10  */
11 
12 /* include files */
13 
14 #include <errno.h>
15 #define DIMLIB
16 #define DNA
17 #include <dim.h>
18 
19 /* global definitions */
20 
21 #define READ_HEADER_SIZE 12
22 
23 /*
24 #define TO_DBG 1
25 */
26 
27 /* global variables */
28 typedef struct {
29  char node_name[MAX_NODE_NAME];
30  char task_name[MAX_TASK_NAME];
31  int port;
33  time_t last_used;
34 } PENDING_OPEN;
35 
36 #define TMOUT_PENDING_CONN_TMOUT 3600
37 #define MAX_TMOUT_PENDING_CONNS 10
40 
41 static int DNA_Initialized = FALSE;
42 
43 extern int Tcpip_max_io_data_write;
44 extern int Tcpip_max_io_data_read;
45 
46 _DIM_PROTO( static void ast_read_h, (int conn_id, int status, int size) );
47 _DIM_PROTO( static void ast_conn_h, (int handle, int svr_conn_id,
48  int protocol) );
49 _DIM_PROTO( static int dna_write_bytes, (int conn_id, void *buffer, int size,
50  int nowait) );
51 _DIM_PROTO( static void release_conn, (int conn_id) );
52 _DIM_PROTO( static void save_node_task, (int conn_id, DNA_NET *buffer) );
53 
54 /*
55  * Routines common to Server and Client
56  */
57 /*
58 static int Prev_packet[3];
59 static int Prev_buffer[3];
60 static int Prev_conn_id = 0;
61 */
62 static int is_header( int conn_id )
63 {
64  register DNA_CONNECTION *dna_connp = &Dna_conns[conn_id];
65  register int ret;
66 
67  ret = 0;
68  if( (vtohl(dna_connp->buffer[2]) == TRP_MAGIC) &&
69  (vtohl(dna_connp->buffer[1]) == 0) &&
70  (vtohl(dna_connp->buffer[0]) == READ_HEADER_SIZE) )
71  {
72  dna_connp->state = RD_HDR;
73  ret = 1;
74  }
75  else if( (vtohl(dna_connp->buffer[2]) == TST_MAGIC) &&
76  (vtohl(dna_connp->buffer[1]) == 0) &&
77  (vtohl(dna_connp->buffer[0]) == READ_HEADER_SIZE) )
78  {
79  dna_connp->state = RD_HDR;
80  ret = 1;
81  }
82  else if( (vtohl(dna_connp->buffer[2]) == (int)HDR_MAGIC ) &&
83  (vtohl(dna_connp->buffer[0]) == (int)READ_HEADER_SIZE ) )
84  {
85  dna_connp->state = RD_DATA;
86  ret = 1;
87  }
88  else
89  {
90 /*
91  dim_print_date_time();
92  printf( " conn: %d to %s@%s, expecting header\n", conn_id,
93  Net_conns[conn_id].task, Net_conns[conn_id].node );
94  printf( "buffer[0]=%d\n", vtohl(dna_connp->buffer[0]));
95  printf( "buffer[1]=%d\n", vtohl(dna_connp->buffer[1]));
96  printf( "buffer[2]=%x\n", vtohl(dna_connp->buffer[2]));
97  printf( "closing the connection.\n" );
98  printf( " Previous conn: %d, Previous Packet\n", Prev_conn_id);
99  printf( "buffer[0]=%d\n", vtohl(Prev_packet[0]));
100  printf( "buffer[1]=%d\n", vtohl(Prev_packet[1]));
101  printf( "buffer[2]=%x\n", vtohl(Prev_packet[2]));
102  printf( " Previous Buffer\n");
103  printf( "buffer[0]=%d\n", vtohl(Prev_buffer[0]));
104  printf( "buffer[1]=%d\n", vtohl(Prev_buffer[1]));
105  printf( "buffer[2]=%x\n", vtohl(Prev_buffer[2]));
106  fflush(stdout);
107 */
108  dna_connp->read_ast(conn_id, NULL, 0, STA_DISC);
109  ret = 0;
110  }
111  return(ret);
112 }
113 
114 static void read_data( int conn_id)
115 {
116  register DNA_CONNECTION *dna_connp = &Dna_conns[conn_id];
117 
118  if( !dna_connp->saw_init &&
119  vtohl(dna_connp->buffer[0]) == (int)OPN_MAGIC)
120  {
121  save_node_task(conn_id, (DNA_NET *) dna_connp->buffer);
122  dna_connp->saw_init = TRUE;
123  }
124  else
125  {
126 /*
127 printf("passing up %d bytes, conn_id %d\n",dna_connp->full_size, conn_id);
128 */
129  dna_connp->read_ast(conn_id, dna_connp->buffer,
130  dna_connp->full_size, STA_DATA);
131  }
132 }
133 
134 static void ast_read_h( int conn_id, int status, int size )
135 {
136  register DNA_CONNECTION *dna_connp = &Dna_conns[conn_id];
137  int tcpip_code;
138  register int read_size, next_size;
139  register char *buff;
140  int max_io_data;
141 
142  if(!dna_connp->buffer) /* The connection has already been closed */
143  {
144  return;
145  }
146  if(status == 1)
147  {
148  next_size = dna_connp->curr_size;
149  buff = (char *) dna_connp->curr_buffer;
150  if(size < next_size)
151  {
152 /*
153  Prev_conn_id = conn_id;
154  Prev_packet[0] = ((int *)dna_connp->curr_buffer)[0];
155  Prev_packet[1] = ((int *)dna_connp->curr_buffer)[1];
156  Prev_packet[2] = ((int *)dna_connp->curr_buffer)[2];
157  Prev_buffer[0] = dna_connp->buffer[0];
158  Prev_buffer[1] = dna_connp->buffer[1];
159  Prev_buffer[2] = dna_connp->buffer[2];
160 */
161  max_io_data = Tcpip_max_io_data_read;
162  read_size = ((next_size - size) > max_io_data) ?
163  max_io_data : next_size - size;
164  dna_connp->curr_size -= size;
165  dna_connp->curr_buffer += size;
166  tcpip_code = tcpip_start_read(conn_id, buff + size,
167  read_size, ast_read_h);
168  if(tcpip_failure(tcpip_code))
169  {
170 #ifndef WIN32
171  if(errno == ENOTSOCK)
172  {
173  if(dna_connp->read_ast)
174  dna_connp->read_ast(conn_id, NULL, 0, STA_DISC);
175  }
176  else
177 #endif
178  {
179  dna_report_error(conn_id, tcpip_code,
180  "Reading from", DIM_ERROR, DIMTCPRDERR);
181  }
182  }
183  return;
184  }
185  switch(dna_connp->state)
186  {
187  case RD_HDR :
188  if(is_header(conn_id))
189  {
190  if( dna_connp->state == RD_DATA )
191  {
192  next_size = vtohl(dna_connp->buffer[1]);
193  dna_start_read(conn_id, next_size);
194  }
195  else
196  {
197  dna_connp->state = RD_HDR;
199  }
200  }
201  break;
202  case RD_DATA :
203  read_data(conn_id);
204  dna_connp->state = RD_HDR;
206  break;
207  default:
208  break;
209  }
210 /*
211  if(dna_connp->buffer)
212  {
213  Prev_conn_id = conn_id;
214  Prev_packet[0] = ((int *)dna_connp->curr_buffer)[0];
215  Prev_packet[1] = ((int *)dna_connp->curr_buffer)[1];
216  Prev_packet[2] = ((int *)dna_connp->curr_buffer)[2];
217  Prev_buffer[0] = dna_connp->buffer[0];
218  Prev_buffer[1] = dna_connp->buffer[1];
219  Prev_buffer[2] = dna_connp->buffer[2];
220  }
221 */
222  }
223  else
224  {
225  /*
226  printf("Connection lost. Signal upper layer\n");
227  */
228  if(dna_connp->read_ast)
229  dna_connp->read_ast(conn_id, NULL, 0, STA_DISC);
230  }
231 }
232 
233 
234 int dna_start_read(int conn_id, int size)
235 {
236  register DNA_CONNECTION *dna_connp = &Dna_conns[conn_id];
237  register int tcpip_code, read_size;
238  int max_io_data;
239 
240  if(!dna_connp->busy)
241  {
242  return(0);
243  }
244 
245  dna_connp->curr_size = size;
246  dna_connp->full_size = size;
247  if(size > dna_connp->buffer_size)
248  {
249  dna_connp->buffer =
250  (int *) realloc(dna_connp->buffer, (size_t)size);
251  dna_connp->buffer_size = size;
252  }
253  dna_connp->curr_buffer = (char *) dna_connp->buffer;
254  max_io_data = Tcpip_max_io_data_read;
255  read_size = (size > max_io_data) ? max_io_data : size ;
256 
257  tcpip_code = tcpip_start_read(conn_id, dna_connp->curr_buffer,
258  read_size, ast_read_h);
259  if(tcpip_failure(tcpip_code)) {
260  dna_report_error(conn_id, tcpip_code,
261  "Reading from", DIM_ERROR, DIMTCPRDERR);
262 
263  return(0);
264  }
265 
266  return(1);
267 }
268 
269 
270 static int dna_write_bytes( int conn_id, void *buffer, int size, int nowait )
271 {
272  register int size_left, wrote;
273  register char *p;
274  int max_io_data;
275 #ifdef VMS
276  int retries = WRITE_RETRIES, retrying = 0;
277  float wait_time = 0.01;
278 #endif
279  extern int tcpip_write_nowait(int, char *, int);
280 
281  max_io_data = Tcpip_max_io_data_write;
282  p = (char *) buffer;
283  size_left = size;
284  do {
285  size = (size_left > max_io_data) ? max_io_data : size_left ;
286 #ifdef VMS
287  if(nowait)
288  {
289  while(--retries)
290  {
291  if((wrote = tcpip_write_nowait(conn_id, p, size)) > 0)
292  break;
293  if(!tcpip_would_block(wrote))
294  return(0);
295  if(retries == WRITE_RETRIES_WNG)
296  {
297  dna_report_error(conn_id, tcpip_code,
298  "Writing to (retrying)", DIM_WARNING, DIMTCPWRRTY);
299  retrying = 1;
300  }
301  lib$wait(&wait_time);
302  }
303  if(!retries)
304  {
305  return(0);
306  }
307  }
308  else
309  wrote = tcpip_write(conn_id, p, size);
310 #else
311  if(nowait)
312  {
313  wrote = tcpip_write_nowait(conn_id, p, size);
314  if(wrote == -1)
315  {
316  dna_report_error(conn_id, -1,
317  "Write timeout, writing to", DIM_WARNING, DIMTCPWRTMO);
318  wrote = 0;
319  }
320  }
321  else
322  {
323  wrote = tcpip_write(conn_id, p, size);
324  }
325 #endif
326 
327  if( tcpip_failure(wrote) )
328  return(0);
329  p += wrote;
330  size_left -= wrote;
331  } while(size_left > 0);
332  return(1);
333 }
334 
335 void dna_test_write(int conn_id)
336 {
337  register DNA_CONNECTION *dna_connp = &Dna_conns[conn_id];
338  register int tcpip_code;
339  DNA_HEADER test_pkt;
340  register DNA_HEADER *test_p = &test_pkt;
341 
342  if(!dna_connp->busy)
343  {
344  return;
345  }
346  if(dna_connp->writing)
347  {
348  return;
349  }
350  test_p->header_size = htovl(READ_HEADER_SIZE);
351  test_p->data_size = 0;
352  test_p->header_magic = htovl(TST_MAGIC);
353  tcpip_code = dna_write_bytes(conn_id, &test_pkt, READ_HEADER_SIZE,0);
354  if(tcpip_failure(tcpip_code)) {
355  /* Connection lost. Signal upper layer ? */
356  if(dna_connp->read_ast)
357  dna_connp->read_ast(conn_id, NULL, 0, STA_DISC);
358  return;
359  }
360 }
361 
362 typedef struct
363 {
364  int conn_id;
365  void *buffer;
366  int size;
367  char dummy[MAX_NAME];
368 } WRITE_ITEM;
369 
370 static int do_dna_write(int id)
371 {
372  register DNA_CONNECTION *dna_connp;
373  int tcpip_code;
374  WRITE_ITEM *ptr;
375  int conn_id, size;
376  void *buffer;
377 
378  ptr = (WRITE_ITEM *)id_get_ptr(id, SRC_DNA);
379  if(!ptr)
380  return(2);
381  conn_id = ptr->conn_id;
382  buffer = ptr->buffer;
383  size = ptr->size;
384 
385  dna_connp = &Dna_conns[conn_id];
386  if(!dna_connp->busy)
387  {
388  id_free(id, SRC_DNA);
389  free(buffer);
390  free(ptr);
391  return(2);
392  }
393  dna_connp->writing = TRUE;
394  tcpip_code = dna_write_bytes(conn_id, buffer, size,0);
395  if(tcpip_failure(tcpip_code))
396  {
397  dna_connp->writing = FALSE;
398  id_free(id, SRC_DNA);
399  free(buffer);
400  free(ptr);
401  return(0);
402  }
403 
404  id_free(id, SRC_DNA);
405  free(buffer);
406  free(ptr);
407 
408  dna_connp->writing = FALSE;
409  return(1);
410 }
411 
412 int dna_write_nowait(int conn_id, void *buffer, int size)
413 {
414  register DNA_CONNECTION *dna_connp;
415  DNA_HEADER header_pkt;
416  register DNA_HEADER *header_p = &header_pkt;
417  int tcpip_code, ret = 1;
418 
419  DISABLE_AST
420  dna_connp = &Dna_conns[conn_id];
421  if(!dna_connp->busy)
422  {
423  ENABLE_AST
424  return(2);
425  }
426  dna_connp->writing = TRUE;
427 
428  header_p->header_size = htovl(READ_HEADER_SIZE);
429  header_p->data_size = htovl(size);
430  header_p->header_magic = (int)htovl(HDR_MAGIC);
431  tcpip_code = dna_write_bytes(conn_id, &header_pkt, READ_HEADER_SIZE, 1);
432  if(tcpip_failure(tcpip_code))
433  {
434  dna_connp->writing = FALSE;
435  ENABLE_AST
436  return(0);
437  }
438  tcpip_code = dna_write_bytes(conn_id, buffer, size, 1);
439  if(tcpip_failure(tcpip_code))
440  {
441  ret = 0;
442  }
443  dna_connp->writing = FALSE;
444  ENABLE_AST
445  return(ret);
446 }
447 
448 typedef struct
449 {
451  char data[1];
452 
453 }WRITE_DATA;
454 
455 int dna_write(int conn_id, void *buffer, int size)
456 {
457  WRITE_ITEM *newp;
458  int id;
459  WRITE_DATA *pktp;
460  DNA_HEADER *headerp;
461 
462  DISABLE_AST
463 
464  pktp = malloc((size_t)(READ_HEADER_SIZE+size));
465  headerp = &(pktp->header);
466  headerp->header_size = htovl(READ_HEADER_SIZE);
467  headerp->data_size = htovl(size);
468  headerp->header_magic = (int)htovl(HDR_MAGIC);
469 
470  memcpy(pktp->data, (char *)buffer, (size_t)size);
471 
472  newp = malloc(sizeof(WRITE_ITEM));
473  newp->conn_id = conn_id;
474  newp->buffer = pktp;
475  newp->size = size+READ_HEADER_SIZE;
476  id = id_get((void *)newp, SRC_DNA);
478  ENABLE_AST
479  return(1);
480 }
481 
482 /* Server Routines */
483 
484 static void ast_conn_h(int handle, int svr_conn_id, int protocol)
485 {
486  register DNA_CONNECTION *dna_connp;
487  register int tcpip_code;
488  register int conn_id;
489 
490  if(protocol){}
491  conn_id = conn_get();
492 /*
493  if(!conn_id)
494  dim_panic("In ast_conn_h: No more connections\n");
495 */
496  dna_connp = &Dna_conns[conn_id] ;
497  dna_connp->error_ast = Dna_conns[svr_conn_id].error_ast;
498  tcpip_code = tcpip_open_connection( conn_id, handle );
499 
500  if(tcpip_failure(tcpip_code))
501  {
502  dna_report_error(conn_id, tcpip_code,
503  "Connecting to", DIM_ERROR, DIMTCPCNERR);
504  conn_free(conn_id);
505  } else {
506  dna_connp->state = RD_HDR;
507  dna_connp->buffer = (int *)malloc((size_t)TCP_RCV_BUF_SIZE);
508 /*
509  if(!dna_connp->buffer)
510  {
511  printf("Error in DNA - handle_connection malloc returned 0\n");
512  fflush(stdout);
513  }
514 */
515  dna_connp->buffer_size = TCP_RCV_BUF_SIZE;
516  dna_connp->read_ast = Dna_conns[svr_conn_id].read_ast;
517  dna_connp->saw_init = FALSE;
518  dna_start_read(conn_id, READ_HEADER_SIZE); /* sizeof(DNA_NET) */
519  /* Connection arrived. Signal upper layer ? */
520  dna_connp->read_ast(conn_id, NULL, 0, STA_CONN);
521  }
522  tcpip_code = tcpip_start_listen(svr_conn_id, ast_conn_h);
523  if(tcpip_failure(tcpip_code))
524  {
525  dna_report_error(svr_conn_id, tcpip_code,
526  "Listening at", DIM_ERROR, DIMTCPLNERR);
527  }
528 }
529 
530 int dna_init()
531 {
532  PENDING_OPEN *pending_connp;
533  int i, size;
534 
535  if(!DNA_Initialized)
536  {
538  pending_connp = &Pending_conns[1];
539  size = MAX_CONNS;
540  for( i = 1; i < size; i++, pending_connp++ )
541  pending_connp->task_name[0] = '\0';
542  pending_connp = &Pending_conns_tmout[1];
544  for( i = 1; i < size; i++, pending_connp++ )
545  pending_connp->task_name[0] = '\0';
547  }
548  return(1);
549 }
550 
551 int dna_open_server(char *task, void (*read_ast)(), int *protocol, int *port, void (*error_ast)())
552 {
553  register DNA_CONNECTION *dna_connp;
554  register int tcpip_code;
555  register int conn_id;
556 
557  dna_init();
558 /*
559  if(!DNA_Initialized)
560  {
561  conn_arr_create(SRC_DNA);
562  DNA_Initialized = TRUE;
563  }
564 */
565  *protocol = PROTOCOL;
566  conn_id = conn_get();
567  dna_connp = &Dna_conns[conn_id];
568 /*
569  if(!conn_id)
570  dim_panic("In dna_open_server: No more connections\n");
571 */
572  dna_connp->protocol = TCPIP;
573  dna_connp->error_ast = error_ast;
574  tcpip_code = tcpip_open_server(conn_id, task, port);
575  if(tcpip_failure(tcpip_code))
576  {
577  dna_report_error(conn_id, tcpip_code,
578  "Opening server port", DIM_ERROR, DIMTCPOPERR);
579  conn_free(conn_id);
580  return(0);
581  }
582  dna_connp->writing = FALSE;
583  dna_connp->read_ast = read_ast;
584  tcpip_code = tcpip_start_listen(conn_id, ast_conn_h);
585  if(tcpip_failure(tcpip_code))
586  {
587  dna_report_error(conn_id, tcpip_code, "Listening at", DIM_ERROR, DIMTCPLNERR);
588  return(0);
589  }
590  return(conn_id);
591 }
592 
593 
594 int dna_get_node_task(int conn_id, char *node, char *task)
595 {
596  if(Dna_conns[conn_id].busy)
597  tcpip_get_node_task(conn_id, node, task);
598  else
599  node[0] = '\0';
600  return(1);
601 }
602 
603 
604 /* Client Routines */
605 
606 void dna_set_test_write(int conn_id, int time)
607 {
608  extern void tcpip_set_test_write(int, int);
609 
610  tcpip_set_test_write(conn_id, time);
611 }
612 
613 void dna_rem_test_write(int conn_id)
614 {
615  extern void tcpip_rem_test_write(int);
616 
617  tcpip_rem_test_write(conn_id);
618 }
619 
620 static int ins_pend_conn( char *node, char *task, int port, SRC_TYPES src_type, int type, time_t last_used )
621 {
622  register PENDING_OPEN *pending_connp;
623  register int i, size;
624  time_t oldest;
625  int oldesti = 0;
626  extern time_t time();
627 
628  if(type == 0)
629  {
630  pending_connp = &Pending_conns[1];
631  size = MAX_CONNS;
632  oldest = 0;
633  }
634  else
635  {
636  pending_connp = &Pending_conns_tmout[1];
638  oldest = time(NULL);
639  oldesti = 1;
640  }
641 
642  for( i = 1; i < size; i++, pending_connp++ )
643  {
644  if( pending_connp->task_name[0] == '\0' )
645  {
646  strcpy(pending_connp->node_name, node);
647  strcpy(pending_connp->task_name, task);
648  pending_connp->port = port;
649  pending_connp->src_type = src_type;
650  pending_connp->last_used = last_used;
651  return(i);
652  }
653  else
654  {
655  if(pending_connp->last_used < oldest)
656  {
657  oldest = pending_connp->last_used;
658  oldesti = i;
659  }
660  }
661  }
662  if(type != 0)
663  {
664  pending_connp = &Pending_conns_tmout[oldesti];
665  strcpy(pending_connp->node_name, node);
666  strcpy(pending_connp->task_name, task);
667  pending_connp->port = port;
668  pending_connp->src_type = src_type;
669  pending_connp->last_used = last_used;
670  return(oldesti);
671  }
672  return(0);
673 }
674 
675 static int find_pend_conn( char *node, char *task, int port, SRC_TYPES src_type, int type )
676 {
677  register PENDING_OPEN *pending_connp;
678  register int i, size;
679  time_t curr_time;
680 
681  if(type == 0)
682  {
683  pending_connp = &Pending_conns[1];
684  size = MAX_CONNS;
685  }
686  else
687  {
688  pending_connp = &Pending_conns_tmout[1];
690  curr_time = time(NULL);
691  for( i = 1; i < size; i++, pending_connp++ )
692  {
693  if( pending_connp->task_name[0] != '\0' )
694  {
695  if( curr_time - pending_connp->last_used > TMOUT_PENDING_CONN_TMOUT )
696  {
697  pending_connp->task_name[0] = '\0';
698  }
699  }
700  }
701  pending_connp = &Pending_conns_tmout[1];
702  }
703  for( i = 1; i < size; i++, pending_connp++ )
704  {
705  if( (!strcmp(pending_connp->node_name, node)) &&
706  (!strcmp(pending_connp->task_name, task)) &&
707  (pending_connp->port == port) &&
708  (pending_connp->src_type == src_type))
709  {
710  return(i);
711  }
712  }
713  return(0);
714 }
715 
716 
717 static void rel_pend_conn( int id, int type )
718 {
719  register PENDING_OPEN *pending_connp;
720 
721  if(type == 0)
722  {
723  pending_connp = &Pending_conns[id];
724  }
725  else
726  {
727  pending_connp = &Pending_conns_tmout[id];
728  }
729  pending_connp->task_name[0] = '\0';
730 }
731 
732 
733 int dna_open_client(char *server_node, char *server_task, int port, int server_protocol,
734  void (*read_ast)(), void (*error_ast)(), SRC_TYPES src_type)
735 {
736  register DNA_CONNECTION *dna_connp;
737  char str[256];
738  register int tcpip_code, conn_id, id;
739  DNA_NET local_buffer;
740  extern int get_proc_name(char *);
741  char src_type_str[64];
742 
743  if(server_protocol){}
744  dna_init();
745 /*
746  if(!DNA_Initialized) {
747  conn_arr_create(SRC_DNA);
748  DNA_Initialized = TRUE;
749  }
750 */
751  conn_id = conn_get();
752  dna_connp = &Dna_conns[conn_id] ;
753 /*
754  if( !(conn_id = conn_get()) )
755  dim_panic("In dna_open_client: No more connections\n");
756 */
757  dna_connp->protocol = TCPIP;
758  dna_connp->error_ast = error_ast;
759  tcpip_code = tcpip_open_client(conn_id, server_node, server_task, port);
760  if( tcpip_failure(tcpip_code) )
761  {
762 #ifdef VMS
763  if(!strstr(server_node,"fidel"))
764  {
765 #endif
766  if(!find_pend_conn(server_node, server_task, port, src_type, 0))
767  {
768  if(src_type == SRC_DIS)
769  strcpy(src_type_str,"Server");
770  else if(src_type == SRC_DIC)
771  strcpy(src_type_str,"Client");
772  else
773  strcpy(src_type_str,"Unknown type");
774  sprintf( str,"%s Connecting to %s on %s",
775  src_type_str, server_task, server_node );
776  if(!strcmp(server_task,"DIM_DNS"))
777  dna_report_error( conn_id, tcpip_code, str, DIM_ERROR, DIMDNSCNERR );
778  else
779  dna_report_error( conn_id, tcpip_code, str, DIM_ERROR, DIMTCPCNERR );
780  ins_pend_conn(server_node, server_task, port, src_type, 0, 0);
781  }
782 #ifdef VMS
783  }
784 #endif
785  tcpip_close(conn_id);
786  conn_free( conn_id );
787  return(0);
788  }
789  if( (id = find_pend_conn(server_node, server_task, port, src_type, 0)) )
790  {
791  if(src_type == SRC_DIS)
792  strcpy(src_type_str,"Server");
793  else if(src_type == SRC_DIC)
794  strcpy(src_type_str,"Client");
795  else
796  strcpy(src_type_str,"Unknown type");
797  sprintf( str,"%s Connection established to", src_type_str);
798  if(!strcmp(server_task,"DIM_DNS"))
799  dna_report_error( conn_id, -1, str, DIM_INFO, DIMDNSCNEST );
800  else
801  dna_report_error( conn_id, -1, str, DIM_INFO, DIMTCPCNEST );
802  rel_pend_conn(id, 0);
803  }
804  dna_connp->state = RD_HDR;
805  dna_connp->writing = FALSE;
806  dna_connp->buffer = (int *)malloc((size_t)TCP_RCV_BUF_SIZE);
807 /*
808  if(!dna_connp->buffer)
809  {
810  printf("Error in DNA - open_client malloc returned 0\n");
811  fflush(stdout);
812  }
813 */
814  dna_connp->buffer_size = TCP_RCV_BUF_SIZE;
815  dna_connp->read_ast = read_ast;
816  dna_connp->saw_init = TRUE; /* we send it! */
818  local_buffer.code = (int)htovl(OPN_MAGIC);
819  get_node_name(local_buffer.node);
820  get_proc_name(local_buffer.task);
821  tcpip_code = dna_write_nowait(conn_id, &local_buffer, sizeof(local_buffer));
822  if (tcpip_failure(tcpip_code))
823  {
825  printf(" Client Establishing Connection: Couldn't write to Conn %3d : Server %s@%s\n",conn_id,
826  Net_conns[conn_id].task, Net_conns[conn_id].node);
827  fflush(stdout);
828  dna_close(conn_id);
829  return(0);
830  }
831  read_ast(conn_id, NULL, 0, STA_CONN);
832  return(conn_id);
833 }
834 
835 int dna_close(int conn_id)
836 {
837  if(conn_id > 0)
838  {
839  if(Net_conns[conn_id].write_timedout)
840  {
841  dna_report_error(conn_id, -1,
842  "Write timeout, disconnecting from", DIM_ERROR, DIMTCPWRTMO);
843  if(!find_pend_conn(Net_conns[conn_id].node, Net_conns[conn_id].task, 0, 0, 1))
844  ins_pend_conn(Net_conns[conn_id].node, Net_conns[conn_id].task, 0, 0, 1, time(NULL));
845  }
846  release_conn(conn_id);
847  }
848  return(1);
849 }
850 
851 /* connection managment routines */
852 
853 static void release_conn(int conn_id)
854 {
855  register DNA_CONNECTION *dna_connp = &Dna_conns[conn_id] ;
856 
857  DISABLE_AST
858  if(dna_connp->busy)
859  {
860  tcpip_close(conn_id);
861  if(dna_connp->buffer)
862  {
863  free(dna_connp->buffer);
864  dna_connp->buffer = 0;
865  dna_connp->buffer_size = 0;
866  }
867  dna_connp->read_ast = NULL;
868  dna_connp->error_ast = NULL;
869  conn_free(conn_id);
870  }
871  ENABLE_AST
872 }
873 
874 
875 void dna_report_error_old(int conn_id, int code, char *routine_name)
876 {
877  char str[128];
878  extern void tcpip_get_error(char *, int);
880  printf("%s", routine_name);
881  if(conn_id)
882  {
883  if(Net_conns[conn_id].node[0])
884  printf(" %s on node %s",
885  Net_conns[conn_id].task, Net_conns[conn_id].node);
886 /*
887  else
888  printf("\tConn %d :\n", conn_id);
889 */
890  }
891  if(code != -1)
892  {
893 /*
894  printf("\t");
895  tcpip_report_error(code);
896 */
897  tcpip_get_error(str, code);
898  printf(": %s\n",str);
899  }
900  fflush(stdout);
901 }
902 
903 void dna_report_error(int conn_id, int code, char *routine_name, int severity, int errcode)
904 {
905  char str[128], msg[1024];
906  extern void tcpip_get_error();
907 
908  sprintf(msg, "%s", routine_name);
909  if(conn_id)
910  {
911  if(Net_conns[conn_id].node[0])
912  {
913  sprintf(str," %s@%s",
914  Net_conns[conn_id].task, Net_conns[conn_id].node);
915  strcat(msg, str);
916  }
917  }
918  if(code != -1)
919  {
920  tcpip_get_error(str, code);
921  strcat(msg,": ");
922  strcat(msg, str);
923  }
924  if(Dna_conns[conn_id].error_ast)
925  {
926  Dna_conns[conn_id].error_ast(conn_id, severity, errcode, msg);
927  }
928 }
929 
930 static void save_node_task(int conn_id, DNA_NET *buffer)
931 {
932  int id;
933  strcpy(Net_conns[conn_id].node, buffer->node);
934  strcpy(Net_conns[conn_id].task, buffer->task);
935  if((id = find_pend_conn(Net_conns[conn_id].node, Net_conns[conn_id].task, 0, 0, 1)))
936  {
937  dna_report_error( conn_id, -1, "Re-connected to", DIM_INFO, DIMDNSCNEST );
938  rel_pend_conn(id, 1);
939  }
940 }
#define STA_DATA
Definition: dim.h:198
static void rel_pend_conn(int id, int type)
Definition: dna.c:717
void dna_report_error_old(int conn_id, int code, char *routine_name)
Definition: dna.c:875
int conn_id
Definition: dna.c:364
static void ast_read_h(int conn_id, int status, int size)
Definition: dna.c:134
#define MAX_NAME
Definition: dim.h:182
Definition: dns.c:26
#define HDR_MAGIC
Definition: dim.h:209
#define TMOUT_PENDING_CONN_TMOUT
Definition: dna.c:36
int tcpip_start_listen(int conn_id, void(*ast_routine)())
Definition: tcpip.c:1308
void dna_test_write(int conn_id)
Definition: dna.c:335
static int dna_write_bytes(int conn_id, void *buffer, int size, int nowait)
Definition: dna.c:270
#define DIMDNSCNERR
Definition: dim_common.h:301
#define DIMTCPWRRTY
Definition: dim_common.h:294
int Tcpip_max_io_data_read
Definition: tcpip.c:111
int dna_write(int conn_id, void *buffer, int size)
Definition: dna.c:455
_DIM_PROTO(static void ast_read_h,(int conn_id, int status, int size))
static int DNA_Initialized
Definition: dna.c:41
int protocol
Definition: dim.h:389
#define READ_HEADER_SIZE
Definition: dna.c:21
char node_name[MAX_NODE_NAME]
Definition: dna.c:29
time_t last_used
Definition: dna.c:33
int header_magic
Definition: dim.h:357
#define STA_DISC
Definition: dim.h:197
int dna_open_client(char *server_node, char *server_task, int port, int server_protocol, void(*read_ast)(), void(*error_ast)(), SRC_TYPES src_type)
Definition: dna.c:733
int i
Definition: db_dim_client.c:21
DllExp DIM_NOSHARE NET_CONNECTION * Net_conns
Definition: conn_handler.c:32
#define TCPIP
Definition: dim.h:194
#define TRUE
Definition: dim.h:135
char str[80]
Definition: test_client.c:7
#define DIMTCPCNEST
Definition: dim_common.h:299
void * id_get_ptr(int id, SRC_TYPES type)
Definition: conn_handler.c:184
#define OPN_MAGIC
Definition: dim.h:208
int busy
Definition: dim.h:381
SRC_TYPES src_type
Definition: dna.c:32
int header_size
Definition: dim.h:355
void tcpip_get_error(char *str, int code)
Definition: tcpip.c:1842
#define FALSE
Definition: dim.h:136
int dna_close(int conn_id)
Definition: dna.c:835
void conn_free(int conn_id)
Definition: conn_handler.c:118
void * malloc()
Definition: EventBuilder.cc:99
void dna_rem_test_write(int conn_id)
Definition: dna.c:613
SRC_TYPES
Definition: dim_common.h:19
char id[4]
Definition: FITS.h:71
#define DIMTCPRDERR
Definition: dim_common.h:293
Definition: dim.h:190
void dna_set_test_write(int conn_id, int time)
Definition: dna.c:606
int size
Definition: dna.c:366
#define MAX_CONNS
Definition: dim.h:163
static PENDING_OPEN Pending_conns[MAX_CONNS]
Definition: dna.c:38
#define TCP_RCV_BUF_SIZE
Definition: dim.h:165
void(* error_ast)()
Definition: dim.h:383
#define DIMTCPWRTMO
Definition: dim_common.h:295
static void read_data(int conn_id)
Definition: dna.c:114
static int do_dna_write(int id)
Definition: dna.c:370
#define TST_MAGIC
Definition: dim.h:211
CONN_STATE state
Definition: dim.h:390
#define DIMTCPCNERR
Definition: dim_common.h:298
void conn_arr_create(SRC_TYPES type)
Definition: conn_handler.c:49
int tcpip_would_block(int code)
Definition: tcpip.c:1545
static void ast_conn_h(int handle, int svr_conn_id, int protocol)
Definition: dna.c:484
Definition: dim.h:223
int tcpip_write_nowait(int conn_id, char *buffer, int size)
Definition: tcpip.c:1435
int curr_size
Definition: dim.h:387
void dtq_start_timer(int time, void(*user_routine)(), dim_long tag)
Definition: dtq.c:790
int writing
Definition: dim.h:391
void tcpip_rem_test_write(int conn_id)
Definition: tcpip.c:667
int type
#define MAX_TASK_NAME
Definition: dim.h:181
int tcpip_start_read(int conn_id, char *buffer, int size, void(*ast_routine)())
Definition: tcpip.c:949
int port
Definition: dna.c:31
#define DIMDNSCNEST
Definition: dim_common.h:302
int tcpip_close(int conn_id)
Definition: tcpip.c:1510
int dna_get_node_task(int conn_id, char *node, char *task)
Definition: dna.c:594
Warning because the service this data corrsponds to might have been last updated longer ago than Local time
Definition: smartfact.txt:92
void dna_report_error(int conn_id, int code, char *routine_name, int severity, int errcode)
Definition: dna.c:903
static void save_node_task(int conn_id, DNA_NET *buffer)
Definition: dna.c:930
#define MAX_TMOUT_PENDING_CONNS
Definition: dna.c:37
int dna_write_nowait(int conn_id, void *buffer, int size)
Definition: dna.c:412
int buffer[BUFFSIZE]
Definition: db_dim_client.c:14
int dna_open_server(char *task, void(*read_ast)(), int *protocol, int *port, void(*error_ast)())
Definition: dna.c:551
int size
Definition: db_dim_server.c:17
void id_free(int id, SRC_TYPES type)
Definition: conn_handler.c:206
static int is_header(int conn_id)
Definition: dna.c:62
int tcpip_write(int conn_id, char *buffer, int size)
Definition: tcpip.c:1389
float data[4 *1440]
int Tcpip_max_io_data_write
Definition: tcpip.c:110
int data_size
Definition: dim.h:356
void free(void *mem)
#define TRP_MAGIC
Definition: dim.h:212
static PENDING_OPEN Pending_conns_tmout[MAX_TMOUT_PENDING_CONNS]
Definition: dna.c:39
int saw_init
Definition: dim.h:392
DllExp DIM_NOSHARE DNA_CONNECTION * Dna_conns
Definition: conn_handler.c:31
DNA_HEADER header
Definition: dna.c:450
int tcpip_open_client(int conn_id, char *node, char *task, int port)
Definition: tcpip.c:1014
int dna_init()
Definition: dna.c:530
#define MAX_NODE_NAME
Definition: dim.h:180
int id_get(void *ptr, SRC_TYPES type)
Definition: conn_handler.c:152
void dim_print_date_time()
Definition: utilities.c:134
#define DIMTCPLNERR
Definition: dim_common.h:296
void tcpip_get_node_task(int conn_id, char *node, char *task)
Definition: tcpip.c:1383
int buff[BUFFSIZE]
Definition: db_dim_client.c:15
int full_size
Definition: dim.h:388
static void release_conn(int conn_id)
Definition: dna.c:853
static int ins_pend_conn(char *node, char *task, int port, SRC_TYPES src_type, int type, time_t last_used)
Definition: dna.c:620
int * buffer
Definition: dim.h:384
int tcpip_open_server(int conn_id, char *task, int *port)
Definition: tcpip.c:1182
Definition: dim.h:190
int dna_start_read(int conn_id, int size)
Definition: dna.c:234
int get_proc_name(char *proc_name)
Definition: utilities.c:22
static int find_pend_conn(char *node, char *task, int port, SRC_TYPES src_type, int type)
Definition: dna.c:675
int buffer_size
Definition: dim.h:385
int get_node_name(char *node_name)
Definition: utilities.c:33
int code
Definition: dim.h:224
char task_name[MAX_TASK_NAME]
Definition: dna.c:30
char task[MAX_TASK_NAME]
Definition: dim.h:226
int tcpip_failure(int code)
Definition: tcpip.c:1540
void(* read_ast)()
Definition: dim.h:382
sprintf(name1,"NewService%d", i)
#define STA_CONN
Definition: dim.h:199
void tcpip_set_test_write(int conn_id, int timeout)
Definition: tcpip.c:651
int tcpip_open_connection(int conn_id, int path)
Definition: tcpip.c:1332
#define DIMTCPOPERR
Definition: dim_common.h:297
char * curr_buffer
Definition: dim.h:386
int conn_get()
Definition: conn_handler.c:79
char node[MAX_NODE_NAME]
Definition: dim.h:225
void * buffer
Definition: dna.c:365