mizucp: implement scan thread
[mizunara.git] / mizucp / main.h
index f30b12a..872b06f 100644 (file)
@@ -1,29 +1,23 @@
 /*
- * 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
@@ -33,6 +27,8 @@
 
 #include <ucx/string.h>
 
+#include <pthread.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -44,21 +40,73 @@ extern "C" {
     
 #define CLIENT_MSG_BUFSIZE 512
     
+#define MAX_COPY_THREADS 32
+    
 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;
 } CPSettings;
 
+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;
+    
+    /*
+     * file successfully copied
+     */
+    CPBool finished;
+    
+    /*
+     * 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 mzcp_start_scan(CPSettings *settings);
+void* scan_run(void *data);
+
+int enqueue_file(SrcFile *file);
+
+int mzcp_start_copy_threads(CPSettings *settings);
+void* copy_run(void *data);
+
 
     
 #ifdef __cplusplus