diff options
Diffstat (limited to 'mtp/twrpMtp.cpp')
-rw-r--r-- | mtp/twrpMtp.cpp | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/mtp/twrpMtp.cpp b/mtp/twrpMtp.cpp new file mode 100644 index 000000000..2b2de01cd --- /dev/null +++ b/mtp/twrpMtp.cpp @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2014 TeamWin - bigbiff and Dees_Troy mtp database conversion to C++ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include <string> +#include <fcntl.h> +#include <sys/wait.h> +#include <pthread.h> +#include <utils/Errors.h> +#include <utils/threads.h> +#include "MtpTypes.h" +#include "MtpPacket.h" +#include "MtpDataPacket.h" +#include "MtpDatabase.h" +#include "MtpRequestPacket.h" +#include "MtpResponsePacket.h" +#include "mtp_MtpDatabase.hpp" +#include "mtp_MtpServer.hpp" +#include "twrpMtp.hpp" +#include "MtpDebug.h" + +#ifdef TWRPMTP +static void usage(std::string prg) { + printf("Usage: %s <OPTIONS>\n", prg.c_str()); + printf("Options:\n"); + printf("\t-h, --help\t\tShow Usage\n"); + printf("\t-s1, --storage1 /path/to/dir\t\tDestination to first storage directory\n"); + printf("\t-s2, --storage2 /path/to/dir\t\tDestination to first storage directory\n"); + printf("\t-sN, --storageN /path/to/dir\t\tDestination to first storage directory\n"); +} + +int main(int argc, char* argv[]) { + printf("argc: %d\n", argc); + if (argc < 2) { + usage(argv[0]); + return 1; + } + + std::vector <std::string> storages; + + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if ((arg == "-h") || (arg == "--help")) { + usage(argv[0]); + } + else { + storages.push_back(arg); + } + } + printf("starting\n"); + twmtp_MtpServer* mtp = new twmtp_MtpServer(); + mtp->set_storages(storages); + mtp->start(); + return 0; +} +#endif //def TWRPMTP + +twrpMtp::twrpMtp(int debug_enabled) { + if (debug_enabled) + MtpDebug::enableDebug(); + mtpstorages = new storages; + mtp_read_pipe = -1; +} + +int twrpMtp::start(void) { + MTPI("Starting MTP\n"); + twmtp_MtpServer *mtp = new twmtp_MtpServer(); + mtp->set_storages(mtpstorages); + mtp->set_read_pipe(mtp_read_pipe); + mtp->start(); + return 0; +} + +pthread_t twrpMtp::threadserver(void) { + pthread_t thread; + ThreadPtr mtpptr = &twrpMtp::start; + PThreadPtr p = *(PThreadPtr*)&mtpptr; + pthread_create(&thread, NULL, p, this); + return thread; +} + +pid_t twrpMtp::forkserver(int mtppipe[2]) { + pid_t pid; + if ((pid = fork()) == -1) { + MTPE("MTP fork failed.\n"); + return 0; + } + if (pid == 0) { + // Child process + close(mtppipe[1]); // Child closes write side + mtp_read_pipe = mtppipe[0]; + start(); + MTPD("MTP child process exited.\n"); + close(mtppipe[0]); + _exit(0); + } else { + return pid; + } + return 0; +} + +void twrpMtp::addStorage(std::string display, std::string path, int mtpid, uint64_t maxFileSize) { + s = new storage; + s->display = display; + s->mount = path; + s->mtpid = mtpid; + s->maxFileSize = maxFileSize; + MTPD("twrpMtp mtpid: %d\n", s->mtpid); + mtpstorages->push_back(s); +} |