tpi_connect.lc 4.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "tpi_daytime.h"## 1 ##src/streams/tpi_connect.c##
  2. void## 2 ##src/streams/tpi_connect.c##
  3. tpi_connect(int fd, const void *addr, size_t addrlen)## 3 ##src/streams/tpi_connect.c##
  4. {## 4 ##src/streams/tpi_connect.c##
  5. struct {## 5 ##src/streams/tpi_connect.c##
  6. struct T_conn_req msg_hdr;## 6 ##src/streams/tpi_connect.c##
  7. char addr[128];## 7 ##src/streams/tpi_connect.c##
  8. } conn_req;## 8 ##src/streams/tpi_connect.c##
  9. struct {## 9 ##src/streams/tpi_connect.c##
  10. struct T_conn_con msg_hdr;## 10 ##src/streams/tpi_connect.c##
  11. char addr[128];## 11 ##src/streams/tpi_connect.c##
  12. } conn_con;## 12 ##src/streams/tpi_connect.c##
  13. struct strbuf ctlbuf;## 13 ##src/streams/tpi_connect.c##
  14. union T_primitives rcvbuf;## 14 ##src/streams/tpi_connect.c##
  15. struct T_error_ack *error_ack;## 15 ##src/streams/tpi_connect.c##
  16. struct T_discon_ind *discon_ind;## 16 ##src/streams/tpi_connect.c##
  17. int flags;## 17 ##src/streams/tpi_connect.c##
  18. conn_req.msg_hdr.PRIM_type = T_CONN_REQ;## 18 ##src/streams/tpi_connect.c##
  19. conn_req.msg_hdr.DEST_length = addrlen;## 19 ##src/streams/tpi_connect.c##
  20. conn_req.msg_hdr.DEST_offset = sizeof(struct T_conn_req);## 20 ##src/streams/tpi_connect.c##
  21. conn_req.msg_hdr.OPT_length = 0;## 21 ##src/streams/tpi_connect.c##
  22. conn_req.msg_hdr.OPT_offset = 0;## 22 ##src/streams/tpi_connect.c##
  23. memcpy(conn_req.addr, addr, addrlen); /* sockaddr_in{} */## 23 ##src/streams/tpi_connect.c##
  24. ctlbuf.len = sizeof(struct T_conn_req) + addrlen;## 24 ##src/streams/tpi_connect.c##
  25. ctlbuf.buf = (char *) &conn_req;## 25 ##src/streams/tpi_connect.c##
  26. Putmsg(fd, &ctlbuf, NULL, 0);## 26 ##src/streams/tpi_connect.c##
  27. ctlbuf.maxlen = sizeof(union T_primitives);## 27 ##src/streams/tpi_connect.c##
  28. ctlbuf.len = 0;## 28 ##src/streams/tpi_connect.c##
  29. ctlbuf.buf = (char *) &rcvbuf;## 29 ##src/streams/tpi_connect.c##
  30. flags = RS_HIPRI;## 30 ##src/streams/tpi_connect.c##
  31. Getmsg(fd, &ctlbuf, NULL, &flags);## 31 ##src/streams/tpi_connect.c##
  32. if (ctlbuf.len < (int) sizeof(long))## 32 ##src/streams/tpi_connect.c##
  33. err_quit("tpi_connect: bad length from getmsg");## 33 ##src/streams/tpi_connect.c##
  34. switch (rcvbuf.type) {## 34 ##src/streams/tpi_connect.c##
  35. case T_OK_ACK:## 35 ##src/streams/tpi_connect.c##
  36. break;## 36 ##src/streams/tpi_connect.c##
  37. case T_ERROR_ACK:## 37 ##src/streams/tpi_connect.c##
  38. if (ctlbuf.len < (int) sizeof(struct T_error_ack))## 38 ##src/streams/tpi_connect.c##
  39. err_quit("tpi_connect: bad length for T_ERROR_ACK");## 39 ##src/streams/tpi_connect.c##
  40. error_ack = (struct T_error_ack *) &rcvbuf;## 40 ##src/streams/tpi_connect.c##
  41. err_quit("tpi_connect: T_ERROR_ACK from conn (%d, %d)",## 41 ##src/streams/tpi_connect.c##
  42. error_ack->TLI_error, error_ack->UNIX_error);## 42 ##src/streams/tpi_connect.c##
  43. default:## 43 ##src/streams/tpi_connect.c##
  44. err_quit("tpi_connect: unexpected message type: %d", rcvbuf.type);## 44 ##src/streams/tpi_connect.c##
  45. }## 45 ##src/streams/tpi_connect.c##
  46. ctlbuf.maxlen = sizeof(conn_con);## 46 ##src/streams/tpi_connect.c##
  47. ctlbuf.len = 0;## 47 ##src/streams/tpi_connect.c##
  48. ctlbuf.buf = (char *) &conn_con;## 48 ##src/streams/tpi_connect.c##
  49. flags = 0;## 49 ##src/streams/tpi_connect.c##
  50. Getmsg(fd, &ctlbuf, NULL, &flags);## 50 ##src/streams/tpi_connect.c##
  51. if (ctlbuf.len < (int) sizeof(long))## 51 ##src/streams/tpi_connect.c##
  52. err_quit("tpi_connect2: bad length from getmsg");## 52 ##src/streams/tpi_connect.c##
  53. switch (conn_con.msg_hdr.PRIM_type) {## 53 ##src/streams/tpi_connect.c##
  54. case T_CONN_CON:## 54 ##src/streams/tpi_connect.c##
  55. break;## 55 ##src/streams/tpi_connect.c##
  56. case T_DISCON_IND:## 56 ##src/streams/tpi_connect.c##
  57. if (ctlbuf.len < (int) sizeof(struct T_discon_ind))## 57 ##src/streams/tpi_connect.c##
  58. err_quit("tpi_connect2: bad length for T_DISCON_IND");## 58 ##src/streams/tpi_connect.c##
  59. discon_ind = (struct T_discon_ind *) &conn_con.msg_hdr;## 59 ##src/streams/tpi_connect.c##
  60. err_quit("tpi_connect2: T_DISCON_IND from conn (%d)",## 60 ##src/streams/tpi_connect.c##
  61. discon_ind->DISCON_reason);## 61 ##src/streams/tpi_connect.c##
  62. default:## 62 ##src/streams/tpi_connect.c##
  63. err_quit("tpi_connect2: unexpected message type: %d",## 63 ##src/streams/tpi_connect.c##
  64. conn_con.msg_hdr.PRIM_type);## 64 ##src/streams/tpi_connect.c##
  65. }## 65 ##src/streams/tpi_connect.c##
  66. }## 66 ##src/streams/tpi_connect.c##