diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2013-01-09 19:04:18 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2013-01-09 19:04:18 +0000 |
commit | af0c3edb9706e470b45a9c8dd6debcc9e2d543c2 (patch) | |
tree | 340ee9c0f1b504061d4206d05d9fcc265c1302eb /mtools.c | |
download | mtools-master.tar.gz |
mtools-4.0.18HEADmtools-4.0.18master
Diffstat (limited to 'mtools.c')
-rw-r--r-- | mtools.c | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/mtools.c b/mtools.c new file mode 100644 index 0000000..ffac8bb --- /dev/null +++ b/mtools.c @@ -0,0 +1,201 @@ +/* Copyright 1996-2004,2007-2010 Alain Knaff. + * This file is part of mtools. + * + * Mtools is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Mtools is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mtools. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "sysincludes.h" +#include "msdos.h" +#include "mtools.h" +#include "partition.h" +#include "vfat.h" + +const char *progname; + +static const struct dispatch { + const char *cmd; + void (*fn)(int, char **, int); + int type; +} dispatch[] = { + {"mattrib",mattrib, 0}, + {"mbadblocks",mbadblocks, 0}, + {"mcat",mcat, 0}, + {"mcd",mcd, 0}, + {"mclasserase",mclasserase, 0}, + {"mcopy",mcopy, 0}, + {"mdel",mdel, 0}, + {"mdeltree",mdel, 2}, + {"mdir",mdir, 0}, + {"mdoctorfat",mdoctorfat, 0}, + {"mdu",mdu, 0}, + {"mformat",mformat, 0}, + {"minfo", minfo, 0}, + {"mlabel",mlabel, 0}, + {"mmd",mmd, 0}, + {"mmount",mmount, 0}, + {"mpartition",mpartition, 0}, + {"mrd",mdel, 1}, + {"mread",mcopy, 0}, + {"mmove",mmove, 0}, + {"mren",mmove, 1}, + {"mshowfat", mshowfat, 0}, + {"mshortname", mshortname, 0}, + {"mtoolstest", mtoolstest, 0}, + {"mtype",mcopy, 1}, + {"mwrite",mcopy, 0}, + {"mzip", mzip, 0} +}; +#define NDISPATCH (sizeof dispatch / sizeof dispatch[0]) + +int main(int argc,char **argv) +{ + unsigned int i; + const char *name; + +#ifdef HAVE_SETLOCALE + char *locale; + locale=setlocale(LC_ALL, ""); + if(locale == NULL || !strcmp(locale, "C")) + setlocale(LC_ALL, "en_US"); +#endif + + init_privs(); +#ifdef __EMX__ + _wildcard(&argc,&argv); +#endif + +/*#define PRIV_TEST*/ + +#ifdef PRIV_TEST + { + int euid; + char command[100]; + + printf("INIT: %d %d\n", getuid(), geteuid()); + drop_privs(); + printf("DROP: %d %d\n", getuid(), geteuid()); + reclaim_privs(); + printf("RECLAIM: %d %d\n", getuid(), geteuid()); + euid = geteuid(); + if(argc & 1) { + drop_privs(); + printf("DROP: %d %d\n", getuid(), geteuid()); + } + if(!((argc-1) & 2)) { + destroy_privs(); + printf("DESTROY: %d %d\n", getuid(), geteuid()); + } + sprintf(command, "a.out %d", euid); + system(command); + return 1; + } +#endif + + +#ifdef __EMX__ + _wildcard(&argc,&argv); +#endif + + + /* check whether the compiler lays out structures in a sane way */ + if(sizeof(struct partition) != 16 || + sizeof(struct directory) != 32 || + sizeof(struct vfat_subentry) !=32) { + fprintf(stderr,"Mtools has not been correctly compiled\n"); + fprintf(stderr,"Recompile it using a more recent compiler\n"); + return 137; + } + +#ifdef __EMX__ + argv[0] = _getname(argv[0]); _remext(argv[0]); name = argv[0]; +#else +#ifdef OS_mingw32msvc + _stripexe(argv[0]); +#endif + name = _basename(argv[0]); +#endif + progname = argv[0]; + + /* this allows the different tools to be called as "mtools -c <command>" + ** where <command> is mdir, mdel, mcopy etcetera + ** Mainly done for the BeOS, which doesn't support links yet. + */ + + if(argc >= 3 && + !strcmp(argv[1], "-c") && + !strcmp(name, "mtools")) { + argc-=2; + argv+=2; + name = argv[0]; + } + + + + /* print the version */ + if(argc >= 2 && + (strcmp(argv[1], "-V") == 0 || strcmp(argv[1], "--version") ==0)) { + printf("%s (GNU mtools) %s\n", + name, mversion); + printf("configured with the following options: "); +#ifdef USE_XDF + printf("enable-xdf "); +#else + printf("disable-xdf "); +#endif +#ifdef USING_VOLD + printf("enable-vold "); +#else + printf("disable-vold "); +#endif +#ifdef USING_NEW_VOLD + printf("enable-new-vold "); +#else + printf("disable-new-vold "); +#endif +#ifdef DEBUG + printf("enable-debug "); +#else + printf("disable-debug "); +#endif +#ifdef USE_RAWTERM + printf("enable-raw-term "); +#else + printf("disable-raw-term "); +#endif + printf("\n"); + return 0; + } + + read_config(); + setup_signal(); + for (i = 0; i < NDISPATCH; i++) { + if (!strcmp(name,dispatch[i].cmd)) + dispatch[i].fn(argc, argv, dispatch[i].type); + } + if (strcmp(name,"mtools")) + fprintf(stderr,"Unknown mtools command '%s'\n",name); + fprintf(stderr,"Supported commands:"); + for (i = 0; i < NDISPATCH; i++) { + if (i%8 == 0) putc('\n', stderr); + else fprintf(stderr, ", "); + fprintf(stderr, "%s", dispatch[i].cmd); + } + putc('\n', stderr); + + return 1; +} + +int helpFlag(int argc, char **argv) { + return (argc > 1 && !strcmp(argv[1], "--help")); +} |