1 #!/usr/bin/env python2.7
5 sys.path.append("/root/archip/xseg/sys/user/python")
6 from xseg import xseg_api as xseg
7 from xseg import xprotocol
9 cb_null_ptrtype = xseg.CFUNCTYPE(None, xseg.POINTER(xseg.xseg), xseg.uint32_t)
11 # FIXME: Error handling
13 print >> sys.stderr, errbuf
16 def mapper_loop(port, ctx):
18 if xseg.xseg_prepare_wait(ctx, port) != 0:
19 perr("prepare_wait\n")
21 xreqp = xseg.xseg_accept(ctx, port)
25 xseg.xseg_wait_signal(ctx, 1000)
28 xseg.xseg_cancel_wait(ctx, port)
30 if xseg.sizeof(xprotocol.xseg_reply_map) + xseg.sizeof(xprotocol.xseg_reply_map_scatterlist) > xreq.datalen:
32 if xreq.targetlen > xprotocol.XSEG_MAX_TARGETLEN:
35 mreplyp = xseg.cast(xreq.data, xseg.POINTER(xprotocol.xseg_reply_map))
37 mreply = mreplyp.contents
43 segsp = xseg.cast(mreply.segs, xseg.POINTER(xprotocol.xseg_reply_map_scatterlist))
49 segs.offset = xreq.offset
51 tmp = xseg.string_at(xreq.target, xreq.targetlen)
54 xreq.state |= xseg.XS_SERVED
55 if xseg.xseg_respond(ctx, xreq.portno, xreq) == xseg.NoSerial:
56 perr("xseg_respond\n")
58 if xseg.xseg_signal(ctx, xreq.portno) != 0:
61 def mapper_init(port, spec):
62 if xseg.xseg_initialize() < 0:
63 perr("xseg_initialize")
65 xconf = xseg.xseg_config()
66 xseg.xseg_parse_spec(spec, xconf)
68 ctx = xseg.xseg_join(xconf.type, xconf.name, "posix", xseg.cast(0, cb_null_ptrtype))
75 xseg.xseg_bind_port(ctx, port)
80 parser = argparse.ArgumentParser(description='mapper')
82 parser.add_argument('-p', '--port', type=int, nargs='?', help='mapper port')
83 parser.add_argument('-b', '--bport', type=int, nargs='?', help='blocker port')
84 parser.add_argument('-g', '--spec', type=str, nargs='?', help='xseg segment spec')
86 return parser.parse_args()
88 def validate_cmdline(args):
90 perr("invalid port specified")
94 if __name__ == '__main__':
95 args = parse_cmdline()
96 validate_cmdline(args)
98 ctx = mapper_init(args.port, args.spec)
100 mapper_loop(args.port, ctx)