portmapper.c 3.2 KB

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