int wrap_parse_data_read_msg (char *buf, struct wrap_msg_buf *wmsg) { struct wrap_data_read * res = &wmsg->body.data_read; char * scan = buf+3; wmsg->msg_type = WRAP_MSGTYPE_DATA_READ; while (*scan && *scan == ' ') scan++; if (*scan == 0) return -1; res->offset = NDMOS_API_STRTOLL (scan, &scan, 0); if (*scan != ' ') return -1; while (*scan && *scan != ' ') scan++; if (*scan == 0) return -1; res->length = NDMOS_API_STRTOLL (scan, &scan, 0); /* tolerate trailing white */ while (*scan && *scan != ' ') scan++; if (*scan != 0) return -1; return 0; }
int wrap_parse_add_dirent_msg (char *buf, struct wrap_msg_buf *wmsg) { struct wrap_add_dirent *res = &wmsg->body.add_dirent; char * scan = buf+3; char * p; int rc; wmsg->msg_type = WRAP_MSGTYPE_ADD_DIRENT; res->fhinfo = WRAP_INVALID_FHINFO; while (*scan && *scan == ' ') scan++; if (*scan == 0) return -1; res->dir_fileno = NDMOS_API_STRTOLL (scan, &scan, 0); if (*scan != ' ') return -1; while (*scan == ' ') scan++; if (*scan == 0) return -1; p = scan; while (*scan && *scan != ' ') scan++; if (*scan) { *scan = 0; rc = wrap_cstr_to_str (p, res->name, sizeof res->name); *scan++ = ' '; } else { rc = wrap_cstr_to_str (p, res->name, sizeof res->name); } if (rc < 0) return -2; res->fileno = NDMOS_API_STRTOLL (scan, &scan, 0); if (*scan != ' ' && *scan != 0) return -1; while (*scan == ' ') scan++; if (*scan == '@') { res->fhinfo = NDMOS_API_STRTOLL(scan+1, &scan, 0); } if (*scan != ' ' && *scan != 0) return -1; while (*scan == ' ') scan++; if (*scan) return -1; return 0; }
int wrap_parse_add_node_msg (char *buf, struct wrap_msg_buf *wmsg) { struct wrap_add_node * res = &wmsg->body.add_node; char * scan = buf+3; char * p; int rc; wmsg->msg_type = WRAP_MSGTYPE_ADD_NODE; res->fstat.valid = 0; res->fhinfo = WRAP_INVALID_FHINFO; while (*scan && *scan == ' ') scan++; if (*scan == 0) return -1; res->fstat.fileno = NDMOS_API_STRTOLL (scan, &scan, 0); if (*scan != ' ' && *scan != 0) return -1; res->fstat.valid |= WRAP_FSTAT_VALID_FILENO; while (*scan) { p = scan+1; switch (*scan) { case ' ': scan++; continue; case '@': res->fhinfo = NDMOS_API_STRTOLL (p, &scan, 0); break; default: rc = wrap_parse_fstat_subr(&scan, &res->fstat); if (rc < 0) return rc; break; } if (*scan != ' ' && *scan != 0) { /* bogus */ return -1; } } if ( (res->fstat.valid & WRAP_FSTAT_VALID_FILENO) == 0) return -5; return 0; }
int ndmfhdb_dir_lookup(struct ndmfhdb* fhcb, uint64_t dir_node, char* name, uint64_t* node_p) { int rc, off; char* p; char key[256 + 128]; char linebuf[2048]; snprintf(key, sizeof(key), "DHd %llu ", dir_node); p = NDMOS_API_STREND(key); ndmcstr_from_str(name, p, sizeof key - (p - key) - 10); strcat(p, " UNIX "); p = NDMOS_API_STREND(key); off = p - key; rc = ndmbstf_first(fhcb->fp, key, linebuf, sizeof linebuf); if (rc <= 0) { return rc; /* error or not found */ } *node_p = NDMOS_API_STRTOLL(linebuf + off, &p, 0); if (*p != 0) { return -10; } return 1; }
int ndmfhdb_dirnode_root (struct ndmfhdb *fhcb) { int rc, off; char * p; char key[256]; char linebuf[2048]; sprintf (key, "DHr "); p = NDMOS_API_STREND(key); off = p - key; rc = ndmbstf_first (fhcb->fp, key, linebuf, sizeof linebuf); if (rc <= 0) { return rc; /* error or not found */ } fhcb->root_node = NDMOS_API_STRTOLL (linebuf+off, &p, 0); if (*p != 0) { return -10; } return 1; }
int wrap_parse_add_file_msg (char *buf, struct wrap_msg_buf *wmsg) { struct wrap_add_file * res = &wmsg->body.add_file; char * scan = buf+3; char * p; int rc; wmsg->msg_type = WRAP_MSGTYPE_ADD_FILE; res->fstat.valid = 0; res->fhinfo = WRAP_INVALID_FHINFO; while (*scan && *scan == ' ') scan++; if (*scan == 0) return -1; p = scan; while (*scan && *scan != ' ') scan++; if (*scan) { *scan = 0; rc = wrap_cstr_to_str (p, res->path, sizeof res->path); *scan++ = ' '; } else { rc = wrap_cstr_to_str (p, res->path, sizeof res->path); } if (rc < 0) return -2; while (*scan) { p = scan+1; switch (*scan) { case ' ': scan++; continue; case '@': res->fhinfo = NDMOS_API_STRTOLL (p, &scan, 0); break; default: rc = wrap_parse_fstat_subr(&scan, &res->fstat); if (rc < 0) return rc; break; } if (*scan != ' ' && *scan != 0) { /* bogus */ return -1; } } return 0; }
int ndm_fstat_from_str(ndmp9_file_stat* fstat, char* buf) { char* scan = buf; ndmp9_validity* valid_p; NDMOS_MACRO_ZEROFILL(fstat); while (*scan) { char* p = scan + 1; switch (*scan) { case ' ': scan++; continue; case '@': /* fh_info */ fstat->fh_info.value = NDMOS_API_STRTOLL(p, &scan, 0); valid_p = &fstat->fh_info.valid; break; case 's': /* size */ fstat->size.value = NDMOS_API_STRTOLL(p, &scan, 0); valid_p = &fstat->size.valid; break; case 'i': /* fileno (inum) */ fstat->node.value = NDMOS_API_STRTOLL(p, &scan, 0); valid_p = &fstat->node.valid; break; case 'm': /* mode low twelve bits */ fstat->mode.value = strtol(p, &scan, 8); valid_p = &fstat->mode.valid; break; case 'l': /* link count */ fstat->links.value = strtol(p, &scan, 0); valid_p = &fstat->links.valid; break; case 'u': /* uid */ fstat->uid.value = strtol(p, &scan, 0); valid_p = &fstat->uid.valid; break; case 'g': /* gid */ fstat->gid.value = strtol(p, &scan, 0); valid_p = &fstat->gid.valid; break; case 't': /* one of the times */ p = scan + 2; switch (scan[1]) { case 'm': /* mtime */ fstat->mtime.value = strtol(p, &scan, 0); valid_p = &fstat->mtime.valid; break; case 'a': /* atime */ fstat->atime.value = strtol(p, &scan, 0); valid_p = &fstat->atime.valid; break; case 'c': /* ctime */ fstat->ctime.value = strtol(p, &scan, 0); valid_p = &fstat->ctime.valid; break; default: return -13; } break; case 'f': /* ftype (file type) */ switch (scan[1]) { case 'd': fstat->ftype = NDMP9_FILE_DIR; break; case 'p': fstat->ftype = NDMP9_FILE_FIFO; break; case 'c': fstat->ftype = NDMP9_FILE_CSPEC; break; case 'b': fstat->ftype = NDMP9_FILE_BSPEC; break; case '-': fstat->ftype = NDMP9_FILE_REG; break; case 'l': fstat->ftype = NDMP9_FILE_SLINK; break; case 's': fstat->ftype = NDMP9_FILE_SOCK; break; case 'R': fstat->ftype = NDMP9_FILE_REGISTRY; break; case 'o': fstat->ftype = NDMP9_FILE_OTHER; break; default: fstat->ftype = NDMP9_FILE_OTHER; return -15; } scan += 2; valid_p = 0; break; default: return -13; } if (*scan != ' ' && *scan != 0) return -11; if (valid_p) *valid_p = NDMP9_VALIDITY_VALID; } return 0; }
int wrap_parse_fstat_subr (char **scanp, struct wrap_fstat *fstat) { char * scan = *scanp; char * p = scan+1; unsigned long valid = 0; valid = 0; switch (*scan) { case 's': /* size */ valid = WRAP_FSTAT_VALID_SIZE; fstat->size = NDMOS_API_STRTOLL (p, &scan, 0); break; case 'i': /* fileno (inum) */ valid = WRAP_FSTAT_VALID_FILENO; fstat->fileno = NDMOS_API_STRTOLL (p, &scan, 0); break; case 'm': /* mode low twelve bits */ valid = WRAP_FSTAT_VALID_MODE; fstat->mode = strtol (p, &scan, 8); break; case 'l': /* link count */ valid = WRAP_FSTAT_VALID_LINKS; fstat->links = strtol (p, &scan, 0); break; case 'u': /* uid */ valid = WRAP_FSTAT_VALID_UID; fstat->uid = strtol (p, &scan, 0); break; case 'g': /* gid */ valid = WRAP_FSTAT_VALID_GID; fstat->gid = strtol (p, &scan, 0); break; case 't': /* one of the times */ p = scan+2; switch (scan[1]) { case 'm': /* mtime */ valid = WRAP_FSTAT_VALID_MTIME; fstat->mtime = strtol (p, &scan, 0); break; case 'a': /* atime */ valid = WRAP_FSTAT_VALID_ATIME; fstat->atime = strtol (p, &scan, 0); break; case 'c': /* ctime */ valid = WRAP_FSTAT_VALID_CTIME; fstat->ctime = strtol (p, &scan, 0); break; default: return -3; } break; case 'f': /* ftype (file type) */ valid = WRAP_FSTAT_VALID_FTYPE; switch (scan[1]) { case 'd': fstat->ftype = WRAP_FTYPE_DIR; break; case 'p': fstat->ftype = WRAP_FTYPE_FIFO; break; case 'c': fstat->ftype = WRAP_FTYPE_CSPEC; break; case 'b': fstat->ftype = WRAP_FTYPE_BSPEC; break; case '-': fstat->ftype = WRAP_FTYPE_REG; break; case 'l': fstat->ftype = WRAP_FTYPE_SLINK; break; case 's': fstat->ftype = WRAP_FTYPE_SOCK; break; case 'R': fstat->ftype = WRAP_FTYPE_REGISTRY; break; case 'o': fstat->ftype = WRAP_FTYPE_OTHER; break; default: fstat->ftype = WRAP_FTYPE_INVALID; return -5; } scan += 2; break; default: return -3; } if (*scan != ' ' && *scan != 0) return -1; fstat->valid |= valid; *scanp = scan; return 0; }
int wrap_process_args (int argc, char *argv[], struct wrap_ccb *wccb) { int c; enum wrap_ccb_op op; char * p; NDMOS_MACRO_ZEROFILL (wccb); wccb->progname = argv[0]; if (argc < 2) { strcpy (wccb->errmsg, "too few arguments"); return -1; } while ((c = getopt (argc, argv, "cxtB:d:I:E:f:o:")) != EOF) { switch (c) { case 'c': op = WRAP_CCB_OP_BACKUP; goto set_op; case 't': op = WRAP_CCB_OP_RECOVER_FILEHIST; goto set_op; case 'x': op = WRAP_CCB_OP_RECOVER; goto set_op; set_op: if (wccb->op != WRAP_CCB_OP_NONE) { strcpy (wccb->errmsg, "only one of -c, -x, -t"); return -1; } wccb->op = op; break; case 'B': if (wccb->B_butype) { strcpy (wccb->errmsg, "only one -B allowed"); return -1; } wccb->B_butype = optarg; break; case 'd': wccb->d_debug = atoi(optarg); break; case 'E': if (wccb->n_env >= WRAP_MAX_ENV) { strcpy (wccb->errmsg, "-E overflow"); return -1; } p = strchr (optarg, '='); if (p) { *p++ = 0; } else { p = ""; } wccb->env[wccb->n_env].name = optarg; wccb->env[wccb->n_env].value = p; wccb->n_env++; break; case 'f': if (wccb->f_file_name) { strcpy (wccb->errmsg, "only one -f allowed"); return -1; } wccb->f_file_name = optarg; break; case 'I': if (wccb->I_index_file_name) { strcpy (wccb->errmsg, "only one -I allowed"); return -1; } wccb->I_index_file_name = optarg; break; case 'o': if (wccb->n_o_option >= WRAP_MAX_O_OPTION) { strcpy (wccb->errmsg, "-o overflow"); return -1; } wccb->o_option[wccb->n_o_option] = optarg; wccb->n_o_option++; break; default: strcpy (wccb->errmsg, "unknown option"); return -1; } } switch (wccb->op) { default: abort(); /* just can't happen */ case WRAP_CCB_OP_NONE: strcpy (wccb->errmsg, "one of -c, -x, or -t required"); return -1; case WRAP_CCB_OP_BACKUP: if (optind < argc) { strcpy (wccb->errmsg, "extra args not allowed for -c"); return -1; } break; case WRAP_CCB_OP_RECOVER: case WRAP_CCB_OP_RECOVER_FILEHIST: break; } for (c = optind; c+2 < argc; c += 3) { p = argv[c+1]; if (p[0] != '@') { sprintf (wccb->errmsg, "malformed fhinfo %s", p); return -1; } if (wccb->n_file >= WRAP_MAX_FILE) { strcpy (wccb->errmsg, "file table overflow"); return -1; } if (strcmp (p, "@-") == 0) { wccb->file[wccb->n_file].fhinfo = WRAP_INVALID_FHINFO; } else { wccb->file[wccb->n_file].fhinfo = NDMOS_API_STRTOLL (p+1, &p, 0); if (*p != 0) { sprintf(wccb->errmsg,"malformed fhinfo %s",p); return -1; } } wccb->file[wccb->n_file].original_name = argv[c]; wccb->file[wccb->n_file].save_to_name = argv[c+2]; wccb->n_file++; } if (c < argc) { strcpy (wccb->errmsg, "superfluous args at end"); return -1; } p = wrap_find_env (wccb, "HIST"); if (p) { switch (*p) { case 'y': case 'Y': p = wrap_find_env (wccb, "HIST_TYPE"); if (!p) { p = "y"; } break; } switch (*p) { case 'y': case 'Y': wccb->hist_enable = 'y'; break; case 'd': case 'D': wccb->hist_enable = 'd'; break; case 'f': case 'F': wccb->hist_enable = 'f'; break; default: /* gripe? */ break; } } p = wrap_find_env (wccb, "DIRECT"); if (p) { if (*p == 'y') { wccb->direct_enable = 1; } } p = wrap_find_env (wccb, "FILESYSTEM"); if (!p) p = wrap_find_env (wccb, "PREFIX"); if (!p) p = "/"; wccb->backup_root = p; return 0; }