1 /*-
2 * Copyright (c) 2009,2010 The NetBSD Foundation, Inc.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to The NetBSD Foundation
6 * by Alistair Crooks (agc@NetBSD.org)
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 */
29 #ifdef HAVE_CONFIG_H
30 #include "config.h"
31 #endif
32
33 #include <sys/types.h>
34 #include <sys/param.h>
35 #include <sys/stat.h>
36
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #include <unistd.h>
41
42 #include "hkpd.h"
43
44 #define HAVE_DAEMON 1
45
46 /* set the home directory value to "home/subdir" */
47 static int
set_homedir(netpgp_t * netpgp,char * home,const char * subdir,const int quiet)48 set_homedir(netpgp_t *netpgp, char *home, const char *subdir, const int quiet)
49 {
50 struct stat st;
51 char d[MAXPATHLEN];
52
53 if (home == NULL) {
54 if (!quiet) {
55 (void) fprintf(stderr, "NULL HOME directory\n");
56 }
57 return 0;
58 }
59 (void) snprintf(d, sizeof(d), "%s%s", home, (subdir) ? subdir : "");
60 if (stat(d, &st) == 0) {
61 if ((st.st_mode & S_IFMT) == S_IFDIR) {
62 netpgp_setvar(netpgp, "homedir", d);
63 return 1;
64 }
65 (void) fprintf(stderr, "netpgp: homedir \"%s\" is not a dir\n",
66 d);
67 return 0;
68 }
69 if (!quiet) {
70 (void) fprintf(stderr,
71 "netpgp: warning homedir \"%s\" not found\n", d);
72 }
73 return 1;
74 }
75
76 int
main(int argc,char ** argv)77 main(int argc, char **argv)
78 {
79 netpgp_t netpgp;
80 char *family;
81 char *host;
82 int daemonise;
83 int port;
84 int sock6;
85 int sock4;
86 int i;
87
88 (void) memset(&netpgp, 0x0, sizeof(netpgp));
89 /* set some defaults */
90 set_homedir(&netpgp, getenv("HOME"), "/.gnupg", 1);
91 port = 11371;
92 host = strdup("localhost");
93 daemonise = 1;
94 family = strdup("46");
95 while ((i = getopt(argc, argv, "DH:S:Vf:h:p:v:")) != -1) {
96 switch(i) {
97 case 'D':
98 daemonise = 0;
99 break;
100 case 'H':
101 set_homedir(&netpgp, optarg, NULL, 0);
102 break;
103 case 'S':
104 netpgp_setvar(&netpgp, "ssh keys", "1");
105 netpgp_setvar(&netpgp, "sshkeyfile", optarg);
106 break;
107 case 'V':
108 printf("%s: Version %d\n", *argv, HKPD_VERSION);
109 exit(EXIT_SUCCESS);
110 case 'f':
111 (void) free(family);
112 family = strdup(optarg);
113 break;
114 case 'h':
115 (void) free(host);
116 host = strdup(optarg);
117 break;
118 case 'p':
119 port = atoi(optarg);
120 break;
121 case 'v':
122 netpgp_set_debug(optarg);
123 break;
124 default:
125 break;
126 }
127 }
128 #ifdef HAVE_DAEMON
129 /* if we are supposed to be a daemon, detach from controlling tty */
130 if (daemonise && daemon(0, 0) < 0) {
131 (void) fprintf(stderr, "daemon() failed\n");
132 exit(EXIT_FAILURE);
133 }
134 #endif
135 if (!netpgp_init(&netpgp)) {
136 (void) fprintf(stderr, "can't initialise\n");
137 exit(EXIT_FAILURE);
138 }
139 sock4 = sock6 = -1;
140 if (strchr(family, '4') != NULL &&
141 (sock4 = hkpd_sock_bind(host, port, 4)) < 0) {
142 (void) fprintf(stderr,"hkpd: can't bind inet4 socket\n");
143 }
144 if (strchr(family, '6') != NULL &&
145 (sock6 = hkpd_sock_bind(host, port, 6)) < 0) {
146 (void) fprintf(stderr,"hkpd: can't bind inet6 socket\n");
147 }
148 if (sock4 < 0 && sock6 < 0) {
149 (void) fprintf(stderr,"hkpd: no sockets available\n");
150 exit(EXIT_FAILURE);
151 }
152 hkpd(&netpgp, sock4, sock6);
153 }
154