static INT64_T do_ticket_register(int argc, char **argv) { assert(argc == 3 || argc == 4); if(argc == 3) { return chirp_reli_ticket_register(current_host, argv[1], NULL, (time_t) strtoull(argv[2], NULL, 10), stoptime); } else { return chirp_reli_ticket_register(current_host, argv[1], argv[2], (time_t) strtoull(argv[3], NULL, 10), stoptime); } }
static int sn_ticket (confuga *C, const struct confuga_host *host) { static const char SQL[] = "UPDATE Confuga.StorageNode" " SET ticket = ?2" " WHERE hostport = ?1;" ; int rc; sqlite3 *db = C->db; sqlite3_stmt *stmt = NULL; const char *current = SQL; time_t stoptime = STOPTIME_SHORT; char ticket[PATH_MAX]; char path[CHIRP_PATH_MAX]; struct stat info; FILE *stream = NULL; CATCHUNIX(snprintf(ticket, sizeof(ticket), "%s/ticket", C->root)); CATCHUNIX(chirp_reli_ticket_register(host->hostport, ticket, "self", TICKET_DURATION, stoptime)); /* The list permission is necessary because chirp_fs_local_scheduler.c:geturl does a stat. */ CATCHUNIX(snprintf(path, sizeof(path), "%s/file", host->root)); CATCHUNIX(chirp_reli_ticket_modify(host->hostport, ticket, path, "lr", stoptime)); /* Add write permission because a putfile may need retried. */ CATCHUNIX(snprintf(path, sizeof(path), "%s/open", host->root)); CATCHUNIX(chirp_reli_ticket_modify(host->hostport, ticket, path, "pw", stoptime)); CATCHUNIX(snprintf(path, sizeof(path), "%s/ticket", host->root)); stream = fopen(ticket, "r"); CATCHUNIX(stream ? 0 : -1); CATCHUNIX(fstat(fileno(stream), &info)); CATCHUNIX(chirp_reli_putfile(host->hostport, path, stream, S_IRUSR, info.st_size, stoptime)); sqlcatch(sqlite3_prepare_v2(db, current, -1, &stmt, ¤t)); sqlcatch(sqlite3_bind_text(stmt, 1, host->hostport, -1, SQLITE_STATIC)); sqlcatch(sqlite3_bind_blob(stmt, 2, C->ticket, sizeof(C->ticket), SQLITE_STATIC)); sqlcatchcode(sqlite3_step(stmt), SQLITE_DONE); sqlcatch(sqlite3_finalize(stmt); stmt = NULL); rc = 0; goto out; out: if (stream) fclose(stream); sqlite3_finalize(stmt); return rc; }
static INT64_T do_ticket_create(int argc, char **argv) { char name[CHIRP_PATH_MAX] = ""; const char *subject = NULL; time_t duration = 86400; /* one day */ unsigned bits = 1024; int i; /* fix split bug */ if(argv[1] == NULL) argc = 0; for(i = 1; i < argc; i++) { if(*argv[i] == '-') { if(i == argc) { /* is the argument option beyond the argv array? */ fprintf(stderr, "missing option argument to create: %s\n", argv[i]); return -1; } if(strcmp(argv[i], "-o") == 0 || strcmp(argv[i], "-output") == 0) { strncpy(name, argv[++i], CHIRP_PATH_MAX); name[CHIRP_PATH_MAX - 1] = '\0'; } else if(strcmp(argv[i], "-s") == 0 || strcmp(argv[i], "-subject") == 0) { subject = argv[++i]; } else if(strcmp(argv[i], "-d") == 0 || strcmp(argv[i], "-duration") == 0) { duration = (time_t) strtoull(argv[++i], NULL, 10); if(duration == 0) { fprintf(stderr, "invalid ticket duration: %s\n", argv[i]); return -1; } } else if(strcmp(argv[i], "-b") == 0 || strcmp(argv[i], "-bits") == 0) { bits = strtoull(argv[++i], NULL, 10); if(bits == 0) { fprintf(stderr, "invalid number of bits: %s\n", argv[i]); return -1; } } else { fprintf(stderr, "invalid option to create: %s\n", argv[i]); return -1; } } else break; } INT64_T result = chirp_reli_ticket_create(current_host, name, bits, stoptime); if(result < 0) { fprintf(stderr, "could not create ticket\n"); return result; } fprintf(stderr, "ticket '%s': successfully created with %d bits.\n", name, bits); result = chirp_reli_ticket_register(current_host, name, subject, duration, stoptime); if(result < 0) { fprintf(stderr, "could not register ticket\n"); return result; } fprintf(stderr, "ticket '%s': successfully registered.\n", name); for(; i < argc; i += 2) { if(i == argc - 1) { fprintf(stderr, "ticket '%s': directory '%s' requires an aclmask.\n", name, argv[i]); errno = EINVAL; return -1; } char *path = argv[i]; char *aclmask = argv[i + 1]; acl_simple(&aclmask); fprintf(stderr, "ticket '%s': directory '%s' aclmask = '%s'.\n", name, path, aclmask); result = chirp_reli_ticket_modify(current_host, name, path, aclmask, stoptime); if(result < 0) { fprintf(stderr, "ticket '%s': could not set acl mask '%s' for directory '%s'\n", name, argv[i + 1], argv[i]); return -1; } } return 0; }