Esempio n. 1
0
File: wraplib.c Progetto: AlD/bareos
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;
}
Esempio n. 2
0
File: wraplib.c Progetto: AlD/bareos
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;
}
Esempio n. 3
0
File: wraplib.c Progetto: AlD/bareos
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;
}
Esempio n. 4
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;
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
File: wraplib.c Progetto: AlD/bareos
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;
}
Esempio n. 7
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;
}
Esempio n. 8
0
File: wraplib.c Progetto: AlD/bareos
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;
}
Esempio n. 9
0
File: wraplib.c Progetto: AlD/bareos
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;
}