home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 2
/
crawlyvol2.bin
/
alt_os
/
mint
/
mfs6011
/
source
/
csize.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-01-21
|
4KB
|
231 lines
/* Minix Filesystem Binary Configuration Program
* Copyright 1995 S.N. Henson.
*/
#include <mintbind.h>
#include <nlist.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <st-out.h>
#include <macros.h>
#ifdef __STDC__
# define P(s) s
#else
# define P(s) ()
#endif
/* csize.c */
int main P((int argc , char **argv ));
int usage P((void ));
int get_binfo P((char *fpath ));
int alert_err P((char *mess ));
int load_bin P((char *fpath ));
int save_bin P((char *fpath ));
int get_var P((void *ptr , int sym , int len ));
int put_var P((void *ptr , int sym , int len ));
#undef P
/* Symbol list */
struct nlist nl[] = {
{"_mfs_maj",0,0},
{"_mfs_min",0,0},
{"_mfs_plev",0,0},
{"_mfs_magic",0,0},
{"_ucache_size",0,0},
{"_scache_size",0,0},
{"_icache_size",0,0},
{0,0,0}
};
long ucache_size,scache_size,icache_size;
long mfs_magic;
unsigned short mfs_maj,mfs_min,mfs_plev;
FILE *mfs;
#define MFS_MAGIC 0x18970431
#define MFS_VERIFY 0x100
#define MFS_INFO 0x104
#define S_MAJ 0
#define S_MIN 1
#define S_PLEV 2
#define S_MAGIC 3
#define S_UCACHE 4
#define S_SCACHE 5
#define S_ICACHE 6
int main(argc,argv)
int argc;
char **argv;
{
if (argc != 2 && argc != 5) usage();
if (get_binfo (argv[1])) exit (0);
if (argc==2) {
printf ("Minixfs version %d.%d Patch level %d\n", mfs_maj, mfs_min, mfs_plev);
printf ("User cache size %ldK\n", ucache_size);
printf ("System cache size %ldK\n", scache_size);
printf ("Inode cache size %ldK\n", icache_size);
exit (0);
}
ucache_size = atol (argv[2]);
scache_size = atol (argv[3]);
icache_size = atol (argv[4]);
save_bin (argv[1]);
exit (0);
}
usage ()
{
fprintf (stderr, "Usage: csize minix.xfs [ucache scache icache]\n");
}
int get_binfo(fpath)
char *fpath;
{
switch(nlist(fpath,nl))
{
case 0: /* Got all symbols */
break;
case 1: /* One symbol not found */
if(nl[S_PLEV].n_type==0) break; /* OK if patchlevel */
default: /* More than one */
alert_err("Can't Find All Symbols");
return 1;
case -1: /* Some other error */
switch(errno)
{
case EDOM:
alert_err("Stripped Binary");
break;
case ENOEXEC:
alert_err("Not Executable File");
break;
default:
alert_err("Error Reading file");
}
return 1;
}
if(load_bin(fpath))
{
alert_err("Error Reading Symbols");
return 1;
}
return 0;
}
alert_err (mess)
char *mess;
{
fprintf (stderr, "csize: %s\n", mess);
}
/* Load all symbols from binary into variables */
#define HDR sizeof(struct aexec)
#define N_OFF(x) (nl[x].n_value+HDR)
#define N_READ(x) (fread(&x,sizeof(x),1,mfs)!=1)
#define get_short(x,y) get_var(x,y,sizeof(short))
#define get_long(x,y) get_var(x,y,sizeof(long))
#define put_short(x,y) put_var(x,y,sizeof(short))
#define put_long(x,y) put_var(x,y,sizeof(long))
int load_bin(fpath)
char *fpath;
{ if(! (mfs=fopen(fpath,"rb"))) return 1;
if( get_long(&mfs_magic,S_MAGIC) ) return 1;
if(mfs_magic!=MFS_MAGIC)
{
fclose(mfs);
return 1;
}
if( get_short(&mfs_maj,S_MAJ) ) return 1;
if( get_short(&mfs_min,S_MIN) ) return 1;
if( get_short(&mfs_plev,S_PLEV) ) return 1;
if( get_long(&ucache_size,S_UCACHE) ) return 1;
if( get_long(&scache_size,S_SCACHE) ) return 1;
if( get_long(&icache_size,S_ICACHE) ) return 1;
fclose(mfs);
return 0;
}
int save_bin(fpath)
char *fpath;
{
if(! (mfs=fopen(fpath,"rb+"))) return 1;
if( put_long(&ucache_size,S_UCACHE) ) return 1;
if( put_long(&scache_size,S_SCACHE) ) return 1;
if( put_long(&icache_size,S_ICACHE) ) return 1;
fclose(mfs);
return 0;
}
int get_var(ptr,sym,len)
void *ptr;
int sym;
int len;
{
if(fseek(mfs,nl[sym].n_value+HDR,SEEK_SET))
{
fclose(mfs);
return 1;
}
if(fread(ptr,len,1,mfs)!=1)
{
fclose(mfs);
return 1;
}
return 0;
}
int put_var(ptr,sym,len)
void *ptr;
int sym;
int len;
{
if(fseek(mfs,nl[sym].n_value+HDR,SEEK_SET))
{
fclose(mfs);
return 1;
}
if(fwrite(ptr,len,1,mfs)!=1)
{
fclose(mfs);
return 1;
}
return 0;
}