/usr.bin/talk/ctl.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 122 lines · 68 code · 18 blank · 36 comment · 13 complexity · 30ecd0ba8b49efae3323ab6b6aa343fb MD5 · raw file

  1. /*
  2. * Copyright (c) 1983, 1993
  3. * The Regents of the University of California. All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions
  7. * are met:
  8. * 1. Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * 2. Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in the
  12. * documentation and/or other materials provided with the distribution.
  13. * 4. Neither the name of the University nor the names of its contributors
  14. * may be used to endorse or promote products derived from this software
  15. * without specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  18. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  21. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  23. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  24. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  25. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  26. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  27. * SUCH DAMAGE.
  28. */
  29. #include <sys/cdefs.h>
  30. __FBSDID("$FreeBSD$");
  31. #ifndef lint
  32. static const char sccsid[] = "@(#)ctl.c 8.1 (Berkeley) 6/6/93";
  33. #endif
  34. /*
  35. * This file handles haggling with the various talk daemons to
  36. * get a socket to talk to. sockt is opened and connected in
  37. * the progress
  38. */
  39. #include <sys/types.h>
  40. #include <sys/socket.h>
  41. #include <string.h>
  42. #include "talk.h"
  43. #include "talk_ctl.h"
  44. struct sockaddr_in daemon_addr = { .sin_len = sizeof(daemon_addr), .sin_family = AF_INET };
  45. struct sockaddr_in ctl_addr = { .sin_len = sizeof(ctl_addr), .sin_family = AF_INET };
  46. struct sockaddr_in my_addr = { .sin_len = sizeof(my_addr), .sin_family = AF_INET };
  47. /* inet addresses of the two machines */
  48. struct in_addr my_machine_addr;
  49. struct in_addr his_machine_addr;
  50. u_short daemon_port; /* port number of the talk daemon */
  51. int ctl_sockt;
  52. int sockt;
  53. int invitation_waiting = 0;
  54. CTL_MSG msg;
  55. void
  56. open_sockt(void)
  57. {
  58. socklen_t length;
  59. (void)memset(&my_addr, 0, sizeof(my_addr));
  60. my_addr.sin_family = AF_INET;
  61. my_addr.sin_len = sizeof(my_addr);
  62. my_addr.sin_addr = my_machine_addr;
  63. my_addr.sin_port = 0;
  64. sockt = socket(AF_INET, SOCK_STREAM, 0);
  65. if (sockt == -1)
  66. p_error("Bad socket");
  67. if (bind(sockt, (struct sockaddr *)&my_addr, sizeof(my_addr)) != 0)
  68. p_error("Binding local socket");
  69. length = sizeof(my_addr);
  70. if (getsockname(sockt, (struct sockaddr *)&my_addr, &length) == -1)
  71. p_error("Bad address for socket");
  72. }
  73. /* open the ctl socket */
  74. void
  75. open_ctl(void)
  76. {
  77. socklen_t length;
  78. (void)memset(&ctl_addr, 0, sizeof(ctl_addr));
  79. ctl_addr.sin_family = AF_INET;
  80. ctl_addr.sin_len = sizeof(my_addr);
  81. ctl_addr.sin_port = 0;
  82. ctl_addr.sin_addr = my_machine_addr;
  83. ctl_sockt = socket(AF_INET, SOCK_DGRAM, 0);
  84. if (ctl_sockt == -1)
  85. p_error("Bad socket");
  86. if (bind(ctl_sockt,
  87. (struct sockaddr *)&ctl_addr, sizeof(ctl_addr)) != 0)
  88. p_error("Couldn't bind to control socket");
  89. length = sizeof(ctl_addr);
  90. if (getsockname(ctl_sockt,
  91. (struct sockaddr *)&ctl_addr, &length) == -1)
  92. p_error("Bad address for ctl socket");
  93. }
  94. /* print_addr is a debug print routine */
  95. void
  96. print_addr(struct sockaddr_in addr)
  97. {
  98. int i;
  99. printf("addr = %lx, port = %o, family = %o zero = ",
  100. (u_long)addr.sin_addr.s_addr, addr.sin_port, addr.sin_family);
  101. for (i = 0; i<8;i++)
  102. printf("%o ", (int)addr.sin_zero[i]);
  103. putchar('\n');
  104. }