/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ * Copyright 2021 Olaf Wintermann
*
- * Copyright 2021 Olaf Wintermann. All rights reserved.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
*/
#ifndef MAIN_H
#define MAIN_H
#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
#include <ucx/string.h>
+#include <pthread.h>
+
#ifdef __cplusplus
extern "C" {
#endif
-#define UWCP_ENV_HOME "HOME"
-#define UWCP_CFG_DIR ".uwfile"
-#define UWCP_COPY_DIR "copy"
+#define MZCP_ENV_HOME "HOME"
+#define MZCP_CFG_BASE ".config"
+#define MZCP_CFG_DIR ".config/mizunara"
+#define MZCP_COPY_DIR "copy"
#define CLIENT_MSG_BUFSIZE 512
+#define MAX_COPY_THREADS 32
+#define MZ_COPY_BUFSIZE 4 * 1024 * 1024
+
typedef char CPBool;
+typedef struct SrcFile SrcFile;
+typedef struct MZLock MZLock;
+typedef struct MZQueue MZQueue;
+
typedef struct {
char *from;
char *to;
+ size_t num_threads;
CPBool url;
CPBool pause;
CPBool printsocket;
+ struct stat root_stat;
} CPSettings;
-typedef struct {
- int fd;
- char buf[CLIENT_MSG_BUFSIZE];
- size_t pos;
-} CtrlClient;
+struct MZLock {
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+};
+
+struct SrcFile {
+ /*
+ * src file path relative to CPSettings.from
+ */
+ char *path;
+
+ /*
+ * is the file a directory
+ */
+ CPBool isdir;
+
+ /*
+ * copy status
+ * 0: unprocessed
+ * 1: success
+ * -1: failure
+ */
+ int status;
+
+ /*
+ * file mode
+ */
+ mode_t mode;
+
+ /*
+ * file size
+ */
+ uint64_t size;
+
+ /*
+ * processing this file depends on another file (directory)
+ */
+ SrcFile *depends_on;
+
+ /*
+ * lock used for waiting, until this resource is successfully copied
+ */
+ MZLock *lock;
+};
+
+struct MZQueue {
+ SrcFile *file;
+ MZQueue *next;
+};
+
+const char* mzcp_get_cfgdir(void);
+const char* mzcp_get_copydir(void);
+
+int mzcp_copy(CPSettings *settings);
-int uwcp_copy(CPSettings *settings);
+int mzcp_start_scan(CPSettings *settings);
+void* scan_run(void *data);
-int uwcp_srvctrl(CPSettings *settings);
+int enqueue_file(SrcFile *file);
-void client_free(CtrlClient *client);
+int mzcp_start_copy_threads(CPSettings *settings);
+void* copy_run(void *data);
-int handle_messages(CtrlClient *client);
-int handle_client_msg(CtrlClient *client, sstr_t msg);
+int mz_copy_dir(CPSettings *settings, SrcFile *file, const char *from, const char *to);
+int mz_copy_file(CPSettings *settings, SrcFile *file, const char *from, const char *to, char *buffer, size_t bufsize);
-void client_send_status(CtrlClient *client);
#ifdef __cplusplus
}