portmapper.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. ARGBEGIN{
  49. default:
  50. if(argopt(ARGC()) < 0)
  51. sysfatal("usage: %s %s", argv0, commonopts);
  52. break;
  53. }ARGEND;
  54. clog("portmapper init\n");
  55. }
  56. static int
  57. pmapnull(int n, Rpccall *cmd, Rpccall *reply)
  58. {
  59. USED(n, cmd, reply);
  60. return 0;
  61. }
  62. static int
  63. pmapset(int n, Rpccall *cmd, Rpccall *reply)
  64. {
  65. uchar *dataptr = reply->results;
  66. if(n != 16)
  67. return garbage(reply, "bad count");
  68. USED(cmd);
  69. PLONG(FALSE);
  70. return dataptr - (uchar *)reply->results;
  71. }
  72. static int
  73. pmapunset(int n, Rpccall *cmd, Rpccall *reply)
  74. {
  75. uchar *dataptr = reply->results;
  76. if(n != 16)
  77. return garbage(reply, "bad count");
  78. USED(cmd);
  79. PLONG(TRUE);
  80. return dataptr - (uchar *)reply->results;
  81. }
  82. static int
  83. pmapgetport(int n, Rpccall *cmd, Rpccall *reply)
  84. {
  85. int prog, vers, prot;
  86. uchar *argptr = cmd->args;
  87. uchar *dataptr = reply->results;
  88. Portmap *mp;
  89. clog("get port\n");
  90. if(n != 16)
  91. return garbage(reply, "bad count");
  92. prog = GLONG();
  93. vers = GLONG();
  94. prot = GLONG();
  95. chat("host=%I, port=%ld: ", cmd->host, cmd->port);
  96. chat("getport: %d, %d, %d...", prog, vers, prot);
  97. for(mp=map; mp->prog>0; mp++)
  98. if(prog == mp->prog && vers == mp->vers &&
  99. prot == mp->protocol)
  100. break;
  101. chat("%d\n", mp->port);
  102. PLONG(mp->port);
  103. return dataptr - (uchar *)reply->results;
  104. }
  105. static int
  106. pmapdump(int n, Rpccall *cmd, Rpccall *reply)
  107. {
  108. uchar *dataptr = reply->results;
  109. Portmap *mp;
  110. if(n != 0)
  111. return garbage(reply, "bad count");
  112. USED(cmd);
  113. for(mp=map; mp->prog>0; mp++){
  114. PLONG(1);
  115. PLONG(mp->prog);
  116. PLONG(mp->vers);
  117. PLONG(mp->protocol);
  118. PLONG(mp->port);
  119. }
  120. PLONG(0);
  121. return dataptr - (uchar *)reply->results;
  122. }
  123. static int
  124. pmapcallit(int n, Rpccall *cmd, Rpccall *reply)
  125. {
  126. int prog, vers, proc;
  127. uchar *argptr = cmd->args;
  128. uchar *dataptr = reply->results;
  129. Portmap *mp;
  130. if(n < 12)
  131. return garbage(reply, "bad count");
  132. prog = GLONG();
  133. vers = GLONG();
  134. proc = GLONG();
  135. chat("host=%I, port=%ld: ", cmd->host, cmd->port);
  136. chat("callit: %d, %d, %d...", prog, vers, proc);
  137. for(mp=map; mp->prog>0; mp++)
  138. if(prog == mp->prog && vers == mp->vers &&
  139. proc == 0)
  140. break;
  141. if(mp->port == 0){
  142. chat("ignored\n");
  143. return -1;
  144. }
  145. chat("%d\n", mp->port);
  146. PLONG(mp->port);
  147. PLONG(0);
  148. return dataptr - (uchar *)reply->results;
  149. }