Lazy mode possibility to add additional, fs dependent commands to the shell;
removed BFS specific command(s). Cleaned up the file a bit. Removed Debug.h - it was a leftover from the BFS shell. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2962 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
9767c7befd
commit
138a8c079e
@ -1,100 +0,0 @@
|
|||||||
#ifndef DEBUG_H
|
|
||||||
#define DEBUG_H
|
|
||||||
/* Debug - debug stuff
|
|
||||||
**
|
|
||||||
** Initial version by Axel Dörfler, axeld@pinc-software.de
|
|
||||||
** This file may be used under the terms of the OpenBeOS License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
# include <string.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USER
|
|
||||||
# include <stdio.h>
|
|
||||||
# define __out printf
|
|
||||||
#else
|
|
||||||
# define __out dprintf
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Which debugger should be used when?
|
|
||||||
// The DEBUGGER() macro actually has no effect if DEBUG is not defined,
|
|
||||||
// use the DIE() macro if you really want to die.
|
|
||||||
#ifdef DEBUG
|
|
||||||
# ifdef USER
|
|
||||||
# define DEBUGGER(x) debugger x
|
|
||||||
# else
|
|
||||||
# define DEBUGGER(x) kernel_debugger x
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define DEBUGGER(x) ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USER
|
|
||||||
# define DIE(x) debugger x
|
|
||||||
#else
|
|
||||||
# define DIE(x) kernel_debugger x
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Short overview over the debug output macros:
|
|
||||||
// PRINT()
|
|
||||||
// is for general messages that very unlikely should appear in a release build
|
|
||||||
// FATAL()
|
|
||||||
// this is for fatal messages, when something has really gone wrong
|
|
||||||
// INFORM()
|
|
||||||
// general information, as disk size, etc.
|
|
||||||
// REPORT_ERROR(status_t)
|
|
||||||
// prints out error information
|
|
||||||
// RETURN_ERROR(status_t)
|
|
||||||
// calls REPORT_ERROR() and return the value
|
|
||||||
// D()
|
|
||||||
// the statements in D() are only included if DEBUG is defined
|
|
||||||
|
|
||||||
#include <KernelExport.h>
|
|
||||||
#define kprintf printf
|
|
||||||
#define dprintf printf
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
#define PRINT(x) { __out("bfs: "); __out x; }
|
|
||||||
#define REPORT_ERROR(status) __out("bfs: %s:%s:%ld: %s\n", __FILE__, __FUNCTION__, __LINE__, strerror(status));
|
|
||||||
#define RETURN_ERROR(err) { status_t _status = err; if (_status < B_OK) REPORT_ERROR(_status); return _status;}
|
|
||||||
#define FATAL(x) { __out("bfs: "); __out x; }
|
|
||||||
#define INFORM(x) { __out("bfs: "); __out x; }
|
|
||||||
#define FUNCTION() __out("bfs: %s()\n",__FUNCTION__);
|
|
||||||
#define FUNCTION_START(x) { __out("bfs: %s() ",__FUNCTION__); __out x; }
|
|
||||||
// #define FUNCTION() ;
|
|
||||||
// #define FUNCTION_START(x) ;
|
|
||||||
#define D(x) {x;};
|
|
||||||
#define ASSERT(x) { if (!(x)) DEBUGGER(("bfs: assert failed: " #x "\n")); }
|
|
||||||
#else
|
|
||||||
#define PRINT(x) ;
|
|
||||||
#define REPORT_ERROR(status) ;
|
|
||||||
#define RETURN_ERROR(status) return status;
|
|
||||||
#define FATAL(x) { __out("bfs: "); __out x; }
|
|
||||||
#define INFORM(x) { __out("bfs: "); __out x; }
|
|
||||||
#define FUNCTION() ;
|
|
||||||
#define FUNCTION_START(x) ;
|
|
||||||
#define D(x) ;
|
|
||||||
#define ASSERT(x) ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
struct block_run;
|
|
||||||
struct bplustree_header;
|
|
||||||
struct bplustree_node;
|
|
||||||
struct data_stream;
|
|
||||||
struct bfs_inode;
|
|
||||||
struct disk_super_block;
|
|
||||||
class Volume;
|
|
||||||
|
|
||||||
// some structure dump functions
|
|
||||||
extern void dump_block_run(const char *prefix, block_run &run);
|
|
||||||
extern void dump_super_block(disk_super_block *superBlock);
|
|
||||||
extern void dump_data_stream(data_stream *stream);
|
|
||||||
extern void dump_inode(bfs_inode *inode);
|
|
||||||
extern void dump_bplustree_header(bplustree_header *header);
|
|
||||||
extern void dump_bplustree_node(bplustree_node *node,bplustree_header *header = NULL,Volume *volume = NULL);
|
|
||||||
extern void dump_block(const char *buffer, int size);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* DEBUG_H */
|
|
@ -468,83 +468,6 @@ do_dir(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#include "bfs_control.h"
|
|
||||||
|
|
||||||
static void
|
|
||||||
do_chkbfs(int argc, char **argv)
|
|
||||||
{
|
|
||||||
struct check_control result;
|
|
||||||
off_t files = 0, directories = 0, indices = 0, attributeDirectories = 0, attributes = 0;
|
|
||||||
int counter = 0;
|
|
||||||
|
|
||||||
int fd = sys_open(1, -1, "/myfs/.", O_RDONLY, S_IFREG, 0);
|
|
||||||
if (fd < 0) {
|
|
||||||
printf("chkbfs: error opening '.'\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&result, 0, sizeof(result));
|
|
||||||
result.flags = argc > 1 ? BFS_FIX_BITMAP_ERRORS : 0;
|
|
||||||
if (argc > 2) {
|
|
||||||
printf("will fix any severe errors!\n");
|
|
||||||
result.flags |= BFS_REMOVE_WRONG_TYPES | BFS_REMOVE_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
// start checking
|
|
||||||
if ((sys_ioctl(1, fd, BFS_IOCTL_START_CHECKING, &result, sizeof(result))) < 0) {
|
|
||||||
printf("chkbfs: error starting!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// check all files and report errors
|
|
||||||
while (sys_ioctl(1, fd, BFS_IOCTL_CHECK_NEXT_NODE, &result, sizeof(result)) == B_OK) {
|
|
||||||
if (++counter % 50 == 0)
|
|
||||||
printf(" %7ld nodes processed\x1b[1A\n", counter);
|
|
||||||
|
|
||||||
if (result.errors) {
|
|
||||||
printf("%s (inode = %Ld)", result.name, result.inode);
|
|
||||||
if (result.errors & BFS_MISSING_BLOCKS)
|
|
||||||
printf(", some blocks weren't allocated");
|
|
||||||
if (result.errors & BFS_BLOCKS_ALREADY_SET)
|
|
||||||
printf(", has blocks already set");
|
|
||||||
if (result.errors & BFS_INVALID_BLOCK_RUN)
|
|
||||||
printf(", has invalid block run(s)");
|
|
||||||
if (result.errors & BFS_COULD_NOT_OPEN)
|
|
||||||
printf(", could not be opened");
|
|
||||||
if (result.errors & BFS_WRONG_TYPE)
|
|
||||||
printf(", has wrong type");
|
|
||||||
if (result.errors & BFS_NAMES_DONT_MATCH)
|
|
||||||
printf(", names don't match");
|
|
||||||
putchar('\n');
|
|
||||||
}
|
|
||||||
if ((result.mode & (S_INDEX_DIR | 0777)) == S_INDEX_DIR)
|
|
||||||
indices++;
|
|
||||||
else if (result.mode & S_ATTR_DIR)
|
|
||||||
attributeDirectories++;
|
|
||||||
else if (result.mode & S_ATTR)
|
|
||||||
attributes++;
|
|
||||||
else if (result.mode & S_IFDIR)
|
|
||||||
directories++;
|
|
||||||
else
|
|
||||||
files++;
|
|
||||||
}
|
|
||||||
if (result.status != B_ENTRY_NOT_FOUND)
|
|
||||||
printf("chkbfs: error occured during scan: %s\n", strerror(result.status));
|
|
||||||
|
|
||||||
// stop checking
|
|
||||||
if ((sys_ioctl(1, fd, BFS_IOCTL_STOP_CHECKING, &result, sizeof(result))) < 0) {
|
|
||||||
printf("chkbfs: error stopping!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("checked %ld nodes, %Ld blocks not allocated, %Ld blocks already set, %Ld blocks could be freed\n",
|
|
||||||
counter, result.stats.missing, result.stats.already_set, result.stats.freed);
|
|
||||||
printf("\tfiles\t\t%Ld\n\tdirectories\t%Ld\n\tattributes\t%Ld\n\tattr. dirs\t%Ld\n\tindices\t\t%Ld\n",
|
|
||||||
files, directories, attributes, attributeDirectories, indices);
|
|
||||||
if (result.flags & BFS_FIX_BITMAP_ERRORS)
|
|
||||||
printf("errors have been fixed\n");
|
|
||||||
|
|
||||||
sys_close(1, fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_ioctl(int argc, char **argv)
|
do_ioctl(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -642,7 +565,6 @@ do_rmall(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_trunc(int argc, char **argv)
|
do_trunc(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -666,8 +588,6 @@ do_trunc(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_seek(int argc, char **argv)
|
do_seek(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -986,19 +906,18 @@ do_copytest(int argc, char **argv)
|
|||||||
} else if (argc == 2)
|
} else if (argc == 2)
|
||||||
fromPath = argv[1];
|
fromPath = argv[1];
|
||||||
else
|
else
|
||||||
printf("copying from: %s\n",fromPath);
|
printf("copying from: %s\n", fromPath);
|
||||||
|
|
||||||
copydir(fromPath,"/myfs");
|
copydir(fromPath, "/myfs");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int32
|
static int32
|
||||||
copydirthread(void *data)
|
copydirthread(void *data)
|
||||||
{
|
{
|
||||||
char *args[] = {"cptest",(char *)data,NULL};
|
char *args[] = {"cptest", (char *)data, NULL};
|
||||||
char stack_filler[256*1024 - 0 * 1024];
|
|
||||||
|
|
||||||
do_copytest(2,args);
|
do_copytest(2, args);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1006,11 +925,11 @@ copydirthread(void *data)
|
|||||||
static void
|
static void
|
||||||
do_threadtest(int argc, char **argv)
|
do_threadtest(int argc, char **argv)
|
||||||
{
|
{
|
||||||
char *paths[] = {"/boot/home/mail/pinc - axeld/in","/boot/home/mail/pinc - axeld/out",NULL};
|
char *paths[] = {"/boot/home/mail/pinc - axeld/in", "/boot/home/mail/pinc - axeld/out", NULL};
|
||||||
int32 i;
|
int32 i;
|
||||||
|
|
||||||
for (i = 0;paths[i] != NULL;i++) {
|
for (i = 0; paths[i] != NULL; i++) {
|
||||||
thread_id thread = spawn_thread(copydirthread,"copythread",B_NORMAL_PRIORITY,paths[i]);
|
thread_id thread = spawn_thread(copydirthread, "copythread", B_NORMAL_PRIORITY, paths[i]);
|
||||||
resume_thread(thread);
|
resume_thread(thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1024,13 +943,13 @@ int32 gCopyNum;
|
|||||||
static int32
|
static int32
|
||||||
copyfilethread(void *data)
|
copyfilethread(void *data)
|
||||||
{
|
{
|
||||||
char *args[] = {"cp",(char *)data,NULL,NULL};
|
char *args[] = {"cp", (char *)data, NULL, NULL};
|
||||||
|
|
||||||
char name[32];
|
char name[32];
|
||||||
sprintf(name,"target%ld",gCopyNum++);
|
sprintf(name, "target%ld", gCopyNum++);
|
||||||
args[2] = name;
|
args[2] = name;
|
||||||
|
|
||||||
do_copy(3,args);
|
do_copy(3, args);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1235,7 +1154,6 @@ do_cio(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mkfile(char *s, int sz)
|
mkfile(char *s, int sz)
|
||||||
{
|
{
|
||||||
@ -1296,8 +1214,6 @@ do_lat_fs(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_create(int argc, char **argv)
|
do_create(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -1324,6 +1240,7 @@ do_create(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_delete(int argc, char **argv)
|
do_delete(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -1331,7 +1248,7 @@ do_delete(int argc, char **argv)
|
|||||||
char name[64];
|
char name[64];
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
iter =strtoul(&argv[1][0], NULL, 0);
|
iter = strtoul(&argv[1][0], NULL, 0);
|
||||||
|
|
||||||
for (j = 0; j < iter; ++j) {
|
for (j = 0; j < iter; ++j) {
|
||||||
sprintf(name, "/myfs/test/%.5d", j);
|
sprintf(name, "/myfs/test/%.5d", j);
|
||||||
@ -1342,6 +1259,8 @@ do_delete(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#include "additional_commands.c"
|
||||||
|
|
||||||
|
|
||||||
static void do_help(int argc, char **argv);
|
static void do_help(int argc, char **argv);
|
||||||
|
|
||||||
@ -1385,8 +1304,11 @@ cmd_entry fsh_cmds[] =
|
|||||||
{ "cptest", do_copytest, "copies all files from the given path" },
|
{ "cptest", do_copytest, "copies all files from the given path" },
|
||||||
{ "threads", do_threadtest, "copies several files, and does a lat_fs simulaneously" },
|
{ "threads", do_threadtest, "copies several files, and does a lat_fs simulaneously" },
|
||||||
{ "mfile", do_threadfiletest, "copies several big files simulaneously" },
|
{ "mfile", do_threadfiletest, "copies several big files simulaneously" },
|
||||||
{ "chkbfs", do_chkbfs, "does a chkbfs on the volume" },
|
|
||||||
{ "cio", do_cio, "does a I/O speed test" },
|
{ "cio", do_cio, "does a I/O speed test" },
|
||||||
|
|
||||||
|
// additional commands from the file system will be included here
|
||||||
|
# include "additional_commands.h"
|
||||||
|
|
||||||
{ "help", do_help, "print this help message" },
|
{ "help", do_help, "print this help message" },
|
||||||
{ "?", do_help, "print this help message" },
|
{ "?", do_help, "print this help message" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
@ -1399,7 +1321,7 @@ do_help(int argc, char **argv)
|
|||||||
cmd_entry *cmd;
|
cmd_entry *cmd;
|
||||||
|
|
||||||
printf("commands fsh understands:\n");
|
printf("commands fsh understands:\n");
|
||||||
for(cmd=fsh_cmds; cmd->name != NULL; cmd++) {
|
for (cmd = fsh_cmds; cmd->name != NULL; cmd++) {
|
||||||
printf("%8s - %s\n", cmd->name, cmd->help);
|
printf("%8s - %s\n", cmd->name, cmd->help);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1416,8 +1338,10 @@ getline(char *prompt, char *input, int len)
|
|||||||
static void
|
static void
|
||||||
do_fsh(void)
|
do_fsh(void)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
char stack_filler[1024 * 1024 * 16 - 32 * 1024];
|
char stack_filler[1024 * 1024 * 16 - 32 * 1024];
|
||||||
// actually emulating 12kB stack size (BeOS has 16 MB - ~20kB for the main thread)
|
// actually emulating 12kB stack size (BeOS has 16 MB - ~20kB for the main thread)
|
||||||
|
#endif
|
||||||
int argc, len;
|
int argc, len;
|
||||||
char *prompt = "fsh>> ";
|
char *prompt = "fsh>> ";
|
||||||
char input[512], **argv;
|
char input[512], **argv;
|
||||||
|
Loading…
Reference in New Issue
Block a user