blob: 90654cc4cb80dea85ef5fbfee5b401cafedbbd1b [file] [log] [blame]
/*
* Copyright (c) 2000-2001 Silicon Graphics, Inc.
* All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <xfs/xfs.h>
#include <xfs/jdm.h>
#include <stdio.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <uuid/uuid.h>
#include "config.h"
#include "types.h"
#include "mlog.h"
#include "getopt.h"
#include "inv_priv.h"
/*----------------------------------------------------------------------*/
/* These are hacked up routines meant ONLY for low-level debugging */
/* purposes. These are mostly unused since most the debugging code */
/* was ported to xfsdump and xfsrestore as formal suboptions of -I. */
/*----------------------------------------------------------------------*/
static char *mnt_str[] = { "/usr/lib", "/usr", "/u/sw/courses", "/pro/leda",
"/root", "/a/xfs/xlv/e", "/dana/hates/me", "/the/krays" };
static char *dev_str[] = { "/dev/usr/lib", "/dev/usr", "/dev/u/sw/courses",
"/dev/pro/leda",
"/dev/root", "/dev/a/xfs/xlv/e", "/dev/dana/hates/me",
"/dev/the/krays" };
typedef enum { BULL = -1, WRI, REC, QUE, DEL, MP, QUE2 } hi;
void usage(void);
char *progname;
char *sesfile;
void
CREAT_mfiles(inv_stmtoken_t tok, uuid_t *moid, ino_t f, ino_t n)
{
uuid_t labelid;
char label[128], strbuf[20];
char *str;
unsigned int stat;
uuid_create(&labelid, &stat);
uuid_to_string(&labelid, &str, &stat);
strncpy(strbuf, str, 8);
free (str);
strbuf[8] = '\0';
sprintf(label,"%s_%s (%d-%d)\0","MEDIA_FILE", strbuf, (int)f, (int)n);
inv_put_mediafile(tok, moid, label, 12, f, 0, n, 0, 0xffff,
BOOL_TRUE, BOOL_FALSE);
}
typedef struct ses{
uuid_t fsid;
size_t sz;
char *buf;
} ses;
#define SESLIM 240
int
recons_test(int howmany)
{
int fd, i, rval = 1;
off64_t off = 0;
ses sarr[SESLIM];
fd = open(sesfile, O_RDONLY);
for (i=0; i<howmany && i < SESLIM; i++){
rval = get_invtrecord(fd, &sarr[i],
sizeof(uuid_t) + sizeof(size_t), off,
BOOL_FALSE);
assert(rval > 0);
assert(sarr[i].sz > 0);
sarr[i].buf = calloc(1, sarr[i].sz);
off += (off64_t)(sizeof(uuid_t) + sizeof(size_t));
rval = get_invtrecord(fd, sarr[i].buf, sarr[i].sz, off,
BOOL_FALSE);
assert(rval > 0);
off += sarr[i].sz;
}
for (i=0; i<howmany && i < SESLIM; i++){
if (inv_put_sessioninfo(sarr[i].buf, sarr[i].sz) < 0)
printf("$ insert failed.\n");
}
close(fd);
}
int
delete_test(int n)
{
int fd, i;
uuid_t moid;
char *str = 0;
unsigned int stat;
fd = open("moids", O_RDONLY);
if (fd < 0) return -1;
get_invtrecord(fd, &moid, sizeof(uuid_t), (n-1)* sizeof(uuid_t), 0);
uuid_to_string(&moid, &str, &stat);
printf("Searching for Moid = %s\n", str);
free(str);
if (! inv_delete_mediaobj(&moid)) return -1;
return 1;
}
int
sess_queries_byuuid(char *uu)
{
uint stat;
uuid_t uuid;
inv_session_t *ses;
invt_pr_ctx_t prctx;
uuid_from_string (uu, &uuid, &stat);
printf("uuid = %s\n", uu);
if (inv_get_session_byuuid(&uuid, &ses)) {
if (!ses)
return -1;
prctx.index = 0;
prctx.depth = PR_ALL;
prctx.mobj.type = INVT_NULLTYPE;
DEBUG_sessionprint(ses, 99, &prctx);
inv_free_session(&ses);
return 1;
}
return -1;
}
int
sess_queries_bylabel(char *lab)
{
inv_session_t *ses;
invt_pr_ctx_t prctx;
printf("label = %s\n", lab);
if (inv_get_session_bylabel(lab, &ses)) {
if (!ses)
return -1;
prctx.index = 0;
prctx.depth = PR_ALL;
prctx.mobj.type = INVT_NULLTYPE;
DEBUG_sessionprint(ses, 99, &prctx);
inv_free_session(&ses);
return 1;
}
return -1;
}
int
query_test(int level)
{
int i;
inv_idbtoken_t tok;
time_t *tm;
inv_session_t *ses;
invt_pr_ctx_t prctx;
if (level == -2) {
printf("mount pt %s\n",sesfile);
tok = inv_open(INV_BY_MOUNTPT, INV_SEARCH_ONLY, sesfile);
if (! tok) return -1;
idx_DEBUG_print (tok->d_invindex_fd);
return 1;
}
for (i = 7; i<8; i++) {
printf("\n\n\n----------------------------------\n"
"$ Searching fs %s\n", mnt_str[7-i]);
tok = inv_open(INV_BY_MOUNTPT, INV_SEARCH_ONLY, mnt_str[7-i]);
if (! tok) return -1;
prctx.index = i;
if (level == -1)
invmgr_inv_print(tok->d_invindex_fd, &prctx);
else {
if (inv_lasttime_level_lessthan(tok, level, &tm) && tm) {
printf("\n\nTIME %s %ld\n", ctime(tm), (long) *tm);
free (tm);
}
if (inv_lastsession_level_lessthan(tok, level, &ses) && ses) {
DEBUG_sessionprint(ses, 99, &prctx);
free (ses->s_streams);
free (ses);
}
if (inv_lastsession_level_equalto(tok, level, &ses) && ses) {
printf("Gotcha\n");
DEBUG_sessionprint(ses, 99, &prctx);
free (ses->s_streams);
free (ses);
}
}
inv_close(tok);
}
return 1;
}
/*----------------------------------------------------------------------*/
/* */
/* */
/* */
/*----------------------------------------------------------------------*/
int
write_test(int nsess, int nstreams, int nmedia, int dumplevel)
{
int i,j,k,m,fd;
unsigned int stat;
uuid_t *fsidp;
inv_idbtoken_t tok1;
inv_sestoken_t tok2;
inv_stmtoken_t tok3;
char *dev, *mnt;
char label[120];
uuid_t fsidarr[8], labelid;
uuid_t sesidarr[8];
char *str;
char strbuf[128];
void *bufp;
size_t sz;
#ifdef RECONS
int rfd;
off64_t off;
struct stat64 statbuf;
#endif
#ifdef FIRSTTIME
printf("first time!\n");
for (i=0; i<8; i++) {
uuid_create(&fsidarr[i], &stat);
assert (stat == uuid_s_ok);
uuid_create(&sesidarr[i], &stat);
assert (stat == uuid_s_ok);
}
fd = open("uuids", O_RDWR | O_CREAT);
PUT_REC(fd, (void *)fsidarr, sizeof (uuid_t) * 8, 0L);
PUT_REC(fd, (void *)sesidarr, sizeof (uuid_t) * 8, sizeof (uuid_t) * 8);
close(fd);
#endif
fd = open("uuids", O_RDONLY);
GET_REC(fd, fsidarr, sizeof (uuid_t) * 8, 0L);
GET_REC(fd, sesidarr, sizeof (uuid_t) * 8, sizeof (uuid_t) * 8);
close(fd);
#ifdef RECONS
rfd = open(sesfile, O_RDWR | O_CREAT);
fchmod(rfd, INV_PERMS);
if (fstat64(fd, &statbuf) < 0) {
perror("fstat64 session file");
return -1;
}
off = (off64_t)statbuf.st_size;
#endif
for (i = 0; i < nsess; i++) {
j = i % 8;
/*mnt = mnt_str[j];
dev = dev_str[7-j];*/
mnt = mnt_str[0];
dev = dev_str[7];
fsidp = &fsidarr[0]; /* j */
tok1 = inv_open(INV_BY_UUID, INV_SEARCH_N_MOD, fsidp);
assert (tok1 != INV_TOKEN_NULL);
uuid_create(&labelid, &stat);
uuid_to_string(&labelid, &str, &stat);
strncpy(strbuf, str, 8);
free (str);
strbuf[8] = '\0';
sprintf(label,"%s_%s (%d)\0","SESSION_LABEL", strbuf, i);
tok2 = inv_writesession_open(tok1, fsidp,
&labelid,
label,
(bool_t)i%2,
(bool_t)i%2,
dumplevel, nstreams,
time(NULL),
mnt, dev);
assert (tok2 != INV_TOKEN_NULL);
for (m = 0; m<nstreams; m++) {
tok3 = inv_stream_open(tok2,"/dev/rmt");
assert (tok3 != INV_TOKEN_NULL);
for (k = 0; k<nmedia; k++)
CREAT_mfiles(tok3, &labelid, k*100,
k*100 + 99);
inv_stream_close(tok3, BOOL_TRUE);
}
#ifdef RECONS
if (inv_get_sessioninfo(tok2, &bufp, &sz) == BOOL_TRUE) {
put_invtrecord(rfd, fsidp, sizeof(uuid_t), off,
BOOL_FALSE);
off += (off64_t)sizeof(uuid_t);
put_invtrecord(rfd, &sz, sizeof(size_t), off,
BOOL_FALSE);
off += (off64_t)sizeof(size_t);
put_invtrecord(rfd, bufp, sz, off, BOOL_FALSE);
}
#endif
#ifdef NOTDEF
if (inv_get_sessioninfo(tok2, &bufp, &sz) == BOOL_TRUE)
inv_put_sessioninfo(fsidp, bufp, sz);
#endif
inv_writesession_close(tok2);
inv_close(tok1);
}
#ifdef RECONS
close(rfd);
#endif
return 1;
}
void usage(void)
{
printf("( %s ./inv w|r|q -v <verbosity> -s <nsess>"
"-t <strms> -m <nmediafiles> \n", optarg);
}
int
mp_test(int nstreams)
{
#if 0
tok1 = inv_open(INV_BY_UUID, fsidp);
assert (tok1 != INV_TOKEN_NULL);
tok2 = inv_writesession_open(tok1, fsidp,
&labelid,
label,
(bool_t)i%2,
(bool_t)i%2,
dumplevel, nstreams,
time(NULL),
mnt, dev);
assert (tok2 != INV_TOKEN_NULL);
for (m = 0; m<nstreams; m++) {
tok3 = inv_stream_open(tok2,"/dev/rmt");
assert (tok3 != INV_TOKEN_NULL);
for (k = 0; k<nmedia; k++)
CREAT_mfiles(tok3, &labelid, k*100,
k*100 + 99);
inv_stream_close(tok3, BOOL_TRUE);
}
#endif
}
/*----------------------------------------------------------------------*/
/* */
/* */
/* */
/*----------------------------------------------------------------------*/
main(int argc, char *argv[])
{
int rval = -1, nsess = 8, nmedia = 2, nstreams = 3, level = 0;
int cc = 0;
extern char *optarg;
extern int optind;
char *uuid = NULL;
char *label = NULL;
hi op = BULL;
progname = argv[0];
sesfile = "sessions";
assert(argc > 1);
mlog_init(argc, argv);
if (! inv_DEBUG_print(argc, argv))
return 0;
optind = 1;
optarg = 0;
while((cc = getopt(argc, argv, GETOPT_CMDSTRING)) != EOF) {
switch (cc) {
case 'w':
op = WRI;
break;
case 'r':
op = REC;
break;
case 'q':
op = QUE;
break;
case 'd':
op = DEL;
break;
case 'z':
op = MP;
break;
case 'g':
op = QUE2;
break;
case 'u':
uuid = optarg;
break;
case 'L':
label = optarg;
break;
case 's':
nsess = atoi(optarg);
break;
case 'l':
level = atoi(optarg);
break;
case 't':
nstreams = atoi(optarg);
break;
case 'm':
nmedia = atoi(optarg);
break;
case 'v':
break;
case 'f':
sesfile = optarg;
break;
default:
usage();
break;
}
}
if (op == WRI)
rval = write_test(nsess, nstreams, nmedia, level);
else if (op == QUE)
rval = query_test(level);
else if (op == REC)
rval = recons_test(nsess);
else if (op == DEL)
rval = delete_test(nsess);
else if (op == MP)
rval = mp_test (nstreams);
else if (op == QUE2) {
if (uuid)
rval = sess_queries_byuuid(uuid);
else if (label)
rval = sess_queries_bylabel(label);
}
else
usage();
if (rval < 0)
printf("aborted\n");
else
printf("done\n");
}