portmapper.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include "all.h"
  2. typedef struct Portmap Portmap;
  3. struct Portmap
  4. {
  5. int prog;
  6. int vers;
  7. int protocol;
  8. int port;
  9. };
  10. Portmap map[] = {
  11. 100003, 2, IPPROTO_UDP, 2049, /* nfs */
  12. // 100003, 3, IPPROTO_UDP, 2049, /* nfs */
  13. 100005, 1, IPPROTO_UDP, 2049, /* mount */
  14. 150001, 2, IPPROTO_UDP, 1111, /* pcnfsd v2 */
  15. 150001, 1, IPPROTO_UDP, 1111, /* pcnfsd v1 */
  16. 0, 0, 0, 0,
  17. };
  18. static void pmapinit(int, char**);
  19. static int pmapnull(int, Rpccall*, Rpccall*);
  20. static int pmapset(int, Rpccall*, Rpccall*);
  21. static int pmapunset(int, Rpccall*, Rpccall*);
  22. static int pmapgetport(int, Rpccall*, Rpccall*);
  23. static int pmapdump(int, Rpccall*, Rpccall*);
  24. static int pmapcallit(int, Rpccall*, Rpccall*);
  25. static Procmap pmapproc[] = {
  26. 0, pmapnull,
  27. 1, pmapset,
  28. 2, pmapunset,
  29. 3, pmapgetport,
  30. 4, pmapdump,
  31. 5, pmapcallit,
  32. 0, 0
  33. };
  34. int myport = 111;
  35. Progmap progmap[] = {
  36. 100000, 2, pmapinit, pmapproc,
  37. 0, 0, 0,
  38. };
  39. void
  40. main(int argc, char *argv[])
  41. {
  42. server(argc, argv, myport, progmap);
  43. }
  44. static
  45. void
  46. pmapinit(int argc, char **argv)
  47. {
  48. USED(argc, argv);
  49. clog("portmapper init\n");
  50. }
  51. static int
  52. pmapnull(int n, Rpccall *cmd, Rpccall *reply)
  53. {
  54. USED(n, cmd, reply);
  55. return 0;
  56. }
  57. static int
  58. pmapset(int n, Rpccall *cmd, Rpccall *reply)
  59. {
  60. uchar *dataptr = reply->results;
  61. if(n != 16)
  62. return garbage(reply, "bad count");
  63. USED(cmd);
  64. PLONG(FALSE);
  65. return dataptr - (uchar *)reply->results;
  66. }
  67. static int
  68. pmapunset(int n, Rpccall *cmd, Rpccall *reply)
  69. {
  70. uchar *dataptr = reply->results;
  71. if(n != 16)
  72. return garbage(reply, "bad count");
  73. USED(cmd);
  74. PLONG(TRUE);
  75. return dataptr - (uchar *)reply->results;
  76. }
  77. static int
  78. pmapgetport(int n, Rpccall *cmd, Rpccall *reply)
  79. {
  80. int prog, vers, prot;
  81. uchar *argptr = cmd->args;
  82. uchar *dataptr = reply->results;
  83. Portmap *mp;
  84. clog("get port\n");
  85. if(n != 16)
  86. return garbage(reply, "bad count");
  87. prog = GLONG();
  88. vers = GLONG();
  89. prot = GLONG();
  90. chat("host=%I, port=%ld: ", cmd->host, cmd->port);
  91. chat("getport: %d, %d, %d...", prog, vers, prot);
  92. for(mp=map; mp->prog>0; mp++)
  93. if(prog == mp->prog && vers == mp->vers &&
  94. prot == mp->protocol)
  95. break;
  96. chat("%d\n", mp->port);
  97. PLONG(mp->port);
  98. return dataptr - (uchar *)reply->results;
  99. }
  100. static int
  101. pmapdump(int n, Rpccall *cmd, Rpccall *reply)
  102. {
  103. uchar *dataptr = reply->results;
  104. Portmap *mp;
  105. if(n != 0)
  106. return garbage(reply, "bad count");
  107. USED(cmd);
  108. for(mp=map; mp->prog>0; mp++){
  109. PLONG(1);
  110. PLONG(mp->prog);
  111. PLONG(mp->vers);
  112. PLONG(mp->protocol);
  113. PLONG(mp->port);
  114. }
  115. PLONG(0);
  116. return dataptr - (uchar *)reply->results;
  117. }
  118. static int
  119. pmapcallit(int n, Rpccall *cmd, Rpccall *reply)
  120. {
  121. int prog, vers, proc;
  122. uchar *argptr = cmd->args;
  123. uchar *dataptr = reply->results;
  124. Portmap *mp;
  125. if(n < 12)
  126. return garbage(reply, "bad count");
  127. prog = GLONG();
  128. vers = GLONG();
  129. proc = GLONG();
  130. chat("host=%I, port=%ld: ", cmd->host, cmd->port);
  131. chat("callit: %d, %d, %d...", prog, vers, proc);
  132. for(mp=map; mp->prog>0; mp++)
  133. if(prog == mp->prog && vers == mp->vers &&
  134. proc == 0)
  135. break;
  136. if(mp->port == 0){
  137. chat("ignored\n");
  138. return -1;
  139. }
  140. chat("%d\n", mp->port);
  141. PLONG(mp->port);
  142. PLONG(0);
  143. return dataptr - (uchar *)reply->results;
  144. }