2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
4 * Copyright 2021 Olaf Wintermann. All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
41 #include <sys/socket.h>
43 #include <sys/fcntl.h>
47 #include <libidav/utils.h>
49 #include <ucx/utils.h>
53 #define OPTSTR "hlpsuv"
60 int main(int argc, char** argv) {
64 extern int optind, opterr, optopt;
67 memset(&settings, 0, sizeof(CPSettings));
71 int list = 0; // list copying processes
74 while((c = getopt(argc, argv, OPTSTR)) != -1) {
76 case 'l': list = 1; break;
77 case 'p': settings.pause = 1; break;
78 case 's': settings.printsocket = 1; break;
79 case 'u': settings.url = 1; break;
80 case 'v': version = 1; break;
84 int ac = argc - optind;
94 settings.from = argv[optind];
95 settings.to = argv[optind+1];
96 ret = mzcp_copy(&settings);
105 static int check_dir(const char *path) {
108 if(errno == ENOENT) {
109 if(mkdir(path, S_IRWXU)) {
110 fprintf(stderr, "Cannot create %s: %s", path, strerror(errno));
114 fprintf(stderr, "Cannot access %s: %s", path, strerror(errno));
121 static int check_configdir(void) {
122 char *home = getenv(MZCP_ENV_HOME);
124 char *base = util_concat_path(home, MZCP_CFG_BASE);
125 if(check_dir(base)) return 1;
128 cfgdir = util_concat_path(home, MZCP_CFG_DIR);
129 if(check_dir(cfgdir)) return 1;
131 copydir = util_concat_path(mzcp_get_cfgdir(), MZCP_COPY_DIR);
132 if(check_dir(copydir)) return 1;
137 const char* mzcp_get_cfgdir(void) {
141 const char* mzcp_get_copydir(void) {
145 int mzcp_copy(CPSettings *settings) {
148 if(check_configdir()) {
153 if(create_control_socket()) {
157 if(settings->printsocket) {
158 printf("%s\n", mzcp_get_socketpath());
160 printf("copy %s to %s\n", settings->from, settings->to);
161 if(settings->pause) {
173 ret = mzcp_srvctrl(settings);