14 void dbg_dump_sector(int sec
);
15 void dbg_dump_buffer(unsigned char *buf
, int len
, int offset
);
16 void dbg_console(void);
18 void mutex_init(struct mutex
* l
) {}
19 void mutex_lock(struct mutex
* l
) {}
20 void mutex_unlock(struct mutex
* l
) {}
22 void panicf( char *fmt
, ...)
26 fprintf(stderr
,"***PANIC*** ");
27 vfprintf(stderr
, fmt
, ap
);
32 void debugf(const char *fmt
, ...)
36 fprintf(stderr
,"DEBUGF: ");
37 vfprintf( stderr
, fmt
, ap
);
41 void ldebugf(const char* file
, int line
, const char *fmt
, ...)
45 fprintf( stderr
, "%s:%d ", file
, line
);
46 vfprintf( stderr
, fmt
, ap
);
50 void dbg_dump_sector(int sec
)
52 unsigned char buf
[512];
54 storage_read_sectors(sec
,1,buf
);
55 DEBUGF("---< Sector %d >-----------------------------------------\n", sec
);
56 dbg_dump_buffer(buf
, 512, 0);
59 void dbg_dump_buffer(unsigned char *buf
, int len
, int offset
)
63 unsigned char ascii
[33];
65 for(i
= 0;i
< len
/16;i
++)
67 DEBUGF("%03x: ", i
*16 + offset
);
84 DEBUGF("%s\n", ascii
);
88 void dbg_dir(char* currdir
)
93 dir
= opendir(currdir
);
96 while ( (entry
= readdir(dir
)) ) {
97 DEBUGF("%15s %lx\n", entry
->d_name
, entry
->startcluster
);
103 DEBUGF( "Could not open dir %s\n", currdir
);
110 int dbg_mkfile(char* name
, int num
)
112 char text
[BUFSIZE
+1];
118 fd
= creat(name
,O_WRONLY
);
120 DEBUGF("Failed creating file\n");
126 int len
= num
> BUFSIZE
? BUFSIZE
: num
;
128 for (i
=0; i
<len
/CHUNKSIZE
; i
++ )
129 sprintf(text
+i
*CHUNKSIZE
,"%c%06x,",name
[1],x
++);
131 rc
= write(fd
, text
, len
);
133 DEBUGF("Failed writing data\n");
138 DEBUGF("No space left\n");
142 DEBUGF("wrote %d bytes\n",rc
);
150 /* add a random number of chunks to test byte-copy code */
151 num
= ((int) rand() % SECTOR_SIZE
) & ~7;
152 LDEBUGF("Adding random size %d\n",num
);
161 int dbg_chkfile(char* name
, int size
)
168 int fd
= open(name
,O_RDONLY
);
170 DEBUGF("Failed opening file\n");
174 size
= lseek(fd
, 0, SEEK_END
);
175 DEBUGF("File is %d bytes\n", size
);
176 /* random start position */
178 pos
= ((int)rand() % size
) & ~7;
179 lseek(fd
, pos
, SEEK_SET
);
182 LDEBUGF("Check base is %x (%d)\n",x
,pos
);
185 int rc
= read(fd
, text
, sizeof text
);
186 DEBUGF("read %d bytes\n",rc
);
188 panicf("Failed reading data\n");
191 char tmp
[CHUNKSIZE
+1];
194 for (i
=0; i
<rc
/CHUNKSIZE
; i
++ ) {
195 sprintf(tmp
,"%c%06x,",name
[1],x
++);
196 if (strncmp(text
+i
*CHUNKSIZE
,tmp
,CHUNKSIZE
)) {
197 int idx
= pos
+ block
*sizeof(text
) + i
*CHUNKSIZE
;
198 DEBUGF("Mismatch in byte 0x%x (byte 0x%x of sector 0x%x)."
199 "\nExpected %.8s found %.8s\n",
200 idx
, idx
% SECTOR_SIZE
, idx
/ SECTOR_SIZE
,
203 DEBUGF("i=%x, idx=%x\n",i
,idx
);
204 dbg_dump_buffer(text
+i
*CHUNKSIZE
- 0x20, 0x40, idx
- 0x20);
215 int dbg_wrtest(char* name
)
223 char tmp
[CHUNKSIZE
+1];
225 fd
= open(name
,O_RDWR
);
227 DEBUGF("Failed opening file\n");
231 size
= lseek(fd
, 0, SEEK_END
);
232 DEBUGF("File is %d bytes\n", size
);
233 /* random start position */
235 pos
= ((int)rand() % size
) & ~7;
236 rc
= lseek(fd
, pos
, SEEK_SET
);
238 panicf("Failed seeking\n");
240 LDEBUGF("Check base is %x (%d)\n",x
,pos
);
242 sprintf(tmp
,"%c%06x,",name
[1],x
++);
243 rc
= write(fd
, tmp
, 8);
245 panicf("Failed writing data\n");
248 pos
= ((int)rand() % size
) & ~7;
249 rc
= lseek(fd
, pos
, SEEK_SET
);
251 panicf("Failed seeking\n");
253 LDEBUGF("Check base 2 is %x (%d)\n",x
,pos
);
256 rc
= read(fd
, text
, sizeof text
);
257 DEBUGF("read %d bytes\n",rc
);
259 panicf("Failed reading data\n");
264 for (i
=0; i
<rc
/CHUNKSIZE
; i
++ ) {
265 sprintf(tmp
,"%c%06x,",name
[1],x
++);
266 if (strncmp(text
+i
*CHUNKSIZE
,tmp
,CHUNKSIZE
)) {
267 int idx
= pos
+ block
*sizeof(text
) + i
*CHUNKSIZE
;
268 DEBUGF("Mismatch in byte 0x%x (byte 0x%x of sector 0x%x)."
269 "\nExpected %.8s found %.8s\n",
270 idx
, idx
% SECTOR_SIZE
, idx
/ SECTOR_SIZE
,
273 DEBUGF("i=%x, idx=%x\n",i
,idx
);
274 dbg_dump_buffer(text
+i
*CHUNKSIZE
- 0x20, 0x40, idx
- 0x20);
285 void dbg_type(char* name
)
287 const int size
= SECTOR_SIZE
*5;
288 unsigned char buf
[SECTOR_SIZE
*5+1];
291 fd
= open(name
,O_RDONLY
);
294 DEBUGF("Got file descriptor %d\n",fd
);
297 rc
= read(fd
, buf
, size
);
301 printf("%d: %.*s\n", rc
, rc
, buf
);
303 else if ( rc
== 0 ) {
309 DEBUGF("Failed reading file: %d\n",rc
);
316 int dbg_append(char* name
)
320 char tmp
[CHUNKSIZE
+1];
322 fd
= open(name
,O_RDONLY
);
324 DEBUGF("Failed opening file\n");
328 size
= lseek(fd
, 0, SEEK_END
);
329 DEBUGF("File is %d bytes\n", size
);
330 x
= size
/ CHUNKSIZE
;
331 LDEBUGF("Check base is %x (%d)\n",x
,size
);
336 fd
= open(name
,O_RDWR
|O_APPEND
);
338 DEBUGF("Failed opening file\n");
342 sprintf(tmp
,"%c%06x,",name
[1],x
++);
343 rc
= write(fd
, tmp
, 8);
345 panicf("Failed writing data\n");
350 int dbg_test(char* name
)
355 char text
[BUFSIZE
+1];
357 for (j
=0; j
<5; j
++) {
360 fd
= open(name
,O_WRONLY
|O_CREAT
|O_APPEND
, 0666);
362 DEBUGF("Failed opening file\n");
368 int len
= num
> BUFSIZE
? BUFSIZE
: num
;
370 for (i
=0; i
<len
/CHUNKSIZE
; i
++ )
371 sprintf(text
+i
*CHUNKSIZE
,"%c%06x,",name
[1],x
++);
373 rc
= write(fd
, text
, len
);
375 DEBUGF("Failed writing data\n");
380 DEBUGF("No space left\n");
384 DEBUGF("wrote %d bytes\n",rc
);
396 int dbg_dump(char* name
, int offset
)
398 char buf
[SECTOR_SIZE
];
401 int fd
= open(name
,O_RDONLY
);
403 DEBUGF("Failed opening file\n");
406 lseek(fd
, offset
, SEEK_SET
);
407 rc
= read(fd
, buf
, sizeof buf
);
410 panicf("Error reading data\n");
415 dbg_dump_buffer(buf
, rc
, offset
);
420 void dbg_tail(char* name
)
422 unsigned char buf
[SECTOR_SIZE
*5];
425 fd
= open(name
,O_RDONLY
);
428 DEBUGF("Got file descriptor %d\n",fd
);
430 rc
= lseek(fd
,-512,SEEK_END
);
432 rc
= read(fd
, buf
, SECTOR_SIZE
);
436 printf("%d:\n%s\n", (int)strlen(buf
), buf
);
438 else if ( rc
== 0 ) {
443 DEBUGF("Failed reading file: %d\n",rc
);
453 int dbg_head(char* name
)
455 unsigned char buf
[SECTOR_SIZE
*5];
458 fd
= open(name
,O_RDONLY
);
461 DEBUGF("Got file descriptor %d\n",fd
);
463 rc
= read(fd
, buf
, SECTOR_SIZE
*3);
467 printf("%d:\n%s\n", (int)strlen(buf
), buf
);
469 else if ( rc
== 0 ) {
474 DEBUGF("Failed reading file: %d\n",rc
);
480 int dbg_trunc(char* name
, int size
)
485 fd
= open(name
,O_RDWR
);
489 rc
= ftruncate(fd
, size
);
491 DEBUGF("ftruncate(%d) failed\n", size
);
496 fd
= open(name
,O_RDWR
|O_TRUNC
);
500 rc
= lseek(fd
, size
, SEEK_SET
);
508 int dbg_mkdir(char* name
)
514 DEBUGF("Failed creating directory\n");
520 int dbg_cmd(int argc
, char *argv
[])
536 DEBUGF("usage: fat command [options]\n"
539 " ds <sector> - display sector\n"
543 " mkfile <file> <size (KB)>\n"
547 " dump <file> <offset>\n"
549 " trunc <file> <size>\n"
553 " ren <file> <newname>\n"
558 if (!strcasecmp(cmd
, "dir"))
566 if (!strcasecmp(cmd
, "ds"))
569 DEBUGF("secnum: %ld\n", strtol(arg1
, NULL
, 0));
570 dbg_dump_sector(strtol(arg1
, NULL
, 0));
574 if (!strcasecmp(cmd
, "type"))
580 if (!strcasecmp(cmd
, "head"))
583 return dbg_head(arg1
);
586 if (!strcasecmp(cmd
, "tail"))
592 if (!strcasecmp(cmd
, "mkfile"))
596 return dbg_mkfile(arg1
,strtol(arg2
, NULL
, 0));
598 return dbg_mkfile(arg1
,1);
602 if (!strcasecmp(cmd
, "chkfile"))
606 return dbg_chkfile(arg1
, strtol(arg2
, NULL
, 0));
608 return dbg_chkfile(arg1
, 0);
612 if (!strcasecmp(cmd
, "mkdir"))
615 return dbg_mkdir(arg1
);
619 if (!strcasecmp(cmd
, "del"))
625 if (!strcasecmp(cmd
, "rmdir"))
631 if (!strcasecmp(cmd
, "dump"))
635 return dbg_dump(arg1
, strtol(arg2
, NULL
, 0));
637 return dbg_dump(arg1
, 0);
641 if (!strcasecmp(cmd
, "wrtest"))
644 return dbg_wrtest(arg1
);
647 if (!strcasecmp(cmd
, "append"))
650 return dbg_append(arg1
);
653 if (!strcasecmp(cmd
, "test"))
656 return dbg_test(arg1
);
659 if (!strcasecmp(cmd
, "trunc"))
662 return dbg_trunc(arg1
, strtol(arg2
, NULL
, 0));
665 if (!strcasecmp(cmd
, "ren"))
668 return rename(arg1
, arg2
);
674 extern void ata_exit(void);
676 int main(int argc
, char *argv
[])
679 struct partinfo
* pinfo
;
684 DEBUGF("*** Warning! The disk is uninitialized\n");
689 DEBUGF("*** Failed reading partitions\n");
693 for ( i
=0; i
<4; i
++ ) {
694 if ( pinfo
[i
].type
== PARTITION_TYPE_FAT32
695 #ifdef HAVE_FAT16SUPPORT
696 || pinfo
[i
].type
== PARTITION_TYPE_FAT16
699 DEBUGF("*** Mounting at block %ld\n",pinfo
[i
].start
);
700 rc
= fat_mount(IF_MV2(0,) IF_MD2(0,) pinfo
[i
].start
);
702 DEBUGF("mount: %d",rc
);
709 if(fat_mount(IF_MV2(0,) IF_MD2(0,) 0)) {
710 DEBUGF("No FAT32 partition!");
715 rc
= dbg_cmd(argc
, argv
);
720 DEBUGF("Return code: %d\n", rc
);