diff options
Diffstat (limited to 'main/common/tfscli.c')
-rw-r--r-- | main/common/tfscli.c | 1626 |
1 files changed, 819 insertions, 807 deletions
diff --git a/main/common/tfscli.c b/main/common/tfscli.c index 754d20c..4481e8a 100644 --- a/main/common/tfscli.c +++ b/main/common/tfscli.c @@ -1,7 +1,7 @@ /************************************************************************** * * Copyright (c) 2013 Alcatel-Lucent - * + * * Alcatel Lucent licenses this file to You under the Apache License, * Version 2.0 (the "License"); you may not use this file except in * compliance with the License. A copy of the License is contained the @@ -41,899 +41,911 @@ static void tfsprflags(long flags, int verbose) { - struct tfsflg *tfp; - - if (verbose) - printf(" Flags: "); - tfp = tfsflgtbl; - while(tfp->sdesc) { - if ((flags & tfp->mask) == tfp->flag) { - if (verbose) { - printf("%s", tfp->ldesc); - if ((tfp+1)->flag) - printf(", "); - } - else - putchar(tfp->sdesc); - } - tfp++; - } - if (!(flags & TFS_NSTALE)) - printf("stale"); - - if (verbose) - printf("\n"); + struct tfsflg *tfp; + + if(verbose) { + printf(" Flags: "); + } + tfp = tfsflgtbl; + while(tfp->sdesc) { + if((flags & tfp->mask) == tfp->flag) { + if(verbose) { + printf("%s", tfp->ldesc); + if((tfp+1)->flag) { + printf(", "); + } + } else { + putchar(tfp->sdesc); + } + } + tfp++; + } + if(!(flags & TFS_NSTALE)) { + printf("stale"); + } + + if(verbose) { + printf("\n"); + } } static char * tfsmodebtoa(ulong mode,char *buf) { - char *pipe, *bp; - - pipe = ""; - bp = buf; - *bp = 0; - if (mode & TFS_RDONLY) { - bp += sprintf(bp,"rdonly"); - pipe = "|"; - } - if (mode & TFS_CREATE) { - bp += sprintf(bp,"%screate",pipe); - pipe = "|"; - } - if (mode & TFS_APPEND) - sprintf(bp,"%sappend",pipe); - - return(buf); + char *pipe, *bp; + + pipe = ""; + bp = buf; + *bp = 0; + if(mode & TFS_RDONLY) { + bp += sprintf(bp,"rdonly"); + pipe = "|"; + } + if(mode & TFS_CREATE) { + bp += sprintf(bp,"%screate",pipe); + pipe = "|"; + } + if(mode & TFS_APPEND) { + sprintf(bp,"%sappend",pipe); + } + + return(buf); } /* tfsld(): - * If the filename specified is AOUT, COFF or ELF, then load it. + * If the filename specified is AOUT, COFF or ELF, then load it. */ static int tfsld(char *name,int verbose,char *sname,int verifyonly) { - int err; - TFILE *fp; - - err = TFS_OKAY; - fp = tfsstat(name); - - if (!fp) - return (TFSERR_NOFILE); - - if (TFS_USRLVL(fp) > getUsrLvl()) - return(TFSERR_USERDENIED); - - if (fp->flags & TFS_EBIN) { - long entry; - - err = tfsloadebin(fp,verbose,&entry,sname,verifyonly); - if (err == TFS_OKAY) { - char buf[16]; - sprintf(buf,"0x%lx",entry); - setenv("ENTRYPOINT",buf); - } - else - setenv("ENTRYPOINT",0); - } - else { - err = TFSERR_NOTEXEC; - } - - return(err); + int err; + TFILE *fp; + + err = TFS_OKAY; + fp = tfsstat(name); + + if(!fp) { + return (TFSERR_NOFILE); + } + + if(TFS_USRLVL(fp) > getUsrLvl()) { + return(TFSERR_USERDENIED); + } + + if(fp->flags & TFS_EBIN) { + long entry; + + err = tfsloadebin(fp,verbose,&entry,sname,verifyonly); + if(err == TFS_OKAY) { + char buf[16]; + sprintf(buf,"0x%lx",entry); + setenv("ENTRYPOINT",buf); + } else { + setenv("ENTRYPOINT",0); + } + } else { + err = TFSERR_NOTEXEC; + } + + return(err); } /* listfilter(): - * If the incoming filename (fname) passes the incoming filter, then - * return 1; else return 0. + * If the incoming filename (fname) passes the incoming filter, then + * return 1; else return 0. * - * Examples: - * if filter is "*.html" and fname is "index.html" return 1. - * if filter is "dir SLASH ASTERISK" and fname is "dir/abc" return 1. - * if filter is "abc" and fname is "abc" return 1. + * Examples: + * if filter is "*.html" and fname is "index.html" return 1. + * if filter is "dir SLASH ASTERISK" and fname is "dir/abc" return 1. + * if filter is "abc" and fname is "abc" return 1. * - * Notes: - * * A valid filter will have the asterisk as either the first or last - * character of the filter. If first, assume filter is a suffix, - * if last (or none at all), assume filter is a prefix. - * * If there is an asterisk in the middle of the filter, it is chopped - * at the asterisk without warning. + * Notes: + * * A valid filter will have the asterisk as either the first or last + * character of the filter. If first, assume filter is a suffix, + * if last (or none at all), assume filter is a prefix. + * * If there is an asterisk in the middle of the filter, it is chopped + * at the asterisk without warning. */ static int listfilter(char *filter,char *fname) { - int flen; - char *prefix, *suffix, *asterisk, *sp; - - if (!filter) /* No filter means match everything. */ - return(1); - - flen = 0; - prefix = suffix = (char *)0; - asterisk = strchr(filter,'*'); - - /* If no asterisk, then just compare filter to fname... */ - if (!asterisk) { - if (!strcmp(filter,fname)) - return(1); - } - else if (asterisk == filter) { - suffix = asterisk+1; - flen = strlen(suffix); - sp = fname + strlen(fname) - flen; - if (!strcmp(suffix,sp)) - return(1); - } - else { - *asterisk = 0; - prefix = filter; - flen = strlen(prefix); - if (!strncmp(prefix,fname,flen)) { - *asterisk = '*'; - return(1); - } - *asterisk = '*'; - } - return(0); + int flen; + char *prefix, *suffix, *asterisk, *sp; + + if(!filter) { /* No filter means match everything. */ + return(1); + } + + flen = 0; + prefix = suffix = (char *)0; + asterisk = strchr(filter,'*'); + + /* If no asterisk, then just compare filter to fname... */ + if(!asterisk) { + if(!strcmp(filter,fname)) { + return(1); + } + } else if(asterisk == filter) { + suffix = asterisk+1; + flen = strlen(suffix); + sp = fname + strlen(fname) - flen; + if(!strcmp(suffix,sp)) { + return(1); + } + } else { + *asterisk = 0; + prefix = filter; + flen = strlen(prefix); + if(!strncmp(prefix,fname,flen)) { + *asterisk = '*'; + return(1); + } + *asterisk = '*'; + } + return(0); } -/* tfsvlist(): verbose list... - * Display all files currently stored. Do not put them in alphabetical - * order; display them as they are physically listed in the file system. - * Display complete structure of file header for each file. - * Note1: This version of file listing is only called if "tfs -vv ls" - * or "tfs -vvv ls" is called. The first level of verbosity is handled - * by tfsqlist to simply display the "dot" files. +/* tfsvlist(): verbose list... + * Display all files currently stored. Do not put them in alphabetical + * order; display them as they are physically listed in the file system. + * Display complete structure of file header for each file. + * Note1: This version of file listing is only called if "tfs -vv ls" + * or "tfs -vvv ls" is called. The first level of verbosity is handled + * by tfsqlist to simply display the "dot" files. */ static int tfsvlist(char *filter[], int verbose, int more) { - TDEV *tdp; - TFILE *fp; - int tot, sizetot; - char tbuf[32], **fltrptr; - - tot = 0; - sizetot = 0; - for(tdp=tfsDeviceTbl;tdp->start != TFSEOT;tdp++) { - fltrptr = filter; - while(1) { - fp = (TFILE *)tdp->start; - while(validtfshdr(fp)) { - - if ((TFS_DELETED(fp)) && (verbose < 3)) { - fp = nextfp(fp,tdp); - continue; - } - if (!listfilter(*fltrptr,TFS_NAME(fp))) { - fp = nextfp(fp,tdp); - continue; - } - if ((fp->flags & TFS_UNREAD) && (TFS_USRLVL(fp)>getUsrLvl())) { - fp = nextfp(fp,tdp); - continue; - } - printf(" Name: '%s'%s\n", - fp->name,TFS_DELETED(fp) ? " (deleted)" : ""); - printf(" Info: '%s'\n", fp->info); - if (TFS_FILEEXISTS(fp)) - tfsprflags(fp->flags, 1); - printf(" Addr: 0x%lx (hdr @ 0x%lx, nxtptr = 0x%lx)\n", - (ulong)(TFS_BASE(fp)),(ulong)fp,(ulong)(fp->next)); - printf(" Size: %ld bytes (crc=0x%lx)", - fp->filsize,fp->filcrc); + TDEV *tdp; + TFILE *fp; + int tot, sizetot; + char tbuf[32], **fltrptr; + + tot = 0; + sizetot = 0; + for(tdp=tfsDeviceTbl; tdp->start != TFSEOT; tdp++) { + fltrptr = filter; + while(1) { + fp = (TFILE *)tdp->start; + while(validtfshdr(fp)) { + + if((TFS_DELETED(fp)) && (verbose < 3)) { + fp = nextfp(fp,tdp); + continue; + } + if(!listfilter(*fltrptr,TFS_NAME(fp))) { + fp = nextfp(fp,tdp); + continue; + } + if((fp->flags & TFS_UNREAD) && (TFS_USRLVL(fp)>getUsrLvl())) { + fp = nextfp(fp,tdp); + continue; + } + printf(" Name: '%s'%s\n", + fp->name,TFS_DELETED(fp) ? " (deleted)" : ""); + printf(" Info: '%s'\n", fp->info); + if(TFS_FILEEXISTS(fp)) { + tfsprflags(fp->flags, 1); + } + printf(" Addr: 0x%lx (hdr @ 0x%lx, nxtptr = 0x%lx)\n", + (ulong)(TFS_BASE(fp)),(ulong)fp,(ulong)(fp->next)); + printf(" Size: %ld bytes (crc=0x%lx)", + fp->filsize,fp->filcrc); #if INCLUDE_FLASH - if ((tdp->devinfo & TFS_DEVTYPE_MASK) != TFS_DEVTYPE_RAM) { - int start_sector, end_sector; - addrtosector((uchar *)fp,&start_sector,0,0); - addrtosector((uchar *)fp+fp->filsize+TFSHDRSIZ, - &end_sector,0,0); - if (start_sector == end_sector) { - printf(" in sector %d",start_sector); - } - else { - printf(" spanning sectors %d-%d", - start_sector,end_sector); - } - } + if((tdp->devinfo & TFS_DEVTYPE_MASK) != TFS_DEVTYPE_RAM) { + int start_sector, end_sector; + addrtosector((uchar *)fp,&start_sector,0,0); + addrtosector((uchar *)fp+fp->filsize+TFSHDRSIZ, + &end_sector,0,0); + if(start_sector == end_sector) { + printf(" in sector %d",start_sector); + } else { + printf(" spanning sectors %d-%d", + start_sector,end_sector); + } + } #endif - putchar('\n'); - sizetot += (fp->filsize + TFSHDRSIZ + DEFRAGHDRSIZ); - if (TFS_TIME(fp) != TIME_UNDEFINED) - printf(" Time: %s\n", - tfsGetAtime(TFS_TIME(fp),tbuf,sizeof(tbuf))); - printf("\n"); - tot++; - fp = nextfp(fp,tdp); - if ((more) && ((tot % more) == 0)) { - if (!More()) - return(TFS_OKAY); - } - } - /* If this or the next pointer is null, terminate loop now... */ - if (!*fltrptr) break; - fltrptr++; - if (!*fltrptr) break; - } - } - printf("Total: %d accessible file%s (%d bytes).\n", - tot,tot == 1 ? "" : "s",sizetot); - return (TFS_OKAY); + putchar('\n'); + sizetot += (fp->filsize + TFSHDRSIZ + DEFRAGHDRSIZ); + if(TFS_TIME(fp) != TIME_UNDEFINED) + printf(" Time: %s\n", + tfsGetAtime(TFS_TIME(fp),tbuf,sizeof(tbuf))); + printf("\n"); + tot++; + fp = nextfp(fp,tdp); + if((more) && ((tot % more) == 0)) { + if(!More()) { + return(TFS_OKAY); + } + } + } + /* If this or the next pointer is null, terminate loop now... */ + if(!*fltrptr) { + break; + } + fltrptr++; + if(!*fltrptr) { + break; + } + } + } + printf("Total: %d accessible file%s (%d bytes).\n", + tot,tot == 1 ? "" : "s",sizetot); + return (TFS_OKAY); } -/* tfsqlist(): quick list... - * Display list of files in alphabetical order. - * Display only the name and flag summary. +/* tfsqlist(): quick list... + * Display list of files in alphabetical order. + * Display only the name and flag summary. + * + * To support listing of files in a bit of an orderly manner, if this + * function sees that a filename has a slash in it, it will only print the + * characters upto and including the first slash. This gives the appearance + * of a directory structure, even though there really isn't one. + * For example, if there are three files... + * CONFIG/file1 + * CONFIG/file2 + * CONFIG/file3 + * then if no filter is specified, then that listing will be replaced with + * CONFIG/ + * printed only once. To display all the files prefixed with CONFIG/, the + * user must type "tfs ls CONFIG/\*". * - * To support listing of files in a bit of an orderly manner, if this - * function sees that a filename has a slash in it, it will only print the - * characters upto and including the first slash. This gives the appearance - * of a directory structure, even though there really isn't one. - * For example, if there are three files... - * CONFIG/file1 - * CONFIG/file2 - * CONFIG/file3 - * then if no filter is specified, then that listing will be replaced with - * CONFIG/ - * printed only once. To display all the files prefixed with CONFIG/, the - * user must type "tfs ls CONFIG/\*". - * - * Note: a file with a leading dot ('.') is invisible unless verbose is set. + * Note: a file with a leading dot ('.') is invisible unless verbose is set. */ static int tfsqlist(char *filter[], int verbose, int more) { - TFILE *fp; - char dirname[TFSNAMESIZE+1], tmpname[TFSNAMESIZE+1]; - char *name, fbuf[16], **fltrptr, *slash, *flags; - int idx, sidx, filelisted, err, sizetot; - - if ((err = tfsreorder()) < 0) - return(err); - - filelisted = 0; - sizetot = 0; - dirname[0] = 0; - fltrptr = filter; - printf(" Name Size Location Flags Info\n"); - while(1) { - idx = 0; - while((fp = tfsAlist[idx])) { - name = TFS_NAME(fp); - if (((name[0] == '.') && (!verbose)) || - (!listfilter(*fltrptr,name)) || - ((fp->flags & TFS_UNREAD) && (TFS_USRLVL(fp) > getUsrLvl()))) { - idx++; - continue; - } - - /* If name contains a slash, process it differently (but ignore */ - /* any leading slashes) */ - strcpy(tmpname,TFS_NAME(fp)); - for(sidx=0;sidx<TFSNAMESIZE;sidx++) { - if (tmpname[sidx] != '/') - break; - } - slash = strchr(&tmpname[sidx],'/'); - if (slash && !*fltrptr) { - char tmp; - - tmp = *(slash+1); - *(slash+1) = 0; - if (strcmp(dirname,tmpname)) { - filelisted++; - printf(" %-34s (dir)\n",tmpname); - strcpy(dirname,tmpname); - *(slash+1) = tmp; - } - else { - idx++; - *(slash+1) = tmp; - continue; - } - } - else { - filelisted++; - sizetot += TFS_SIZE(fp); - flags = tfsflagsbtoa(TFS_FLAGS(fp),fbuf); - if ((!flags) || (!fbuf[0])) - flags = " "; - printf(" %-23s %7ld 0x%08lx %-5s %s\n",TFS_NAME(fp), - TFS_SIZE(fp),(ulong)(TFS_BASE(fp)),flags,TFS_INFO(fp)); - } - idx++; - if ((more) && !(filelisted % more)) { - if (!More()) - return(TFS_OKAY); - } - } - /* If this or the next pointer is null, terminate loop now... */ - if (!*fltrptr) break; - fltrptr++; - if (!*fltrptr) break; - } - printf("\nTotal: %d item%s listed (%d bytes).\n",filelisted, - filelisted == 1 ? "" : "s",sizetot); - return (TFS_OKAY); + TFILE *fp; + char dirname[TFSNAMESIZE+1], tmpname[TFSNAMESIZE+1]; + char *name, fbuf[16], **fltrptr, *slash, *flags; + int idx, sidx, filelisted, err, sizetot; + + if((err = tfsreorder()) < 0) { + return(err); + } + + filelisted = 0; + sizetot = 0; + dirname[0] = 0; + fltrptr = filter; + printf(" Name Size Location Flags Info\n"); + while(1) { + idx = 0; + while((fp = tfsAlist[idx])) { + name = TFS_NAME(fp); + if(((name[0] == '.') && (!verbose)) || + (!listfilter(*fltrptr,name)) || + ((fp->flags & TFS_UNREAD) && (TFS_USRLVL(fp) > getUsrLvl()))) { + idx++; + continue; + } + + /* If name contains a slash, process it differently (but ignore */ + /* any leading slashes) */ + strcpy(tmpname,TFS_NAME(fp)); + for(sidx=0; sidx<TFSNAMESIZE; sidx++) { + if(tmpname[sidx] != '/') { + break; + } + } + slash = strchr(&tmpname[sidx],'/'); + if(slash && !*fltrptr) { + char tmp; + + tmp = *(slash+1); + *(slash+1) = 0; + if(strcmp(dirname,tmpname)) { + filelisted++; + printf(" %-34s (dir)\n",tmpname); + strcpy(dirname,tmpname); + *(slash+1) = tmp; + } else { + idx++; + *(slash+1) = tmp; + continue; + } + } else { + filelisted++; + sizetot += TFS_SIZE(fp); + flags = tfsflagsbtoa(TFS_FLAGS(fp),fbuf); + if((!flags) || (!fbuf[0])) { + flags = " "; + } + printf(" %-23s %7ld 0x%08lx %-5s %s\n",TFS_NAME(fp), + TFS_SIZE(fp),(ulong)(TFS_BASE(fp)),flags,TFS_INFO(fp)); + } + idx++; + if((more) && !(filelisted % more)) { + if(!More()) { + return(TFS_OKAY); + } + } + } + /* If this or the next pointer is null, terminate loop now... */ + if(!*fltrptr) { + break; + } + fltrptr++; + if(!*fltrptr) { + break; + } + } + printf("\nTotal: %d item%s listed (%d bytes).\n",filelisted, + filelisted == 1 ? "" : "s",sizetot); + return (TFS_OKAY); } /* tfsrm(): - * Remove all files that pass the incoming filter. - * This replaces the older tfs rm stuff in Tfs(). + * Remove all files that pass the incoming filter. + * This replaces the older tfs rm stuff in Tfs(). */ static int tfsrm(char *filter[]) { - TFILE *fp; - char *name, **fltrptr; - int idx, err, rmtot; - - if ((err = tfsreorder()) < 0) - return(err); - - fltrptr = filter; - while (*fltrptr) { - idx = rmtot = 0; - while((fp = tfsAlist[idx])) { - name = TFS_NAME(fp); - if (listfilter(*fltrptr,name)) { - if ((err = tfsunlink(name)) != TFS_OKAY) - printf("%s: %s\n",name,(char *)tfsctrl(TFS_ERRMSG,err,0)); - rmtot++; - } - idx++; - } - /* This function will potentially delete many files, but if the */ - /* filter doesn't match at least one file, indicate that... */ - if (!rmtot) - printf("%s: file not found\n",*fltrptr); - fltrptr++; - } - - return(TFS_OKAY); + TFILE *fp; + char *name, **fltrptr; + int idx, err, rmtot; + + if((err = tfsreorder()) < 0) { + return(err); + } + + fltrptr = filter; + while(*fltrptr) { + idx = rmtot = 0; + while((fp = tfsAlist[idx])) { + name = TFS_NAME(fp); + if(listfilter(*fltrptr,name)) { + if((err = tfsunlink(name)) != TFS_OKAY) { + printf("%s: %s\n",name,(char *)tfsctrl(TFS_ERRMSG,err,0)); + } + rmtot++; + } + idx++; + } + /* This function will potentially delete many files, but if the */ + /* filter doesn't match at least one file, indicate that... */ + if(!rmtot) { + printf("%s: file not found\n",*fltrptr); + } + fltrptr++; + } + + return(TFS_OKAY); } /* tfscat(): - * Print each character of the file until NULL terminate. Replace - * each instance of CR or LF with CRLF. + * Print each character of the file until NULL terminate. Replace + * each instance of CR or LF with CRLF. */ static void tfscat(TFILE *fp, int more) { - int i, lcnt; - char *cp; - - lcnt = 0; - cp = (char *) (TFS_BASE(fp)); - for(i=0;i<fp->filsize;i++) { - if (*cp == 0x1a) /* EOF or ctrl-z */ - break; - putchar(*cp); - if ((*cp == '\r') || (*cp == '\n')) { - lcnt++; - if (lcnt == more) { - if (More() == 0) - break; - lcnt = 0; - } - } - cp++; - } + int i, lcnt; + char *cp; + + lcnt = 0; + cp = (char *)(TFS_BASE(fp)); + for(i=0; i<fp->filsize; i++) { + if(*cp == 0x1a) { /* EOF or ctrl-z */ + break; + } + putchar(*cp); + if((*cp == '\r') || (*cp == '\n')) { + lcnt++; + if(lcnt == more) { + if(More() == 0) { + break; + } + lcnt = 0; + } + } + cp++; + } } int dumpFhdr(TFILE *fhp) { - int crcok; - - if (tfshdrcrc(fhp) == fhp->hdrcrc) - crcok = 1; - else - crcok = 0; - printf("hdrsize: 0x%04x (%s)\n",fhp->hdrsize, - fhp->hdrsize == TFSHDRSIZ ? "ok" : "bad"); - printf("hdrvrsn: 0x%04x\n",fhp->hdrvrsn); - printf("filsize: 0x%08lx\n",fhp->filsize); - printf("flags : 0x%08lx\n",fhp->flags); + int crcok; + + if(tfshdrcrc(fhp) == fhp->hdrcrc) { + crcok = 1; + } else { + crcok = 0; + } + printf("hdrsize: 0x%04x (%s)\n",fhp->hdrsize, + fhp->hdrsize == TFSHDRSIZ ? "ok" : "bad"); + printf("hdrvrsn: 0x%04x\n",fhp->hdrvrsn); + printf("filsize: 0x%08lx\n",fhp->filsize); + printf("flags : 0x%08lx\n",fhp->flags); #if 0 - printf("filcrc : 0x%08lx (%s)\n",fhp->filcrc, - crc32((uchar *)(fhp+1),fhp->filsize) == fhp->filcrc ? "ok" : "bad"); + printf("filcrc : 0x%08lx (%s)\n",fhp->filcrc, + crc32((uchar *)(fhp+1),fhp->filsize) == fhp->filcrc ? "ok" : "bad"); #else - printf("filcrc : 0x%08lx\n",fhp->filcrc); + printf("filcrc : 0x%08lx\n",fhp->filcrc); #endif - printf("hdrcrc : 0x%08lx (%s)\n",fhp->hdrcrc,crcok ? "ok" : "bad"); - printf("modtime: 0x%08lx\n",fhp->modtime); - printf("next : 0x%08lx\n",(ulong)fhp->next); - if (crcok) { - printf("name : %s\n",fhp->name); - printf("info : %s\n",fhp->info ? fhp->info : ""); - } - else { - printf("name at: 0x%08lx\n",(ulong)fhp->name); - printf("info at: 0x%08lx\n",(ulong)fhp->info); - } - printf("data at: 0x%08lx\n",(ulong)(fhp+1)); - return(TFS_OKAY); + printf("hdrcrc : 0x%08lx (%s)\n",fhp->hdrcrc,crcok ? "ok" : "bad"); + printf("modtime: 0x%08lx\n",fhp->modtime); + printf("next : 0x%08lx\n",(ulong)fhp->next); + if(crcok) { + printf("name : %s\n",fhp->name); + printf("info : %s\n",fhp->info ? fhp->info : ""); + } else { + printf("name at: 0x%08lx\n",(ulong)fhp->name); + printf("info at: 0x%08lx\n",(ulong)fhp->info); + } + printf("data at: 0x%08lx\n",(ulong)(fhp+1)); + return(TFS_OKAY); } char *TfsHelp[] = { - "Tiny File System Interface", - "-[df:i:mv] operation [args]...", + "Tiny File System Interface", + "-[df:i:mv] operation [args]...", #if INCLUDE_VERBOSEHELP - "", - "Options:", - " -d tfs device", - " -f flags (see below)", - " -i info", - " -m enable more throttle", - " -v enable verbosity", - "", - "Operations (alphabetically):", - " add {name} {src_addr} {size}, base {file} {var}, cat {name}", - " cfg {start | restore} [{end} [spare_addr]], check [var], clean", - " cp {from} {to_name | addr}, fhdr {addr}, freemem [var]", - " info {file} {var}, init, ld[v] {name} [sname]", - " log {on|off} {msg}, ln {src} {lnk}, ls [filter]", - " qclean [ramstart] [ramlen], ramdev {name} {base} {size}", - " rm {filter}, run {name}, size {file} {var}, stat", - " trace [lvl], uname {prefix} {var}", + "", + "Options:", + " -d tfs device", + " -f flags (see below)", + " -i info", + " -m enable more throttle", + " -v enable verbosity", + "", + "Operations (alphabetically):", + " add {name} {src_addr} {size}, base {file} {var}, cat {name}", + " cfg {start | restore} [{end} [spare_addr]], check [var], clean", + " cp {from} {to_name | addr}, fhdr {addr}, freemem [var]", + " info {file} {var}, init, ld[v] {name} [sname]", + " log {on|off} {msg}, ln {src} {lnk}, ls [filter]", + " qclean [ramstart] [ramlen], ramdev {name} {base} {size}", + " rm {filter}, run {name}, size {file} {var}, stat", + " trace [lvl], uname {prefix} {var}", #if DEFRAG_TEST_ENABLED - "", - "Operations for testing TFS defragmentation:", - " clean {E|S|F} {tag#} {sector#}", - " E=Exit, S=SectorErase F=FlashWrite", - " rms {size} [exclude_file1] [exclude_file2] ...", - " dhdr {address}", - " dht", + "", + "Operations for testing TFS defragmentation:", + " clean {E|S|F} {tag#} {sector#}", + " E=Exit, S=SectorErase F=FlashWrite", + " rms {size} [exclude_file1] [exclude_file2] ...", + " dhdr {address}", + " dht", #endif - "", - "Flags:", - " E=exec_" + "", + "Flags:", + " E=exec_" #if TFS_EBIN_AOUT - "aout" + "aout" #elif TFS_EBIN_COFF - "coff" + "coff" #elif TFS_EBIN_ELF - "elf" + "elf" #elif TFS_EBIN_MSBIN - "msbin" + "msbin" #elif TFS_EBIN_ELFMSBIN - "elf|msbin" + "elf|msbin" #else #error: No TFS EBIN format specified. #endif - ", e=exec_script, c=compressed, l=symlink", - " b=run_at_boot, B=qry_run_at_boot, i=inplace_modifiable", - " 0-3=usrlvl_0-3, u=ulvl_unreadable", + ", e=exec_script, c=compressed, l=symlink", + " b=run_at_boot, B=qry_run_at_boot, i=inplace_modifiable", + " 0-3=usrlvl_0-3, u=ulvl_unreadable", #endif - 0, + 0, }; /* Tfs(): - * Entry point for the tfs command through the monitor's command line - * interface. This function provides access to most TFS functionality - * through the CLI. + * Entry point for the tfs command through the monitor's command line + * interface. This function provides access to most TFS functionality + * through the CLI. */ int Tfs(int argc, char *argv[]) { - TDEV *tdp, *tdptmp; - TFILE *fp; - TINFO tinfo; - long size; - int err, opt, verbose, i, more, retval, status; - char *src, *name, *info, *flags, *to, *from, *devprefix; - char *arg1, *arg2, *arg3, *arg4; - - tdp = 0; - more = 0; - retval = CMD_SUCCESS; - verbose = 0; - status = TFS_OKAY; - info = (char *)0; - flags = (char *)0; - devprefix = (char *)0; - while ((opt = getopt(argc, argv, "d:vmf:i:")) != -1) { - switch (opt) { - case 'd': - devprefix = optarg; - tdp = gettfsdev_fromprefix(devprefix,1); - if (!tdp) - return(CMD_FAILURE); - break; - case 'f': - flags = optarg; - break; - case 'i': - info = optarg; - break; - case 'm': - more++; - break; - case 'v': - verbose++; - break; - default: - return(CMD_PARAM_ERROR); - } - } - - arg1 = argv[optind]; - arg2 = argv[optind+1]; - arg3 = argv[optind+2]; - arg4 = argv[optind+3]; - - if (argc == optind) { - retval = CMD_PARAM_ERROR; - } - else if (strcmp(arg1, "trace") == 0) { - if (argc == (optind+2)) - tfsTrace = strtoul(arg2,0,0); - else if (argc == (optind+1)) - printf("Current trace mode: 0x%lx\n",tfsTrace); - else - retval = CMD_PARAM_ERROR; - } - else if (strcmp(arg1, "init") == 0) { - if (getUsrLvl() < MAXUSRLEVEL) { - status = showTfsError(TFSERR_USERDENIED,0); - } - else { - status = _tfsinit(tdp); - showTfsError(status,"init"); - if (status == TFS_OKAY) - tfsclear(tdp); - } - } - else if ((strcmp(arg1,"ramdev") == 0) && (argc == (optind+4))) { - err = tfsramdevice(arg2,strtol(arg3,0,0),strtol(arg4,0,0)); - if (err != TFS_OKAY) { - printf("%s: %s\n",arg2,(char *)tfsctrl(TFS_ERRMSG,err,0)); - retval = CMD_FAILURE; - } - } - else if (strcmp(arg1, "log") == 0) { - retval = tfsLogCmd(argc,argv,optind); - } - else if (strcmp(arg1, "cfg") == 0) { - /* args: - * tfsstart tfsend spare_address - */ - ulong start, end, spare; - - if ((argc == (optind+2)) && !strcmp(arg2,"restore")) { - status = tfscfgrestore(); - showTfsError(status,"cfg"); - } - else if ((argc == (optind+3)) || (argc == (optind+4))) { - start = strtol(arg2,0,0); - end = strtol(arg3,0,0); - if (argc == (optind+4)) - spare = strtol(arg4,0,0); - else - spare = 0xffffffff; - status = tfscfg(devprefix,start,end,spare); - showTfsError(status,"cfg"); - } - else { - retval = CMD_PARAM_ERROR; - } - } - else if (strcmp(arg1, "stat") == 0) { - char buf[32]; - int opencnt; - struct tfsdat *slot; - - /* Display current TFS memory usage: */ - tfsmemuse(tdp,&tinfo,1); - printf("TFS Hdr size: %d\n",TFSHDRSIZ); - - /* Display currently opened files: */ - opencnt = 0; - slot = tfsSlots; - for (i=0;i<TFS_MAXOPEN;i++,slot++) { - if (slot->offset >= 0) { - printf("%3d: 0x%08lx %s %s\n",i,(ulong)(slot->base), - tfsmodebtoa(slot->flagmode,buf),slot->hdr.name); - opencnt++; - } - } - printf("Total files currently opened: %d\n",opencnt); - } - else if (strcmp(arg1, "freemem") == 0) { - char *prefix; - - tfsmemuse(tdp,&tinfo,0); - if (tdp) - prefix = tdp->prefix; - else - prefix = ""; - if (argc == (optind+1)) { - printf("0x%x (%d) bytes available to TFS %s\n", - tinfo.memfordata,tinfo.memfordata,prefix); - } - else if (argc == (optind+2)) { - shell_sprintf(arg2,"0x%x",tinfo.memfordata); - } - else - retval = CMD_PARAM_ERROR; - } + TDEV *tdp, *tdptmp; + TFILE *fp; + TINFO tinfo; + long size; + int err, opt, verbose, i, more, retval, status; + char *src, *name, *info, *flags, *to, *from, *devprefix; + char *arg1, *arg2, *arg3, *arg4; + + tdp = 0; + more = 0; + retval = CMD_SUCCESS; + verbose = 0; + status = TFS_OKAY; + info = (char *)0; + flags = (char *)0; + devprefix = (char *)0; + while((opt = getopt(argc, argv, "d:vmf:i:")) != -1) { + switch(opt) { + case 'd': + devprefix = optarg; + tdp = gettfsdev_fromprefix(devprefix,1); + if(!tdp) { + return(CMD_FAILURE); + } + break; + case 'f': + flags = optarg; + break; + case 'i': + info = optarg; + break; + case 'm': + more++; + break; + case 'v': + verbose++; + break; + default: + return(CMD_PARAM_ERROR); + } + } + + arg1 = argv[optind]; + arg2 = argv[optind+1]; + arg3 = argv[optind+2]; + arg4 = argv[optind+3]; + + if(argc == optind) { + retval = CMD_PARAM_ERROR; + } else if(strcmp(arg1, "trace") == 0) { + if(argc == (optind+2)) { + tfsTrace = strtoul(arg2,0,0); + } else if(argc == (optind+1)) { + printf("Current trace mode: 0x%lx\n",tfsTrace); + } else { + retval = CMD_PARAM_ERROR; + } + } else if(strcmp(arg1, "init") == 0) { + if(getUsrLvl() < MAXUSRLEVEL) { + status = showTfsError(TFSERR_USERDENIED,0); + } else { + status = _tfsinit(tdp); + showTfsError(status,"init"); + if(status == TFS_OKAY) { + tfsclear(tdp); + } + } + } else if((strcmp(arg1,"ramdev") == 0) && (argc == (optind+4))) { + err = tfsramdevice(arg2,strtol(arg3,0,0),strtol(arg4,0,0)); + if(err != TFS_OKAY) { + printf("%s: %s\n",arg2,(char *)tfsctrl(TFS_ERRMSG,err,0)); + retval = CMD_FAILURE; + } + } else if(strcmp(arg1, "log") == 0) { + retval = tfsLogCmd(argc,argv,optind); + } else if(strcmp(arg1, "cfg") == 0) { + /* args: + * tfsstart tfsend spare_address + */ + ulong start, end, spare; + + if((argc == (optind+2)) && !strcmp(arg2,"restore")) { + status = tfscfgrestore(); + showTfsError(status,"cfg"); + } else if((argc == (optind+3)) || (argc == (optind+4))) { + start = strtol(arg2,0,0); + end = strtol(arg3,0,0); + if(argc == (optind+4)) { + spare = strtol(arg4,0,0); + } else { + spare = 0xffffffff; + } + status = tfscfg(devprefix,start,end,spare); + showTfsError(status,"cfg"); + } else { + retval = CMD_PARAM_ERROR; + } + } else if(strcmp(arg1, "stat") == 0) { + char buf[32]; + int opencnt; + struct tfsdat *slot; + + /* Display current TFS memory usage: */ + tfsmemuse(tdp,&tinfo,1); + printf("TFS Hdr size: %d\n",TFSHDRSIZ); + + /* Display currently opened files: */ + opencnt = 0; + slot = tfsSlots; + for(i=0; i<TFS_MAXOPEN; i++,slot++) { + if(slot->offset >= 0) { + printf("%3d: 0x%08lx %s %s\n",i,(ulong)(slot->base), + tfsmodebtoa(slot->flagmode,buf),slot->hdr.name); + opencnt++; + } + } + printf("Total files currently opened: %d\n",opencnt); + } else if(strcmp(arg1, "freemem") == 0) { + char *prefix; + + tfsmemuse(tdp,&tinfo,0); + if(tdp) { + prefix = tdp->prefix; + } else { + prefix = ""; + } + if(argc == (optind+1)) { + printf("0x%x (%d) bytes available to TFS %s\n", + tinfo.memfordata,tinfo.memfordata,prefix); + } else if(argc == (optind+2)) { + shell_sprintf(arg2,"0x%x",tinfo.memfordata); + } else { + retval = CMD_PARAM_ERROR; + } + } #if DEFRAG_TEST_ENABLED - else if (strcmp(arg1, "dht") == 0) { - if (argc == (optind+1)) { - status = dumpDhdrTbl(0,0); - showTfsError(status,"dht"); - } - else if (argc == (optind+3)) { - status = dumpDhdrTbl((DEFRAGHDR *)strtol(arg2,0,0), - atoi(arg3)); - showTfsError(status,"dht"); - } - else - retval = CMD_PARAM_ERROR; - } - else if ((strcmp(arg1, "dhdr") == 0) && (argc == (optind+2))) { - status = dumpDhdr((DEFRAGHDR *)strtol(arg2,0,0)); - showTfsError(status,"dhdr"); - } + else if(strcmp(arg1, "dht") == 0) { + if(argc == (optind+1)) { + status = dumpDhdrTbl(0,0); + showTfsError(status,"dht"); + } else if(argc == (optind+3)) { + status = dumpDhdrTbl((DEFRAGHDR *)strtol(arg2,0,0), + atoi(arg3)); + showTfsError(status,"dht"); + } else { + retval = CMD_PARAM_ERROR; + } + } else if((strcmp(arg1, "dhdr") == 0) && (argc == (optind+2))) { + status = dumpDhdr((DEFRAGHDR *)strtol(arg2,0,0)); + showTfsError(status,"dhdr"); + } #endif - else if ((strcmp(arg1, "fhdr") == 0) && (argc == (optind+2))) { - status = dumpFhdr((TFILE *)strtol(arg2,0,0)); - showTfsError(status,"fhdr"); - } - else if (((strcmp(arg1, "base") == 0) || - (strcmp(arg1, "info") == 0) || - (strcmp(arg1, "size") == 0)) && (argc == (optind+3))) { - fp = tfsstat(arg2); - if ((!fp) || - ((fp->flags & TFS_UNREAD) && (TFS_USRLVL(fp) > getUsrLvl()))) - setenv(arg3,0); - else { - switch(arg1[0]) { - case 'b': - shell_sprintf(arg3,"0x%x",(char *)fp+TFSHDRSIZ); - break; - case 'i': - setenv(arg3,fp->info); - break; - case 's': - shell_sprintf(arg3,"%ld",fp->filsize); - break; - } - } - } - else if ((strcmp(arg1, "uname") == 0) && (argc == (optind+3))) { - char uname[TFSNAMESIZE]; - for(i=0;;i++) { - sprintf(uname,"%s%d",arg2,i); - if (!tfsstat(uname)) { - setenv(arg3,uname); - break; - } - } - } - else if (strcmp(arg1, "ls") == 0) { - if (verbose > 1) - status = tfsvlist(&argv[optind+1],verbose,more << 1); - else - status = tfsqlist(&argv[optind+1],verbose,more << 3); - - showTfsError(status,"ls"); - } - else if ((strcmp(arg1, "ln") == 0) && (argc == optind+3)) { - from = arg2; - to = arg3; - status = tfslink(from,to); - showTfsError(status,from); - } - else if ((strcmp(arg1, "cp") == 0) && (argc == (optind+3))) { - char buf[16], linfo[TFSINFOSIZE]; - - from = arg2; - to = arg3; - fp = tfsstat(from); - if (fp) { - if (flags) { - if (strcmp(flags,"0") == 0) - flags = (char *)0; - } - else { - flags = tfsflagsbtoa(fp->flags,buf); - } - if (!info) - strcpy(linfo,fp->info); - else - strcpy(linfo,info); - if ((fp->flags & TFS_UNREAD) && - (TFS_USRLVL(fp) > getUsrLvl())) { - status = showTfsError(TFSERR_USERDENIED,from); - } - else if (to[0] == '0' && to[1] == 'x') { - memcpy((char *)strtol(to,0,16),TFS_BASE(fp),TFS_SIZE(fp)); - flushDcache((char *)strtol(to,0,16), TFS_SIZE(fp)); - invalidateIcache((char *)strtol(to,0,16), TFS_SIZE(fp)); - } - else { - int freespace; - - /* First check to see if a defrag is needed... - */ - freespace = tfsctrl(TFS_MEMAVAIL,0,0); - if (freespace <= TFS_SIZE(fp)) { - tfsctrl(TFS_DEFRAG,0,0); - fp = tfsstat(from); - } - status = tfsadd(to,linfo,flags,(uchar *)TFS_BASE(fp), - TFS_SIZE(fp)); - showTfsError(status,to); - } - } - else - status = showTfsError(TFSERR_NOFILE,from); - } - else if ((strcmp(arg1, "cat") == 0) && (argc >= (optind+2))) { - for(i=optind+1;i<argc;i++) { - name = argv[i]; - fp = tfsstat(name); - if (fp) { - if ((fp->flags & TFS_UNREAD) && - (TFS_USRLVL(fp) > getUsrLvl())) { - status = showTfsError(TFSERR_USERDENIED,name); - } - else { - tfscat(fp,more << 3); /* more times 8 */ - } - } - else - status = showTfsError(TFSERR_NOFILE,name); - } - } + else if((strcmp(arg1, "fhdr") == 0) && (argc == (optind+2))) { + status = dumpFhdr((TFILE *)strtol(arg2,0,0)); + showTfsError(status,"fhdr"); + } else if(((strcmp(arg1, "base") == 0) || + (strcmp(arg1, "info") == 0) || + (strcmp(arg1, "size") == 0)) && (argc == (optind+3))) { + fp = tfsstat(arg2); + if((!fp) || + ((fp->flags & TFS_UNREAD) && (TFS_USRLVL(fp) > getUsrLvl()))) { + setenv(arg3,0); + } else { + switch(arg1[0]) { + case 'b': + shell_sprintf(arg3,"0x%x",(char *)fp+TFSHDRSIZ); + break; + case 'i': + setenv(arg3,fp->info); + break; + case 's': + shell_sprintf(arg3,"%ld",fp->filsize); + break; + } + } + } else if((strcmp(arg1, "uname") == 0) && (argc == (optind+3))) { + char uname[TFSNAMESIZE]; + for(i=0;; i++) { + sprintf(uname,"%s%d",arg2,i); + if(!tfsstat(uname)) { + setenv(arg3,uname); + break; + } + } + } else if(strcmp(arg1, "ls") == 0) { + if(verbose > 1) { + status = tfsvlist(&argv[optind+1],verbose,more << 1); + } else { + status = tfsqlist(&argv[optind+1],verbose,more << 3); + } + + showTfsError(status,"ls"); + } else if((strcmp(arg1, "ln") == 0) && (argc == optind+3)) { + from = arg2; + to = arg3; + status = tfslink(from,to); + showTfsError(status,from); + } else if((strcmp(arg1, "cp") == 0) && (argc == (optind+3))) { + char buf[16], linfo[TFSINFOSIZE]; + + from = arg2; + to = arg3; + fp = tfsstat(from); + if(fp) { + if(flags) { + if(strcmp(flags,"0") == 0) { + flags = (char *)0; + } + } else { + flags = tfsflagsbtoa(fp->flags,buf); + } + if(!info) { + strcpy(linfo,fp->info); + } else { + strcpy(linfo,info); + } + if((fp->flags & TFS_UNREAD) && + (TFS_USRLVL(fp) > getUsrLvl())) { + status = showTfsError(TFSERR_USERDENIED,from); + } else if(to[0] == '0' && to[1] == 'x') { + memcpy((char *)strtol(to,0,16),TFS_BASE(fp),TFS_SIZE(fp)); + flushDcache((char *)strtol(to,0,16), TFS_SIZE(fp)); + invalidateIcache((char *)strtol(to,0,16), TFS_SIZE(fp)); + } else { + int freespace; + + /* First check to see if a defrag is needed... + */ + freespace = tfsctrl(TFS_MEMAVAIL,0,0); + if(freespace <= TFS_SIZE(fp)) { + tfsctrl(TFS_DEFRAG,0,0); + fp = tfsstat(from); + } + status = tfsadd(to,linfo,flags,(uchar *)TFS_BASE(fp), + TFS_SIZE(fp)); + showTfsError(status,to); + } + } else { + status = showTfsError(TFSERR_NOFILE,from); + } + } else if((strcmp(arg1, "cat") == 0) && (argc >= (optind+2))) { + for(i=optind+1; i<argc; i++) { + name = argv[i]; + fp = tfsstat(name); + if(fp) { + if((fp->flags & TFS_UNREAD) && + (TFS_USRLVL(fp) > getUsrLvl())) { + status = showTfsError(TFSERR_USERDENIED,name); + } else { + tfscat(fp,more << 3); /* more times 8 */ + } + } else { + status = showTfsError(TFSERR_NOFILE,name); + } + } + } #if DEFRAG_TEST_ENABLED - /* rms: "remove space". Used for testing only... Keep removing files - * until the number of bytes freed up is greater than the argument - * to rms. Skip over all files listed after the first size argument. - * Arglist to tfs rms is... - * - * tfs rms {SIZE} [EXCLUDEFILE1] [EXCLUDEFILE2] ... - * where SIZE is the amount of space to freeup and EXCLUDEFILEN is - * a filename that is not to be removed. - */ - else if ((strcmp(arg1, "rms") == 0) && (argc >= (optind+2))) { - int insize, totsize; - - totsize = 0; - insize = strtol(arg2,0,0); - tfsreorder(); - for(i=0;tfsAlist[i];i++) { - int j; - - for(j=optind+1;j<argc;j++) { - if (!strcmp(TFS_NAME(tfsAlist[i]),argv[j])) - break; - } - if (j != argc) { - continue; - } - if (devprefix && - strncmp(TFS_NAME(tfsAlist[i]),devprefix,strlen(devprefix))) - continue; - totsize += (TFS_SIZE(tfsAlist[i]) + TFSHDRSIZ); - if (verbose) - printf("rms: removing %s (%ld)\n",TFS_NAME(tfsAlist[i]), - TFS_SIZE(tfsAlist[i]) + TFSHDRSIZ); - _tfsunlink(TFS_NAME(tfsAlist[i])); - if (totsize > insize) - break; - totsize += TFSHDRSIZ; - } - } + /* rms: "remove space". Used for testing only... Keep removing files + * until the number of bytes freed up is greater than the argument + * to rms. Skip over all files listed after the first size argument. + * Arglist to tfs rms is... + * + * tfs rms {SIZE} [EXCLUDEFILE1] [EXCLUDEFILE2] ... + * where SIZE is the amount of space to freeup and EXCLUDEFILEN is + * a filename that is not to be removed. + */ + else if((strcmp(arg1, "rms") == 0) && (argc >= (optind+2))) { + int insize, totsize; + + totsize = 0; + insize = strtol(arg2,0,0); + tfsreorder(); + for(i=0; tfsAlist[i]; i++) { + int j; + + for(j=optind+1; j<argc; j++) { + if(!strcmp(TFS_NAME(tfsAlist[i]),argv[j])) { + break; + } + } + if(j != argc) { + continue; + } + if(devprefix && + strncmp(TFS_NAME(tfsAlist[i]),devprefix,strlen(devprefix))) { + continue; + } + totsize += (TFS_SIZE(tfsAlist[i]) + TFSHDRSIZ); + if(verbose) + printf("rms: removing %s (%ld)\n",TFS_NAME(tfsAlist[i]), + TFS_SIZE(tfsAlist[i]) + TFSHDRSIZ); + _tfsunlink(TFS_NAME(tfsAlist[i])); + if(totsize > insize) { + break; + } + totsize += TFSHDRSIZ; + } + } #endif - else if ((strcmp(arg1, "rm") == 0) && (argc >= (optind+2))) { - status = tfsrm(&argv[optind+1]); - showTfsError(status,0); - } - else if (strcmp(arg1, "fix") == 0) { - tfsfixup(verbose,1); - } - else if (strcmp(arg1, "qclean") == 0) { - char *ramstart = 0; - ulong ramlen = 0; - - if (argc >= optind+2) - ramstart = (char *)strtoul(arg2,0,0); - if (argc >= optind+3) - ramlen = strtoul(arg2,0,0); - - for (tdptmp=tfsDeviceTbl;tdptmp->start != TFSEOT;tdptmp++) { - if (!tdp || (tdp == tdptmp)) { - status = tfsclean_nps(tdptmp,ramstart,ramlen); - showTfsError(status,tdptmp->prefix); - } - } - } - else if (strcmp(arg1, "clean") == 0) { - int otrace; + else if((strcmp(arg1, "rm") == 0) && (argc >= (optind+2))) { + status = tfsrm(&argv[optind+1]); + showTfsError(status,0); + } else if(strcmp(arg1, "fix") == 0) { + tfsfixup(verbose,1); + } else if(strcmp(arg1, "qclean") == 0) { + char *ramstart = 0; + ulong ramlen = 0; + + if(argc >= optind+2) { + ramstart = (char *)strtoul(arg2,0,0); + } + if(argc >= optind+3) { + ramlen = strtoul(arg2,0,0); + } + + for(tdptmp=tfsDeviceTbl; tdptmp->start != TFSEOT; tdptmp++) { + if(!tdp || (tdp == tdptmp)) { + status = tfsclean_nps(tdptmp,ramstart,ramlen); + showTfsError(status,tdptmp->prefix); + } + } + } else if(strcmp(arg1, "clean") == 0) { + int otrace; #if DEFRAG_TEST_ENABLED - DefragTestPoint = DefragTestSector = DefragTestType = 0; - if (argc == (optind+4)) { - if (arg2[0] == 'S') - DefragTestType = DEFRAG_TEST_SERASE; - else if (arg2[0] == 'F') - DefragTestType = DEFRAG_TEST_FWRITE; - else if (arg2[0] == 'E') - DefragTestType = DEFRAG_TEST_EXIT; - else - return(CMD_PARAM_ERROR); - DefragTestPoint = atoi(arg3); - DefragTestSector = atoi(arg4); - printf("Testtype=%c, Testpoint=%d, Testsector=%d\n", - arg2[0],DefragTestPoint,DefragTestSector); - } - else + DefragTestPoint = DefragTestSector = DefragTestType = 0; + if(argc == (optind+4)) { + if(arg2[0] == 'S') { + DefragTestType = DEFRAG_TEST_SERASE; + } else if(arg2[0] == 'F') { + DefragTestType = DEFRAG_TEST_FWRITE; + } else if(arg2[0] == 'E') { + DefragTestType = DEFRAG_TEST_EXIT; + } else { + return(CMD_PARAM_ERROR); + } + DefragTestPoint = atoi(arg3); + DefragTestSector = atoi(arg4); + printf("Testtype=%c, Testpoint=%d, Testsector=%d\n", + arg2[0],DefragTestPoint,DefragTestSector); + } else #endif - if (argc != optind+1) - return(CMD_PARAM_ERROR); - - /* If verbosity request is extreme, then turn on TFS trace also... - */ - otrace = tfsTrace; - if (verbose >= 5) - tfsTrace = 99; - - /* If tdp has been set by the -d option, only defrag the affected - * device; else, defrag all devices... - */ - for (tdptmp=tfsDeviceTbl;tdptmp->start != TFSEOT;tdptmp++) { - if (!tdp || (tdp == tdptmp)) { - status = tfsclean(tdptmp,verbose+1); - showTfsError(status,tdptmp->prefix); - } - } - tfsTrace = otrace; - } - else if (strcmp(arg1, "check") == 0) { - if (argc == optind+1) - verbose = 1; - - if (tfscheck(tdp,verbose) != TFS_OKAY) - status = TFSERR_CORRUPT; - - /* If an additional argument is provided after the "check" command - * then assume it is a shell variable name that is to be populated - * with the pass/fail status of the check... - */ - if (argc == optind+2) - setenv(arg2,status == TFS_OKAY ? "PASS" : "FAIL"); - } - else if ((!strncmp(arg1, "ld",2)) && - ((argc == optind+2) || (argc == optind+3))) { - int vfy = 0; - - if (arg1[2] == 'v') - vfy = 1; - else if (arg1[2] != 0) - return(CMD_PARAM_ERROR); - status = tfsld(arg2,verbose,arg3,vfy); - showTfsError(status,arg2); - } - else if ((strcmp(arg1, "run") == 0) && (argc >= (optind+2))) { - status = tfsrun(&argv[optind+1],verbose); - showTfsError(status,arg2); - } - else if ((!(strcmp(arg1, "add"))) && (argc == (optind+4))) { - src = (char *) strtol(arg3, (char **) 0, 0); - size = strtol(arg4, (char **) 0, 0); - status = tfsadd(arg2, info, flags, (uchar *)src, size); - showTfsError(status,arg2); - if (status != TFS_OKAY) - retval = CMD_FAILURE; - } - else { - retval = CMD_PARAM_ERROR; - } - return(retval); + if(argc != optind+1) { + return(CMD_PARAM_ERROR); + } + + /* If verbosity request is extreme, then turn on TFS trace also... + */ + otrace = tfsTrace; + if(verbose >= 5) { + tfsTrace = 99; + } + + /* If tdp has been set by the -d option, only defrag the affected + * device; else, defrag all devices... + */ + for(tdptmp=tfsDeviceTbl; tdptmp->start != TFSEOT; tdptmp++) { + if(!tdp || (tdp == tdptmp)) { + status = tfsclean(tdptmp,verbose+1); + showTfsError(status,tdptmp->prefix); + } + } + tfsTrace = otrace; + } else if(strcmp(arg1, "check") == 0) { + if(argc == optind+1) { + verbose = 1; + } + + if(tfscheck(tdp,verbose) != TFS_OKAY) { + status = TFSERR_CORRUPT; + } + + /* If an additional argument is provided after the "check" command + * then assume it is a shell variable name that is to be populated + * with the pass/fail status of the check... + */ + if(argc == optind+2) { + setenv(arg2,status == TFS_OKAY ? "PASS" : "FAIL"); + } + } else if((!strncmp(arg1, "ld",2)) && + ((argc == optind+2) || (argc == optind+3))) { + int vfy = 0; + + if(arg1[2] == 'v') { + vfy = 1; + } else if(arg1[2] != 0) { + return(CMD_PARAM_ERROR); + } + status = tfsld(arg2,verbose,arg3,vfy); + showTfsError(status,arg2); + } else if((strcmp(arg1, "run") == 0) && (argc >= (optind+2))) { + status = tfsrun(&argv[optind+1],verbose); + showTfsError(status,arg2); + } else if((!(strcmp(arg1, "add"))) && (argc == (optind+4))) { + src = (char *) strtol(arg3, (char **) 0, 0); + size = strtol(arg4, (char **) 0, 0); + status = tfsadd(arg2, info, flags, (uchar *)src, size); + showTfsError(status,arg2); + if(status != TFS_OKAY) { + retval = CMD_FAILURE; + } + } else { + retval = CMD_PARAM_ERROR; + } + return(retval); } #endif |