Branch data Line data Source code
1 : : /*-
2 : : * Copyright (c) 2011-2012 Baptiste Daroussin <bapt@FreeBSD.org>
3 : : * All rights reserved.
4 : : *
5 : : * Redistribution and use in source and binary forms, with or without
6 : : * modification, are permitted provided that the following conditions
7 : : * are met:
8 : : * 1. Redistributions of source code must retain the above copyright
9 : : * notice, this list of conditions and the following disclaimer
10 : : * in this position and unchanged.
11 : : * 2. Redistributions in binary form must reproduce the above copyright
12 : : * notice, this list of conditions and the following disclaimer in the
13 : : * documentation and/or other materials provided with the distribution.
14 : : *
15 : : * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16 : : * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 : : * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 : : * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19 : : * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 : : * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 : : * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 : : * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 : : * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 : : */
26 : :
27 : : #ifdef HAVE_CONFIG_H
28 : : #include "pkg_config.h"
29 : : #endif
30 : :
31 : : #include <bsd_compat.h>
32 : : #include <getopt.h>
33 : : #include <signal.h>
34 : : #include <stdio.h>
35 : : #include <string.h>
36 : :
37 : : #ifdef HAVE_READPASSPHRASE_H
38 : : #include <readpassphrase.h>
39 : : #elif defined(HAVE_BSD_READPASSPHRASE_H)
40 : : #include <bsd/readpassphrase.h>
41 : : #else
42 : : #include "readpassphrase_compat.h"
43 : : #endif
44 : :
45 : : #include <unistd.h>
46 : :
47 : : #include <pkg.h>
48 : : #include "pkgcli.h"
49 : :
50 : : void
51 : 0 : usage_repo(void)
52 : : {
53 : 0 : fprintf(stderr, "Usage: pkg repo [-lqL] [-o output-dir] <repo-path> "
54 : : "[rsa:<rsa-key>|signing_command: <the command>]\n\n");
55 : 0 : fprintf(stderr, "For more information see 'pkg help repo'.\n");
56 : 0 : }
57 : :
58 : : static int
59 : 0 : password_cb(char *buf, int size, int rwflag, void *key)
60 : : {
61 : 0 : int len = 0;
62 : : char pass[BUFSIZ];
63 : : sigset_t sig, oldsig;
64 : :
65 : 0 : (void)rwflag;
66 : 0 : (void)key;
67 : :
68 : : /* Block sigalarm temporary */
69 : 0 : sigemptyset(&sig);
70 : 0 : sigaddset(&sig, SIGALRM);
71 : 0 : sigprocmask(SIG_BLOCK, &sig, &oldsig);
72 : :
73 [ # # ]: 0 : if (readpassphrase("\nEnter passphrase: ", pass, BUFSIZ, RPP_ECHO_OFF) == NULL)
74 : 0 : return 0;
75 : :
76 : 0 : len = strlen(pass);
77 : :
78 [ # # ]: 0 : if (len <= 0) return 0;
79 [ # # ]: 0 : if (len > size) len = size;
80 : :
81 : 0 : memset(buf, '\0', size);
82 : 0 : memcpy(buf, pass, len);
83 : 0 : memset(pass, 0, BUFSIZ);
84 : :
85 : 0 : sigprocmask(SIG_SETMASK, &oldsig, NULL);
86 : :
87 : 0 : return (len);
88 : 0 : }
89 : :
90 : : int
91 : 278 : exec_repo(int argc, char **argv)
92 : : {
93 : : int ret;
94 : : int ch;
95 : 278 : bool filelist = false;
96 : 278 : char *output_dir = NULL;
97 : 278 : char *meta_file = NULL;
98 : 278 : bool hash = false;
99 : 278 : bool hash_symlink = false;
100 : :
101 : 278 : hash = (getenv("PKG_REPO_HASH") != NULL);
102 : 278 : hash_symlink = (getenv("PKG_REPO_SYMLINK") != NULL);
103 : :
104 : 278 : struct option longopts[] = {
105 : : { "hash", no_argument, NULL, 'h' },
106 : : { "list-files", no_argument, NULL, 'l' },
107 : : { "meta-file", required_argument, NULL, 'm' },
108 : : { "output-dir", required_argument, NULL, 'o' },
109 : : { "quiet", no_argument, NULL, 'q' },
110 : : { "symlink", no_argument, NULL, 's' },
111 : : { NULL, 0, NULL, 0 },
112 : : };
113 : :
114 [ + + ]: 322 : while ((ch = getopt_long(argc, argv, "+hlo:qm:s", longopts, NULL)) != -1) {
115 [ - - + - : 44 : switch (ch) {
+ - - ]
116 : : case 'h':
117 : 0 : hash = true;
118 : 0 : break;
119 : : case 'l':
120 : 0 : filelist = true;
121 : 0 : break;
122 : : case 'o':
123 : 28 : output_dir = optarg;
124 : 28 : break;
125 : : case 'q':
126 : 0 : quiet = true;
127 : 0 : break;
128 : : case 'm':
129 : 16 : meta_file = optarg;
130 : 16 : break;
131 : : case 's':
132 : 0 : hash_symlink = true;
133 : 0 : break;
134 : : default:
135 : 0 : usage_repo();
136 : 0 : return (EXIT_FAILURE);
137 : : }
138 : : }
139 : 278 : argc -= optind;
140 : 278 : argv += optind;
141 : :
142 [ + - ]: 278 : if (argc < 1) {
143 : 0 : usage_repo();
144 : 0 : return (EXIT_FAILURE);
145 : : }
146 : :
147 [ + + + - ]: 278 : if (argc > 2 && strcmp(argv[1], "signing_command:") != 0) {
148 : 0 : usage_repo();
149 : 0 : return (EXIT_FAILURE);
150 : : }
151 : :
152 [ + + ]: 278 : if (output_dir == NULL)
153 : 250 : output_dir = argv[0];
154 : :
155 : 556 : ret = pkg_create_repo(argv[0], output_dir, filelist, meta_file, hash,
156 : 278 : hash_symlink);
157 : :
158 [ - + ]: 278 : if (ret != EPKG_OK) {
159 : 0 : printf("Cannot create repository catalogue\n");
160 : 0 : return (EXIT_FAILURE);
161 : : }
162 : :
163 [ + - + - : 834 : if (pkg_finish_repo(output_dir, password_cb, argv + 1, argc - 1,
+ - ]
164 : 556 : filelist) != EPKG_OK)
165 : 0 : return (EXIT_FAILURE);
166 : :
167 : 278 : return (EXIT_SUCCESS);
168 : 278 : }
|