122 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*
 | 
						|
 * mdu.c:
 | 
						|
 * Display the space occupied by an MSDOS directory
 | 
						|
 */
 | 
						|
 | 
						|
#include "sysincludes.h"
 | 
						|
#include "msdos.h"
 | 
						|
#include "vfat.h"
 | 
						|
#include "mtools.h"
 | 
						|
#include "file.h"
 | 
						|
#include "mainloop.h"
 | 
						|
#include "fs.h"
 | 
						|
#include "codepage.h"
 | 
						|
 | 
						|
 | 
						|
typedef struct Arg_t {
 | 
						|
	int all;
 | 
						|
	int inDir;
 | 
						|
	int summary;
 | 
						|
	struct Arg_t *parent;
 | 
						|
	char *target;
 | 
						|
	char *path;
 | 
						|
	unsigned int blocks;
 | 
						|
	MainParam_t mp;
 | 
						|
} Arg_t;
 | 
						|
 | 
						|
static void usage(void)
 | 
						|
{
 | 
						|
		fprintf(stderr, "Mtools version %s, dated %s\n",
 | 
						|
			mversion, mdate);
 | 
						|
		fprintf(stderr, "Usage: %s [-as] msdosdirectory\n"
 | 
						|
			"\t-a All (also show individual files)\n"
 | 
						|
			"\t-s Summary for directory only\n",
 | 
						|
			progname);
 | 
						|
		exit(1);
 | 
						|
}
 | 
						|
 | 
						|
static int file_mdu(direntry_t *entry, MainParam_t *mp)
 | 
						|
{
 | 
						|
	unsigned int blocks;
 | 
						|
	Arg_t * arg = (Arg_t *) (mp->arg);
 | 
						|
 | 
						|
	blocks = countBlocks(entry->Dir,getStart(entry->Dir, &entry->dir));
 | 
						|
	if(arg->all || !arg->inDir) {
 | 
						|
		printf("%-7d ", blocks);
 | 
						|
		fprintPwd(stdout, entry,0);
 | 
						|
		fputc('\n', stdout);
 | 
						|
	}
 | 
						|
	arg->blocks += blocks;
 | 
						|
	return GOT_ONE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
static int dir_mdu(direntry_t *entry, MainParam_t *mp)
 | 
						|
{
 | 
						|
	Arg_t *parentArg = (Arg_t *) (mp->arg);
 | 
						|
	Arg_t arg;
 | 
						|
	int ret;
 | 
						|
	
 | 
						|
	arg = *parentArg;
 | 
						|
	arg.mp.arg = (void *) &arg;
 | 
						|
	arg.parent = parentArg;
 | 
						|
	arg.inDir = 1;
 | 
						|
 | 
						|
	/* account for the space occupied by the directory itself */
 | 
						|
	if(!isRootDir(entry->Dir)) {
 | 
						|
		arg.blocks = countBlocks(entry->Dir,
 | 
						|
					 getStart(entry->Dir, &entry->dir));
 | 
						|
	} else {
 | 
						|
		arg.blocks = 0;
 | 
						|
	}
 | 
						|
 | 
						|
	/* recursion */
 | 
						|
	ret = mp->loop(mp->File, &arg.mp, "*");
 | 
						|
	if(!arg.summary || !parentArg->inDir) {
 | 
						|
		printf("%-7d ", arg.blocks);
 | 
						|
		fprintPwd(stdout, entry,0);
 | 
						|
		fputc('\n', stdout);
 | 
						|
	}
 | 
						|
	arg.parent->blocks += arg.blocks;
 | 
						|
	return ret;
 | 
						|
}
 | 
						|
 | 
						|
void mdu(int argc, char **argv, int type)
 | 
						|
{
 | 
						|
	Arg_t arg;
 | 
						|
	int c;
 | 
						|
 | 
						|
	arg.all = 0;
 | 
						|
	arg.inDir = 0;
 | 
						|
	arg.summary = 0;
 | 
						|
	while ((c = getopt(argc, argv, "as")) != EOF) {
 | 
						|
		switch (c) {
 | 
						|
			case 'a':
 | 
						|
				arg.all = 1;
 | 
						|
				break;
 | 
						|
			case 's':
 | 
						|
				arg.summary = 1;
 | 
						|
				break;
 | 
						|
			case '?':
 | 
						|
				usage();
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if (optind >= argc)
 | 
						|
		usage();
 | 
						|
 | 
						|
	if(arg.summary && arg.all) {
 | 
						|
		fprintf(stderr,"-a and -s options are mutually exclusive\n");
 | 
						|
		usage();
 | 
						|
	}
 | 
						|
 | 
						|
	init_mp(&arg.mp);
 | 
						|
	arg.mp.callback = file_mdu;
 | 
						|
	arg.mp.openflags = O_RDONLY;
 | 
						|
	arg.mp.dirCallback = dir_mdu;
 | 
						|
 | 
						|
	arg.mp.arg = (void *) &arg;
 | 
						|
	arg.mp.lookupflags = ACCEPT_PLAIN | ACCEPT_DIR | DO_OPEN_DIRS | NO_DOTS;
 | 
						|
	exit(main_loop(&arg.mp, argv + optind, argc - optind));
 | 
						|
}
 |