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);
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)
103 int targetlen = safe_strlen(name);
104 int snaplen = safe_strlen(snap);
105 if (targetlen <= 0) {
106 fprintf(stderr, "Invalid name\n");
109 if (snaplen <= 0 && size == -1) {
110 fprintf(stderr, "Size or snap must be provided in create\n");
114 struct xseg_request *req = xseg_get_request(xseg, srcport, mportno, X_ALLOC);
116 fprintf(stderr, "Couldn't allocate xseg request\n");
119 int r = xseg_prep_request(xseg, req, targetlen, sizeof(struct xseg_request_clone));
121 fprintf(stderr, "Couldn't prep xseg request\n");
122 xseg_put_request(xseg, req, srcport);
125 char *target = xseg_get_target(xseg, req);
126 strncpy(target, name, targetlen);
127 struct xseg_request_clone *xclone = (struct xseg_request_clone *) xseg_get_data(xseg, req);
129 memset(xclone->target, 0, XSEG_MAX_TARGETLEN);
131 strncpy(xclone->target, snap, snaplen);
132 xclone->target[snaplen] = 0;
136 req->size = req->datalen;
139 xport p = xseg_submit(xseg, req, srcport, X_ALLOC);
141 fprintf(stderr, "couldn't submit req\n");
142 xseg_put_request(xseg, req, srcport);
145 xseg_signal(xseg, p);
149 xseg_put_request(xseg, req, srcport);
154 int vlmc_snapshot(char *name)
159 int vlmc_remove(char *name)
161 int targetlen = safe_strlen(name);
162 if (targetlen <= 0) {
163 fprintf(stderr, "Invalid name\n");
167 struct xseg_request *req = xseg_get_request(xseg, srcport, mportno, X_ALLOC);
169 fprintf(stderr, "Couldn't allocate xseg request\n");
172 int r = xseg_prep_request(xseg, req, targetlen, 0);
174 fprintf(stderr, "Couldn't prep xseg request\n");
175 xseg_put_request(xseg, req, srcport);
178 char *target = xseg_get_target(xseg, req);
179 strncpy(target, name, targetlen);
180 target[targetlen] = 0;
182 req->size = req->datalen;
185 xport p = xseg_submit(xseg, req, srcport, X_ALLOC);
187 fprintf(stderr, "couldn't submit req\n");
188 xseg_put_request(xseg, req, srcport);
191 xseg_signal(xseg, p);
195 xseg_put_request(xseg, req, srcport);
200 int vlmc_resize(char *name, uint64_t size)
205 int vlmc_map(char *name)
214 for (p = 2; p < cfg.nr_ports; p++) {
215 sprintf(buf, "%sdevices/%u/srcport", XSEGBD_SYSFS, p);
216 fd = open(buf, O_RDONLY);
217 if (fd < 0 && errno == ENOENT)
220 if (p == cfg.nr_ports){
221 fprintf(stderr, "No available port\n");
225 sprintf(cmd, "%s %u:%u:%u", name, p, VPORT, REQS);
226 sprintf(buf, "%sadd", XSEGBD_SYSFS);
227 fd = open(add, O_WRONLY);
229 fprintf(stderr, "Cannot open sysfs add\n");
232 r = write(fd, cmd, strlen(cmd));
234 fprintf(stderr, "write error\n");
242 int vlmc_unmap(char *name)
252 #define err_in_arg(__i, __arg) do { \
253 fprintf(stderr, "Error in argument %d (%s)\n", __i, __arg); \
257 int main(int argc, const char *argv[])
261 fprintf(stderr, "insufficient arguments\n");
266 if (xseg_parse_spec(spec, &cfg)) {
267 fprintf(stderr, "Cannot parse spec\n");
271 if (xseg_initialize()) {
272 fprintf(stderr, "cannot initialize!\n");
276 xseg = xseg_join(cfg.type, cfg.name, "posix", NULL);
278 fprintf(stderr, "cannot join segment!\n");
289 for (i = 3; i < argc; i++) {
290 if ((!strcmp(argv[i], "-s") || !strcmp(argv[i], "--size")) && i+1 < argc){
291 if (!validate_numeric(argv[i+1])){
292 err_in_arg(i, argv[i]);
294 size = atol(argv[i+1]);
297 }else if ((!strcmp(argv[i], "-c") || !strcmp(argv[i], "--config")) && i+1 < argc){
298 if (!validate_alphanumeric(argv[i+1])){
299 err_in_arg(i, argv[i]);
304 } else if (!strcmp(argv[i], "--snap") && i+1 < argc){
305 if (!validate_alphanumeric(argv[i+1])){
306 err_in_arg(i, argv[i]);
311 } else if (!strcmp(argv[i], "-mp") && i+1 < argc){
312 if (!validate_numeric(argv[i+1])){
313 err_in_arg(i, argv[i]);
315 mportno = atol(argv[i+1]);
318 } else if (!strcmp(argv[i], "-p") && i+1 < argc){
319 if (!validate_alphanumeric(argv[i+1])){
320 err_in_arg(i, argv[i]);
322 srcport = atol(argv[i+1]);
325 } else if (!strcmp(argv[i], "--name") && i+1 < argc){
326 if (!validate_alphanumeric(argv[i+1])){
327 err_in_arg(i, argv[i]);
333 err_in_arg(i, argv[i]);
337 if (srcport > cfg.nr_ports || mportno > cfg.nr_ports) {
338 fprintf(stderr, "Invalid port\n");
342 port = xseg_bind_port(xseg, srcport);
344 fprintf(stderr, "Error binding port %u\n", srcport);
350 if (!strcmp(argv[2], "create"))
351 ret = vlmc_create(name, size, snap);
352 else if (!strcmp(argv[2], "remove"))
353 ret = vlmc_remove(name);
355 else if (!strcmp(argv[2], "map"))
356 ret = vlmc_map(name);
357 else if (!strcmp(argv[2], "unmap"))
358 ret = vlmc_unmap(name);
359 else if (!strcmp(argv[2], "showmapped"))
360 ret = vlmc_showmapped();
361 else if (!strcmp(argv[2], "list") || !(strcmp(argv[2], "ls"))
364 else if (!strcmp(argv[2], "resize"))
365 ret = vlmc_resize(name, size);
367 fprintf(stderr, "unknown action (%s)\n", argv[2]);