12 #include <xseg/xseg.h>
13 #include <xseg/protocol.h>
15 #define MAX_ARG_LEN 255
16 int safe_strlen(char *s)
22 for (i = 0; i < MAX_ARG_LEN; i++) {
30 int validate_alphanumeric(char *s)
33 int len = safe_strlen(s);
38 for (i = 0; i < len; i++) {
39 if (!isalnum(*s)&&*s!='-'&&*s!='.')
46 int validate_numeric(char *s)
49 int len = safe_strlen(s);
53 for (i = 0; i < len; i++) {
61 char *spec = "segdev:xsegbd:16:1024:12";
63 struct xseg_config cfg;
64 xport srcport = NoPort;
66 struct xseg_port *port;
69 static void init_local_signal()
71 if (xseg && sport != srcport){
72 xseg_init_local_signal(xseg, srcport);
77 int wait_reply(struct xseg_request *expected_req)
79 struct xseg_request *rec;
80 xseg_prepare_wait(xseg, srcport);
82 rec = xseg_receive(xseg, srcport, 0);
84 if (rec != expected_req) {
85 fprintf(stderr, "Unknown received req. Putting req.\n");
86 xseg_put_request(xseg, rec, srcport);
87 } else if (!(rec->state & XS_SERVED)) {
88 fprintf(stderr, "Failed req\n");
94 xseg_wait_signal(xseg, 1000000UL);
96 xseg_cancel_wait(xseg, srcport);
101 int vlmc_create(char *name, uint64_t size, char *snap)
104 int targetlen = safe_strlen(name);
105 int snaplen = safe_strlen(snap);
106 if (targetlen <= 0) {
107 fprintf(stderr, "Invalid name\n");
110 if (snaplen <= 0 && size == -1) {
111 fprintf(stderr, "Size or snap must be provided in create\n");
114 XSEGLOG("Name: %s", name);
115 XSEGLOG("Snap: %s", snap);
117 struct xseg_request *req = xseg_get_request(xseg, srcport, mportno, X_ALLOC);
119 fprintf(stderr, "Couldn't allocate xseg request\n");
122 int r = xseg_prep_request(xseg, req, targetlen, sizeof(struct xseg_request_clone));
124 fprintf(stderr, "Couldn't prep xseg request\n");
125 xseg_put_request(xseg, req, srcport);
128 char *target = xseg_get_target(xseg, req);
129 strncpy(target, name, targetlen);
130 struct xseg_request_clone *xclone = (struct xseg_request_clone *) xseg_get_data(xseg, req);
132 memset(xclone->target, 0, XSEG_MAX_TARGETLEN);
133 xclone->targetlen = 0;
136 strncpy(xclone->target, snap, snaplen);
137 xclone->targetlen = snaplen;
141 req->size = req->datalen;
144 xport p = xseg_submit(xseg, req, srcport, X_ALLOC);
146 fprintf(stderr, "couldn't submit req\n");
147 xseg_put_request(xseg, req, srcport);
150 xseg_signal(xseg, p);
152 ret = wait_reply(req);
154 xseg_put_request(xseg, req, srcport);
159 int vlmc_snapshot(char *name)
164 int vlmc_remove(char *name)
166 int targetlen = safe_strlen(name);
167 if (targetlen <= 0) {
168 fprintf(stderr, "Invalid name\n");
172 struct xseg_request *req = xseg_get_request(xseg, srcport, mportno, X_ALLOC);
174 fprintf(stderr, "Couldn't allocate xseg request\n");
177 int r = xseg_prep_request(xseg, req, targetlen, 0);
179 fprintf(stderr, "Couldn't prep xseg request\n");
180 xseg_put_request(xseg, req, srcport);
183 char *target = xseg_get_target(xseg, req);
184 strncpy(target, name, targetlen);
186 req->size = req->datalen;
189 xport p = xseg_submit(xseg, req, srcport, X_ALLOC);
191 fprintf(stderr, "couldn't submit req\n");
192 xseg_put_request(xseg, req, srcport);
195 xseg_signal(xseg, p);
199 xseg_put_request(xseg, req, srcport);
204 int vlmc_resize(char *name, uint64_t size)
209 int vlmc_map(char *name)
218 for (p = 2; p < cfg.nr_ports; p++) {
219 sprintf(buf, "%sdevices/%u/srcport", XSEGBD_SYSFS, p);
220 fd = open(buf, O_RDONLY);
221 if (fd < 0 && errno == ENOENT)
224 if (p == cfg.nr_ports){
225 fprintf(stderr, "No available port\n");
229 sprintf(cmd, "%s %u:%u:%u", name, p, VPORT, REQS);
230 sprintf(buf, "%sadd", XSEGBD_SYSFS);
231 fd = open(add, O_WRONLY);
233 fprintf(stderr, "Cannot open sysfs add\n");
236 r = write(fd, cmd, strlen(cmd));
238 fprintf(stderr, "write error\n");
246 int vlmc_unmap(char *name)
256 #define err_in_arg(__i, __arg) do { \
257 fprintf(stderr, "Error in argument %d (%s)\n", __i, __arg); \
261 int main(int argc, char *argv[])
265 fprintf(stderr, "insufficient arguments\n");
270 if (xseg_parse_spec(spec, &cfg)) {
271 fprintf(stderr, "Cannot parse spec\n");
275 if (xseg_initialize()) {
276 fprintf(stderr, "cannot initialize!\n");
280 xseg = xseg_join(cfg.type, cfg.name, "posix", NULL);
282 fprintf(stderr, "cannot join segment!\n");
293 for (i = 3; i < argc; i++) {
294 if ((!strcmp(argv[i], "-s") || !strcmp(argv[i], "--size")) && i+1 < argc){
295 if (!validate_numeric(argv[i+1])){
296 err_in_arg(i, argv[i]);
298 size = atol(argv[i+1]);
301 }else if ((!strcmp(argv[i], "-c") || !strcmp(argv[i], "--config")) && i+1 < argc){
302 if (!validate_alphanumeric(argv[i+1])){
303 err_in_arg(i, argv[i]);
308 } else if (!strcmp(argv[i], "--snap") && i+1 < argc){
309 if (!validate_alphanumeric(argv[i+1])){
310 err_in_arg(i, argv[i]);
315 } else if (!strcmp(argv[i], "-mp") && i+1 < argc){
316 if (!validate_numeric(argv[i+1])){
317 err_in_arg(i, argv[i]);
319 mportno = atol(argv[i+1]);
322 } else if (!strcmp(argv[i], "-p") && i+1 < argc){
323 if (!validate_alphanumeric(argv[i+1])){
324 err_in_arg(i, argv[i]);
326 srcport = atol(argv[i+1]);
329 } else if (!strcmp(argv[i], "--name") && i+1 < argc){
330 if (!validate_alphanumeric(argv[i+1])){
331 err_in_arg(i, argv[i]);
337 err_in_arg(i, argv[i]);
341 if (srcport > cfg.nr_ports || mportno > cfg.nr_ports) {
342 fprintf(stderr, "Invalid port\n");
346 port = xseg_bind_port(xseg, srcport, NULL);
348 fprintf(stderr, "Error binding port %u\n", srcport);
354 if (!strcmp(argv[2], "create"))
355 ret = vlmc_create(name, size, snap);
356 else if (!strcmp(argv[2], "remove"))
357 ret = vlmc_remove(name);
359 else if (!strcmp(argv[2], "map"))
360 ret = vlmc_map(name);
361 else if (!strcmp(argv[2], "unmap"))
362 ret = vlmc_unmap(name);
363 else if (!strcmp(argv[2], "showmapped"))
364 ret = vlmc_showmapped();
365 else if (!strcmp(argv[2], "list") || !(strcmp(argv[2], "ls"))
368 else if (!strcmp(argv[2], "resize"))
369 ret = vlmc_resize(name, size);
371 fprintf(stderr, "unknown action (%s)\n", argv[2]);