URI: 
       tportmap.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tportmap.c (9757B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <thread.h>
            4 #include <sunrpc.h>
            5 
            6 static void
            7 portMapPrint(Fmt *fmt, PortMap *x)
            8 {
            9         fmtprint(fmt, "[%ud %ud %ud %ud]", x->prog, x->vers, x->prot, x->port);
           10 }
           11 static uint
           12 portMapSize(PortMap *x)
           13 {
           14         uint a;
           15         USED(x);
           16         a = 0 + 4 + 4 + 4 + 4;
           17         return a;
           18 }
           19 static int
           20 portMapPack(uchar *a, uchar *ea, uchar **pa, PortMap *x)
           21 {
           22         if(sunuint32pack(a, ea, &a, &x->prog) < 0) goto Err;
           23         if(sunuint32pack(a, ea, &a, &x->vers) < 0) goto Err;
           24         if(sunuint32pack(a, ea, &a, &x->prot) < 0) goto Err;
           25         if(sunuint32pack(a, ea, &a, &x->port) < 0) goto Err;
           26         *pa = a;
           27         return 0;
           28 Err:
           29         *pa = ea;
           30         return -1;
           31 }
           32 static int
           33 portMapUnpack(uchar *a, uchar *ea, uchar **pa, PortMap *x)
           34 {
           35         if(sunuint32unpack(a, ea, &a, &x->prog) < 0) goto Err;
           36         if(sunuint32unpack(a, ea, &a, &x->vers) < 0) goto Err;
           37         if(sunuint32unpack(a, ea, &a, &x->prot) < 0) goto Err;
           38         if(sunuint32unpack(a, ea, &a, &x->port) < 0) goto Err;
           39         *pa = a;
           40         return 0;
           41 Err:
           42         *pa = ea;
           43         return -1;
           44 }
           45 static void
           46 portTNullPrint(Fmt *fmt, PortTNull *x)
           47 {
           48         USED(x);
           49         fmtprint(fmt, "%s", "PortTNull");
           50 }
           51 static uint
           52 portTNullSize(PortTNull *x)
           53 {
           54         uint a;
           55         USED(x);
           56         a = 0;
           57         return a;
           58 }
           59 static int
           60 portTNullPack(uchar *a, uchar *ea, uchar **pa, PortTNull *x)
           61 {
           62         USED(ea);
           63         USED(x);
           64         *pa = a;
           65         return 0;
           66 }
           67 static int
           68 portTNullUnpack(uchar *a, uchar *ea, uchar **pa, PortTNull *x)
           69 {
           70         USED(ea);
           71         USED(x);
           72         *pa = a;
           73         return 0;
           74 }
           75 static void
           76 portRNullPrint(Fmt *fmt, PortRNull *x)
           77 {
           78         USED(x);
           79         fmtprint(fmt, "%s", "PortRNull");
           80 }
           81 static uint
           82 portRNullSize(PortRNull *x)
           83 {
           84         uint a;
           85         USED(x);
           86         a = 0;
           87         return a;
           88 }
           89 static int
           90 portRNullPack(uchar *a, uchar *ea, uchar **pa, PortRNull *x)
           91 {
           92         USED(ea);
           93         USED(x);
           94         *pa = a;
           95         return 0;
           96 }
           97 static int
           98 portRNullUnpack(uchar *a, uchar *ea, uchar **pa, PortRNull *x)
           99 {
          100         USED(ea);
          101         USED(x);
          102         *pa = a;
          103         return 0;
          104 }
          105 static void
          106 portTSetPrint(Fmt *fmt, PortTSet *x)
          107 {
          108         fmtprint(fmt, "PortTSet ");
          109         portMapPrint(fmt, &x->map);
          110 }
          111 static uint
          112 portTSetSize(PortTSet *x)
          113 {
          114         uint a;
          115         USED(x);
          116         a = 0 + portMapSize(&x->map);
          117         return a;
          118 }
          119 static int
          120 portTSetPack(uchar *a, uchar *ea, uchar **pa, PortTSet *x)
          121 {
          122         if(portMapPack(a, ea, &a, &x->map) < 0) goto Err;
          123         *pa = a;
          124         return 0;
          125 Err:
          126         *pa = ea;
          127         return -1;
          128 }
          129 static int
          130 portTSetUnpack(uchar *a, uchar *ea, uchar **pa, PortTSet *x)
          131 {
          132         if(portMapUnpack(a, ea, &a, &x->map) < 0) goto Err;
          133         *pa = a;
          134         return 0;
          135 Err:
          136         *pa = ea;
          137         return -1;
          138 }
          139 static void
          140 portRSetPrint(Fmt *fmt, PortRSet *x)
          141 {
          142         fmtprint(fmt, "PortRSet %ud", x->b);
          143 }
          144 static uint
          145 portRSetSize(PortRSet *x)
          146 {
          147         uint a;
          148         USED(x);
          149         a = 0 + 4;
          150         return a;
          151 }
          152 static int
          153 portRSetPack(uchar *a, uchar *ea, uchar **pa, PortRSet *x)
          154 {
          155         if(sunuint1pack(a, ea, &a, &x->b) < 0) goto Err;
          156         *pa = a;
          157         return 0;
          158 Err:
          159         *pa = ea;
          160         return -1;
          161 }
          162 static int
          163 portRSetUnpack(uchar *a, uchar *ea, uchar **pa, PortRSet *x)
          164 {
          165         if(sunuint1unpack(a, ea, &a, &x->b) < 0) goto Err;
          166         *pa = a;
          167         return 0;
          168 Err:
          169         *pa = ea;
          170         return -1;
          171 }
          172 static void
          173 portTUnsetPrint(Fmt *fmt, PortTUnset *x)
          174 {
          175         fmtprint(fmt, "PortTUnset ");
          176         portMapPrint(fmt, &x->map);
          177 }
          178 static uint
          179 portTUnsetSize(PortTUnset *x)
          180 {
          181         uint a;
          182         USED(x);
          183         a = 0 + portMapSize(&x->map);
          184         return a;
          185 }
          186 static int
          187 portTUnsetPack(uchar *a, uchar *ea, uchar **pa, PortTUnset *x)
          188 {
          189         if(portMapPack(a, ea, &a, &x->map) < 0) goto Err;
          190         *pa = a;
          191         return 0;
          192 Err:
          193         *pa = ea;
          194         return -1;
          195 }
          196 static int
          197 portTUnsetUnpack(uchar *a, uchar *ea, uchar **pa, PortTUnset *x)
          198 {
          199         if(portMapUnpack(a, ea, &a, &x->map) < 0) goto Err;
          200         *pa = a;
          201         return 0;
          202 Err:
          203         *pa = ea;
          204         return -1;
          205 }
          206 static void
          207 portRUnsetPrint(Fmt *fmt, PortRUnset *x)
          208 {
          209         fmtprint(fmt, "PortRUnset %ud", x->b);
          210 }
          211 static uint
          212 portRUnsetSize(PortRUnset *x)
          213 {
          214         uint a;
          215         USED(x);
          216         a = 0 + 4;
          217         return a;
          218 }
          219 static int
          220 portRUnsetPack(uchar *a, uchar *ea, uchar **pa, PortRUnset *x)
          221 {
          222         if(sunuint1pack(a, ea, &a, &x->b) < 0) goto Err;
          223         *pa = a;
          224         return 0;
          225 Err:
          226         *pa = ea;
          227         return -1;
          228 }
          229 static int
          230 portRUnsetUnpack(uchar *a, uchar *ea, uchar **pa, PortRUnset *x)
          231 {
          232         if(sunuint1unpack(a, ea, &a, &x->b) < 0) goto Err;
          233         *pa = a;
          234         return 0;
          235 Err:
          236         *pa = ea;
          237         return -1;
          238 }
          239 static void
          240 portTGetportPrint(Fmt *fmt, PortTGetport *x)
          241 {
          242         fmtprint(fmt, "PortTGetport ");
          243         portMapPrint(fmt, &x->map);
          244 }
          245 static uint
          246 portTGetportSize(PortTGetport *x)
          247 {
          248         uint a;
          249         USED(x);
          250         a = 0 + portMapSize(&x->map);
          251         return a;
          252 }
          253 static int
          254 portTGetportPack(uchar *a, uchar *ea, uchar **pa, PortTGetport *x)
          255 {
          256         if(portMapPack(a, ea, &a, &x->map) < 0) goto Err;
          257         *pa = a;
          258         return 0;
          259 Err:
          260         *pa = ea;
          261         return -1;
          262 }
          263 static int
          264 portTGetportUnpack(uchar *a, uchar *ea, uchar **pa, PortTGetport *x)
          265 {
          266         if(portMapUnpack(a, ea, &a, &x->map) < 0) goto Err;
          267         *pa = a;
          268         return 0;
          269 Err:
          270         *pa = ea;
          271         return -1;
          272 }
          273 static void
          274 portRGetportPrint(Fmt *fmt, PortRGetport *x)
          275 {
          276         fmtprint(fmt, "PortRGetport %ud", x->port);
          277 }
          278 static uint
          279 portRGetportSize(PortRGetport *x)
          280 {
          281         uint a;
          282         USED(x);
          283         a = 0 + 4;
          284         return a;
          285 }
          286 static int
          287 portRGetportPack(uchar *a, uchar *ea, uchar **pa, PortRGetport *x)
          288 {
          289         if(sunuint32pack(a, ea, &a, &x->port) < 0) goto Err;
          290         *pa = a;
          291         return 0;
          292 Err:
          293         *pa = ea;
          294         return -1;
          295 }
          296 static int
          297 portRGetportUnpack(uchar *a, uchar *ea, uchar **pa, PortRGetport *x)
          298 {
          299         if(sunuint32unpack(a, ea, &a, &x->port) < 0) goto Err;
          300         *pa = a;
          301         return 0;
          302 Err:
          303         *pa = ea;
          304         return -1;
          305 }
          306 static void
          307 portTDumpPrint(Fmt *fmt, PortTDump *x)
          308 {
          309         USED(x);
          310         fmtprint(fmt, "PortTDump");
          311 }
          312 static uint
          313 portTDumpSize(PortTDump *x)
          314 {
          315         uint a;
          316         USED(x);
          317         a = 0;
          318         return a;
          319 }
          320 static int
          321 portTDumpPack(uchar *a, uchar *ea, uchar **pa, PortTDump *x)
          322 {
          323         USED(ea);
          324         USED(x);
          325         *pa = a;
          326         return 0;
          327 }
          328 static int
          329 portTDumpUnpack(uchar *a, uchar *ea, uchar **pa, PortTDump *x)
          330 {
          331         USED(ea);
          332         USED(x);
          333         *pa = a;
          334         return 0;
          335 }
          336 static void
          337 portRDumpPrint(Fmt *fmt, PortRDump *x)
          338 {
          339         int i;
          340 
          341         fmtprint(fmt, "PortRDump");
          342         for(i=0; i<x->nmap; i++){
          343                 fmtprint(fmt, " ");
          344                 portMapPrint(fmt, &x->map[i]);
          345         }
          346 }
          347 static uint
          348 portRDumpSize(PortRDump *x)
          349 {
          350         return (5*4*x->nmap) + 4;
          351 }
          352 static int
          353 portRDumpPack(uchar *a, uchar *ea, uchar **pa, PortRDump *x)
          354 {
          355         int i;
          356         u32int zero, one;
          357 
          358         zero = 0;
          359         one = 1;
          360         for(i=0; i<x->nmap; i++){
          361                 if(sunuint32pack(a, ea, &a, &one) < 0
          362                 || portMapPack(a, ea, &a, &x->map[i]) < 0)
          363                         goto Err;
          364         }
          365         if(sunuint32pack(a, ea, &a, &zero) < 0)
          366                 goto Err;
          367         *pa = a;
          368         return 0;
          369 Err:
          370         *pa = ea;
          371         return -1;
          372 }
          373 static int
          374 portRDumpUnpack(uchar *a, uchar *ea, uchar **pa, PortRDump *x)
          375 {
          376         int i;
          377         u1int u1;
          378         PortMap *m;
          379 
          380         m = (PortMap*)a;
          381         for(i=0;; i++){
          382                 if(sunuint1unpack(a, ea, &a, &u1) < 0)
          383                         goto Err;
          384                 if(u1 == 0)
          385                         break;
          386                 if(portMapUnpack(a, ea, &a, &m[i]) < 0)
          387                         goto Err;
          388         }
          389         x->nmap = i;
          390         x->map = m;
          391         *pa = a;
          392         return 0;
          393 
          394 Err:
          395         *pa = ea;
          396         return -1;
          397 }
          398 static void
          399 portTCallitPrint(Fmt *fmt, PortTCallit *x)
          400 {
          401         fmtprint(fmt, "PortTCallit [%ud,%ud,%ud] %ud", x->prog, x->vers, x->proc, x->count);
          402 }
          403 static uint
          404 portTCallitSize(PortTCallit *x)
          405 {
          406         uint a;
          407         USED(x);
          408         a = 0 + 4 + 4 + 4 + sunvaropaquesize(x->count);
          409         return a;
          410 }
          411 static int
          412 portTCallitPack(uchar *a, uchar *ea, uchar **pa, PortTCallit *x)
          413 {
          414         if(sunuint32pack(a, ea, &a, &x->prog) < 0) goto Err;
          415         if(sunuint32pack(a, ea, &a, &x->vers) < 0) goto Err;
          416         if(sunuint32pack(a, ea, &a, &x->proc) < 0) goto Err;
          417         if(sunvaropaquepack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err;
          418         *pa = a;
          419         return 0;
          420 Err:
          421         *pa = ea;
          422         return -1;
          423 }
          424 static int
          425 portTCallitUnpack(uchar *a, uchar *ea, uchar **pa, PortTCallit *x)
          426 {
          427         if(sunuint32unpack(a, ea, &a, &x->prog) < 0) goto Err;
          428         if(sunuint32unpack(a, ea, &a, &x->vers) < 0) goto Err;
          429         if(sunuint32unpack(a, ea, &a, &x->proc) < 0) goto Err;
          430         if(sunvaropaqueunpack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err;
          431         *pa = a;
          432         return 0;
          433 Err:
          434         *pa = ea;
          435         return -1;
          436 }
          437 static void
          438 portRCallitPrint(Fmt *fmt, PortRCallit *x)
          439 {
          440         fmtprint(fmt, "PortRCallit %ud %ud", x->port, x->count);
          441 }
          442 static uint
          443 portRCallitSize(PortRCallit *x)
          444 {
          445         uint a;
          446         USED(x);
          447         a = 0 + 4 + sunvaropaquesize(x->count);
          448         return a;
          449 }
          450 static int
          451 portRCallitPack(uchar *a, uchar *ea, uchar **pa, PortRCallit *x)
          452 {
          453         if(sunuint32pack(a, ea, &a, &x->port) < 0) goto Err;
          454         if(sunvaropaquepack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err;
          455         *pa = a;
          456         return 0;
          457 Err:
          458         *pa = ea;
          459         return -1;
          460 }
          461 static int
          462 portRCallitUnpack(uchar *a, uchar *ea, uchar **pa, PortRCallit *x)
          463 {
          464         if(sunuint32unpack(a, ea, &a, &x->port) < 0) goto Err;
          465         if(sunvaropaqueunpack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err;
          466         *pa = a;
          467         return 0;
          468 Err:
          469         *pa = ea;
          470         return -1;
          471 }
          472 
          473 typedef int (*P)(uchar*, uchar*, uchar**, SunCall*);
          474 typedef void (*F)(Fmt*, SunCall*);
          475 typedef uint (*S)(SunCall*);
          476 
          477 static SunProc proc[] = {
          478         (P)portTNullPack, (P)portTNullUnpack, (S)portTNullSize, (F)portTNullPrint, sizeof(PortTNull),
          479         (P)portRNullPack, (P)portRNullUnpack, (S)portRNullSize, (F)portRNullPrint, sizeof(PortRNull),
          480         (P)portTSetPack, (P)portTSetUnpack, (S)portTSetSize, (F)portTSetPrint, sizeof(PortTSet),
          481         (P)portRSetPack, (P)portRSetUnpack, (S)portRSetSize, (F)portRSetPrint, sizeof(PortRSet),
          482         (P)portTUnsetPack, (P)portTUnsetUnpack, (S)portTUnsetSize, (F)portTUnsetPrint, sizeof(PortTUnset),
          483         (P)portRUnsetPack, (P)portRUnsetUnpack, (S)portRUnsetSize, (F)portRUnsetPrint, sizeof(PortRUnset),
          484         (P)portTGetportPack, (P)portTGetportUnpack, (S)portTGetportSize, (F)portTGetportPrint, sizeof(PortTGetport),
          485         (P)portRGetportPack, (P)portRGetportUnpack, (S)portRGetportSize, (F)portRGetportPrint, sizeof(PortRGetport),
          486         (P)portTDumpPack, (P)portTDumpUnpack, (S)portTDumpSize, (F)portTDumpPrint, sizeof(PortTDump),
          487         (P)portRDumpPack, (P)portRDumpUnpack, (S)portRDumpSize, (F)portRDumpPrint, sizeof(PortRDump),
          488         (P)portTCallitPack, (P)portTCallitUnpack, (S)portTCallitSize, (F)portTCallitPrint, sizeof(PortTCallit),
          489         (P)portRCallitPack, (P)portRCallitUnpack, (S)portRCallitSize, (F)portRCallitPrint, sizeof(PortRCallit),
          490 };
          491 
          492 SunProg portprog =
          493 {
          494         PortProgram,
          495         PortVersion,
          496         proc,
          497         nelem(proc),
          498 };