tpi_connect.c 2.2 KB

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