tpi_bind.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include "tpi_daytime.h"
  2. void
  3. tpi_bind(int fd, const void *addr, size_t addrlen)
  4. {
  5. struct {
  6. struct T_bind_req msg_hdr;
  7. char addr[128];
  8. } bind_req;
  9. struct {
  10. struct T_bind_ack msg_hdr;
  11. char addr[128];
  12. } bind_ack;
  13. struct strbuf ctlbuf;
  14. struct T_error_ack *error_ack;
  15. int flags;
  16. bind_req.msg_hdr.PRIM_type = T_BIND_REQ;
  17. bind_req.msg_hdr.ADDR_length = addrlen;
  18. bind_req.msg_hdr.ADDR_offset = sizeof(struct T_bind_req);
  19. bind_req.msg_hdr.CONIND_number = 0;
  20. memcpy(bind_req.addr, addr, addrlen); /* sockaddr_in{} */
  21. ctlbuf.len = sizeof(struct T_bind_req) + addrlen;
  22. ctlbuf.buf = (char *) &bind_req;
  23. Putmsg(fd, &ctlbuf, NULL, 0);
  24. ctlbuf.maxlen = sizeof(bind_ack);
  25. ctlbuf.len = 0;
  26. ctlbuf.buf = (char *) &bind_ack;
  27. flags = RS_HIPRI;
  28. Getmsg(fd, &ctlbuf, NULL, &flags);
  29. /* *INDENT-OFF* */
  30. if (ctlbuf.len < (int) sizeof(long))
  31. err_quit("bad length from getmsg");
  32. /* *INDENT-ON* */
  33. switch(bind_ack.msg_hdr.PRIM_type) {
  34. case T_BIND_ACK:
  35. return;
  36. case T_ERROR_ACK:
  37. /* *INDENT-OFF* */
  38. if (ctlbuf.len < (int) sizeof(struct T_error_ack))
  39. err_quit("bad length for T_ERROR_ACK");
  40. error_ack = (struct T_error_ack *) &bind_ack.msg_hdr;
  41. err_quit("T_ERROR_ACK from bind (%d, %d)",
  42. error_ack->TLI_error, error_ack->UNIX_error);
  43. /* *INDENT-ON* */
  44. default:
  45. err_quit("unexpected message type: %d", bind_ack.msg_hdr.PRIM_type);
  46. }
  47. }