| #ifndef MTOOLS_MAINLOOP_H | |
| #define MTOOLS_MAINLOOP_H | |
| /* Copyright 1997,2001,2002,2007-2009 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 <sys/param.h> | |
| #include "vfat.h" | |
| #include "mtoolsDirentry.h" | |
| typedef struct bounded_string { | |
| char *data; /* storage of converted string, including final null byte */ | |
| size_t len; /* max length of converted string, including final null | |
| * byte */ | |
| } bounded_string; | |
| typedef struct MainParam_t { | |
| /* stuff needing to be initialised by the caller */ | |
| int (*loop)(Stream_t *Dir, struct MainParam_t *mp, | |
| const char *filename); | |
| int (*dirCallback)(direntry_t *, struct MainParam_t *); | |
| int (*callback)(direntry_t *, struct MainParam_t *); | |
| int (*unixcallback)(struct MainParam_t *mp); | |
| void *arg; /* command-specific parameters | |
| * to be passed to callback */ | |
| int openflags; /* flags used to open disk */ | |
| int lookupflags; /* flags used to lookup up using vfat_lookup */ | |
| int fast_quit; /* for commands manipulating multiple files, quit | |
| * as soon as even _one_ file has a problem */ | |
| bounded_string shortname; /* where to put the short name of the | |
| * matched file */ | |
| bounded_string longname; /* where to put the long name of the | |
| * matched file */ | |
| /* out parameters */ | |
| Stream_t *File; | |
| direntry_t *direntry; /* dir of this entry */ | |
| char *unixSourceName; /* filename of the last opened Unix source | |
| * file (Unix equiv of Dos direntry) */ | |
| Stream_t *targetDir; /* directory where to place files */ | |
| char *unixTarget; /* directory on Unix where to put files */ | |
| const char *targetName; /* basename of target file, or NULL if same | |
| * basename as source should be conserved */ | |
| char *originalArg; /* original argument, complete with wildcards */ | |
| int basenameHasWildcard; /* true if there are wildcards in the | |
| * basename */ | |
| /* internal data */ | |
| char mcwd[MAX_PATH+4]; | |
| char *fileName; /* resolved Unix filename */ | |
| char targetBuffer[4*MAX_VNAMELEN+1]; /* buffer for target name */ | |
| } MainParam_t; | |
| void init_mp(MainParam_t *MainParam); | |
| int main_loop(MainParam_t *MainParam, char **argv, int argc); | |
| int target_lookup(MainParam_t *mp, const char *arg); | |
| Stream_t *open_root_dir(char drivename, int flags, int *isRop); | |
| const char *mpGetBasename(MainParam_t *mp); /* statically allocated | |
| * string */ | |
| void mpPrintFilename(FILE *file, MainParam_t *mp); | |
| const char *mpPickTargetName(MainParam_t *mp); /* statically allocated string */ | |
| char *mpBuildUnixFilename(MainParam_t *mp); /* dynamically allocated, must | |
| * be freed */ | |
| int isSpecial(const char *name); | |
| #ifdef HAVE_WCHAR_H | |
| int isSpecialW(const wchar_t *name); | |
| #else | |
| #define isSpecialW isSpecial | |
| #endif | |
| #define MISSED_ONE 2 /* set if one cmd line argument didn't match any files */ | |
| #define GOT_ONE 4 /* set if a match was found, used for exit status */ | |
| #define NO_CWD 8 /* file not found while looking for current working | |
| * directory */ | |
| #define ERROR_ONE 16 /* flat out error, such as problems with target file, | |
| interrupt by user, etc. */ | |
| #define STOP_NOW 32 /* stop as soon as possible, not necessarily an error */ | |
| #endif |