summaryrefslogtreecommitdiffstats
path: root/lib/libdisk/tst01.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1995-04-29 04:00:57 +0000
committerphk <phk@FreeBSD.org>1995-04-29 04:00:57 +0000
commit093fd20263c83b8fbfb88a7cdb49236a80c9448a (patch)
tree11c2e7145c25cef4f5bba439fe31fdbe93c53551 /lib/libdisk/tst01.c
parentf7bf327ed4f468193062d32f7b6bb2cc4b521e9b (diff)
downloadFreeBSD-src-093fd20263c83b8fbfb88a7cdb49236a80c9448a.zip
FreeBSD-src-093fd20263c83b8fbfb88a7cdb49236a80c9448a.tar.gz
Next Iteration, getting better.
Made an All_FreeBSD() function. Added a cmd-line interface (lowest rank) to the tst01 program. The tst01 program is harmless (worst it can do is coredump), but it is instructive to run, you can see what the slice-code things of your disk...
Diffstat (limited to 'lib/libdisk/tst01.c')
-rw-r--r--lib/libdisk/tst01.c128
1 files changed, 116 insertions, 12 deletions
diff --git a/lib/libdisk/tst01.c b/lib/libdisk/tst01.c
index 9320356..8ed705a 100644
--- a/lib/libdisk/tst01.c
+++ b/lib/libdisk/tst01.c
@@ -6,32 +6,136 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * $Id$
+ * $Id: tst01.c,v 1.2 1995/04/29 01:55:25 phk Exp $
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
+#include <err.h>
+#include <readline/readline.h>
+#include <readline/history.h>
#include <sys/types.h>
#include "libdisk.h"
+CHAR_N;
+
int
main(int argc, char **argv)
{
- int i;
- struct disk *d;
+ struct disk *d,*db;
+ char myprompt[BUFSIZ];
+ char *p,*q=0;
+ char **cp,*cmds[200];
+ int ncmd,i;
- for(i=1;i<argc;i++) {
- d = Open_Disk(argv[i]);
- if (!d) continue;
- Debug_Disk(d);
- if (d->chunks->size == 1411200)
- Set_Bios_Geom(d,1024,15,63);
- else
- Set_Bios_Geom(d,2003,64,32);
+ if (argc < 2) {
+ fprintf(stderr,"Usage:\n\t%s diskname\n",argv[0]);
+ exit(1);
+ }
+ d = Open_Disk(argv[1]);
+ if (!d)
+ err(1,"Coudn't open disk %s",argv[1]);
+
+ sprintf(myprompt,"%s %s> ",argv[0],argv[1]);
+ while(1) {
+ printf("\n\n\n\n");
Debug_Disk(d);
- printf("<%s>\n",CheckRules(d));
+ p = CheckRules(d);
+ if (p) {
+ printf("%s",p);
+ free(p);
+ }
+ if (q)
+ free(q);
+ q = p = readline(myprompt);
+ if(!p)
+ break;
+ for(cp = cmds; (*cp = strsep(&p, " \t")) != NULL;)
+ if (**cp != '\0')
+ cp++;
+ ncmd = cp - cmds;
+ if(!ncmd)
+ continue;
+ if (!strcasecmp(*cmds,"quit")) { break; }
+ if (!strcasecmp(*cmds,"exit")) { break; }
+ if (!strcasecmp(*cmds,"q")) { break; }
+ if (!strcasecmp(*cmds,"x")) { break; }
+ if (!strcasecmp(*cmds,"delete") && ncmd == 2) {
+ printf("delete = %d\n",
+ Delete_Chunk(d,
+ (struct chunk *)strtol(cmds[1],0,0)));
+ continue;
+ }
+ if (!strcasecmp(*cmds,"allfreebsd")) {
+ All_FreeBSD(d);
+ continue;
+ }
+ if (!strcasecmp(*cmds,"bios") && ncmd == 4) {
+ Set_Bios_Geom(d,
+ strtol(cmds[1],0,0),
+ strtol(cmds[2],0,0),
+ strtol(cmds[3],0,0));
+ continue;
+ }
+ if (!strcasecmp(*cmds,"phys") && ncmd == 4) {
+ d = Set_Phys_Geom(d,
+ strtol(cmds[1],0,0),
+ strtol(cmds[2],0,0),
+ strtol(cmds[3],0,0));
+ continue;
+ }
+ if (!strcasecmp(*cmds,"collapse")) {
+ if (cmds[1])
+ while (Collapse_Chunk(d,
+ (struct chunk *)strtol(cmds[1],0,0)))
+ ;
+ else
+ Collapse_Disk(d);
+ continue;
+ }
+ if (!strcasecmp(*cmds,"read")) {
+ db=d;
+ if (cmds[1])
+ d = Open_Disk(cmds[1]);
+ else
+ d = Open_Disk(db->name);
+ if (!d) {
+ fprintf(stderr,"Failed to open %s\n",argv[1]);
+ d = db;
+ } else {
+ Free_Disk(db);
+ }
+ continue;
+ }
+ if (!strcasecmp(*cmds,"create") && ncmd == 6) {
+
+ printf("Create=%d\n",
+ Create_Chunk(d,
+ strtol(cmds[1],0,0),
+ strtol(cmds[2],0,0),
+ strtol(cmds[3],0,0),
+ strtol(cmds[4],0,0),
+ strtol(cmds[5],0,0)));
+ continue;
+ }
+ if (strcasecmp(*cmds,"help"))
+ printf("\007ERROR\n");
+ printf("CMDS:\n");
+ printf("\tallfreebsd\n");
+ printf("\tbios cyl hd sect\n");
+ printf("\tcollapse [pointer]\n");
+ printf("\tcreate offset size enum subtype flags\n");
+ printf("\tdelete pointer\n");
+ printf("\tphys cyl hd sect\n");
+ printf("\tquit\n");
+ printf("\tread [disk]\n");
+ printf("\nENUM:\n\t");
+ for(i=0;chunk_n[i];i++)
+ printf("%d = %s%s",i,chunk_n[i],i == 4 ? "\n\t" : " ");
+ printf("\n");
+
}
exit (0);
}
OpenPOWER on IntegriCloud