Advertisement
Socolin

[OpenBSD][tftpd] rdomain

Aug 6th, 2015
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 2.74 KB | None | 0 0
  1. Index: tftpd.8
  2. ===================================================================
  3. RCS file: /cvs/src/usr.sbin/tftpd/tftpd.8,v
  4. retrieving revision 1.4
  5. diff -u -p -r1.4 tftpd.8
  6. --- tftpd.8 4 Mar 2012 07:26:51 -0000   1.4
  7. +++ tftpd.8 6 Aug 2015 16:10:19 -0000
  8. @@ -41,6 +41,7 @@
  9.  .Op Fl l Ar address
  10.  .Op Fl p Ar port
  11.  .Op Fl r Ar socket
  12. +.Op Fl V Ar rtable
  13.  .Ar directory
  14.  .Sh DESCRIPTION
  15.  .Nm
  16. @@ -119,6 +120,8 @@ By default
  17.  does not use filename rewriting.
  18.  .It Fl v
  19.  Log the client IP, type of request, and filename.
  20. +.It Fl V Ar rtable
  21. +Set the routing table to be used for listening connections.
  22.  .It Ar directory
  23.  .Xr chroot 2
  24.  to
  25. Index: tftpd.c
  26. ===================================================================
  27. RCS file: /cvs/src/usr.sbin/tftpd/tftpd.c,v
  28. retrieving revision 1.26
  29. diff -u -p -r1.26 tftpd.c
  30. --- tftpd.c 16 Jan 2015 06:40:22 -0000  1.26
  31. +++ tftpd.c 6 Aug 2015 16:10:19 -0000
  32. @@ -260,13 +260,14 @@ __dead void
  33.  usage(void)
  34.  {
  35.     extern char *__progname;
  36. -   fprintf(stderr, "usage: %s [-46cdv] [-l address] [-p port] [-r socket]"
  37. +   fprintf(stderr, "usage: %s [-46cdv] [-l address] [-p port] [-r socket] [-V rtable]"
  38.         " directory\n", __progname);
  39.     exit(1);
  40.  }
  41.  
  42.  int          cancreate = 0;
  43.  int          verbose = 0;
  44. +int          rtableid = -1;
  45.  
  46.  int
  47.  main(int argc, char *argv[])
  48. @@ -283,8 +284,9 @@ main(int argc, char *argv[])
  49.     char *addr = NULL;
  50.     char *port = "tftp";
  51.     int family = AF_UNSPEC;
  52. +   const char *errstr;
  53.  
  54. -   while ((c = getopt(argc, argv, "46cdl:p:r:v")) != -1) {
  55. +   while ((c = getopt(argc, argv, "46cdl:p:r:vV:")) != -1) {
  56.         switch (c) {
  57.         case '4':
  58.             family = AF_INET;
  59. @@ -310,6 +312,13 @@ main(int argc, char *argv[])
  60.         case 'v':
  61.             verbose = 1;
  62.             break;
  63. +       case 'V':
  64. +           rtableid = (unsigned int)strtonum(optarg, 0,
  65. +               RT_TABLEID_MAX, &errstr);
  66. +           if (errstr)
  67. +               errx(1, "rtable value is %s: %s",
  68. +                   errstr, optarg);
  69. +           break;
  70.         default:
  71.             usage();
  72.             /* NOTREACHED */
  73. @@ -537,6 +546,15 @@ tftpd_listen(const char *addr, const cha
  74.             continue;
  75.         }
  76.  
  77. +       if (rtableid != -1) {
  78. +           if (setsockopt(s, SOL_SOCKET, SO_RTABLE, &rtableid,
  79. +               sizeof(rtableid)) == -1) {
  80. +               cause = "setsockopt SO_RTABLE";
  81. +               cerrno = errno;
  82. +               continue;
  83. +           }
  84. +       }
  85. +
  86.         if (bind(s, res->ai_addr, res->ai_addrlen) == -1) {
  87.             cause = "bind";
  88.             cerrno = errno;
  89. @@ -674,6 +692,15 @@ tftpd_recv(int fd, short events, void *a
  90.         lwarn("socket");
  91.         goto err;
  92.     }
  93. +
  94. +   if (rtableid != -1) {
  95. +       if (setsockopt(client->sock, SOL_SOCKET, SO_RTABLE, &rtableid,
  96. +           sizeof(rtableid)) == -1) {
  97. +           lwarn("setsockopt SO_RTABLE");
  98. +           goto err;
  99. +       }
  100. +   }
  101. +
  102.     memset(&s_in, 0, sizeof(s_in));
  103.     s_in.ss_family = client->ss.ss_family;
  104.     s_in.ss_len = client->ss.ss_len;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement