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