pwmd_command() will return PWMD_AGENT_ERROR and set error to -1 if
[pwmd.git] / libpwmd / exampleclient.c
blob58a3f3e22586e3fb430dc38be8e15ede7a7061bb
1 /* vim:tw=78:ts=8:sw=4:set ft=c: */
2 /*
3 Copyright (C) 2006 Ben Kibbey <bjk@luxsci.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <unistd.h>
22 #include <err.h>
23 #include <errno.h>
24 #include <pwd.h>
25 #include <string.h>
26 #include <limits.h>
27 #include <fcntl.h>
28 #include <libpwmd.h>
30 int main(int argc, char *argv[])
32 pwm_t *pwm;
33 struct passwd *pw = getpwuid(getuid());
34 char buf[LINE_MAX];
35 int error;
36 void *result;
37 char **list, *value;
38 int i;
39 int ret;
40 int opt;
41 char *socketpath = NULL;
42 int noagent = 1;
44 while ((opt = getopt(argc, argv, "hs:a")) != EOF) {
45 switch (opt) {
46 case 'a':
47 noagent = 0;
48 break;
49 case 's':
50 socketpath = optarg;
51 break;
52 case 'h':
53 default:
54 fprintf(stderr, "Usage: %s [-h] [-a] [-s <socketpath>]\n"
55 " -a use gpg-agent\n"
56 " -s specify an alternate socket path\n"
57 " -h this help text\n", argv[0]);
58 exit(EXIT_SUCCESS);
62 if (!socketpath) {
63 snprintf(buf, sizeof(buf), "%s/.pwmd/socket", pw->pw_dir);
64 socketpath = buf;
67 fprintf(stderr, "Connecting to socket...\n");
68 if ((pwm = pwmd_connect(socketpath, &error)) == NULL)
69 errx(EXIT_FAILURE, "pwmd_connect(): %s", strerror(error));
71 fprintf(stderr, "Connected. fd=%i\n", pwm->fd);
73 if (noagent) {
74 fprintf(stderr, "Setting password 'test'...\n");
76 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETOPT,
77 PWMD_OPTION_PASSWORD, "test")) != PWMD_OK) {
78 pwmd_close(pwm);
80 if (ret == PWMD_ERROR)
81 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", strerror(error));
82 else
83 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", pwmd_strerror(error));
86 else {
87 fprintf(stderr, "Setting PWMD_OPTION_USEAGENT...\n");
88 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETOPT,
89 PWMD_OPTION_USEAGENT, 1)) != PWMD_OK) {
90 pwmd_close(pwm);
92 if (ret == PWMD_ERROR)
93 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", strerror(error));
94 else
95 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", pwmd_strerror(error));
98 fprintf(stderr, "Setting PWMD_OPTION_TITLE...\n");
99 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETOPT,
100 PWMD_OPTION_TITLE, "PWMD Client Test")) != PWMD_OK) {
101 pwmd_close(pwm);
103 if (ret == PWMD_ERROR)
104 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", strerror(error));
105 else
106 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", pwmd_strerror(error));
109 fprintf(stderr, "Setting PWMD_OPTION_PROMPT...\n");
110 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETOPT,
111 PWMD_OPTION_PROMPT, "Password please: ")) != PWMD_OK) {
112 pwmd_close(pwm);
114 if (ret == PWMD_ERROR)
115 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", strerror(error));
116 else
117 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", pwmd_strerror(error));
120 fprintf(stderr, "Setting PWMD_OPTION_DESC...\n");
121 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETOPT,
122 PWMD_OPTION_DESC, "Enter the password for file \"testfile\".")) != PWMD_OK) {
123 pwmd_close(pwm);
125 if (ret == PWMD_ERROR)
126 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", strerror(error));
127 else
128 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", pwmd_strerror(error));
132 fprintf(stderr, "Opening 'testfile'...\n");
133 if ((ret = pwmd_command(pwm, &result, &error, PWMD_OPEN, "testfile")) != PWMD_OK) {
134 pwmd_close(pwm);
136 if (ret == PWMD_ERROR)
137 errx(EXIT_FAILURE, "PWMD_OPEN: %s", strerror(error));
138 else if (ret == PWMD_PERROR)
139 errx(EXIT_FAILURE, "PWMD_OPEN: %s", pwmd_strerror(error));
140 else
141 errx(EXIT_FAILURE, "PWMD_OPEN: gpg-agent failed. Is GPG_AGENT_INFO set?");
144 fprintf(stderr, "File opened. Creating 'newaccount' and test element...\n");
145 if ((ret = pwmd_command(pwm, &result, &error, PWMD_STORE, "newaccount\tsmtp\thostname\tsomehost.com")) != PWMD_OK) {
146 pwmd_close(pwm);
148 if (ret == PWMD_ERROR)
149 errx(EXIT_FAILURE, "PWMD_STORE: %s", strerror(error));
150 else
151 errx(EXIT_FAILURE, "PWMD_STORE: %s", pwmd_strerror(error));
154 fprintf(stderr, "OK. Testing invalid command syntax...\n");
155 if ((ret = pwmd_command(pwm, &result, &error, PWMD_GET, "newaccount\tnop")) != PWMD_OK) {
156 if (ret == PWMD_ERROR) {
157 pwmd_close(pwm);
158 errx(EXIT_FAILURE, "PWMD_STORE: %s", strerror(error));
160 else
161 fprintf(stderr, "OK, the error was: %s\n", pwmd_strerror(error));
164 fprintf(stderr, "OK. Creating another element...\n");
165 if ((ret = pwmd_command(pwm, &result, &error, PWMD_STORE, "newaccount\tsmtp\tport\t25")) != PWMD_OK) {
166 pwmd_close(pwm);
168 if (ret == PWMD_ERROR)
169 errx(EXIT_FAILURE, "PWMD_STORE: %s", strerror(error));
170 else
171 errx(EXIT_FAILURE, "PWMD_STORE: %s", pwmd_strerror(error));
174 fprintf(stderr, "OK. Testing PWMD_LIST for account list...\n");
175 if ((ret = pwmd_command(pwm, &result, &error, PWMD_LIST)) != PWMD_OK) {
176 pwmd_close(pwm);
178 if (ret == PWMD_ERROR)
179 errx(EXIT_FAILURE, "PWMD_LIST: %s", strerror(error));
180 else
181 errx(EXIT_FAILURE, "PWMD_LIST: %s", pwmd_strerror(error));
184 list = result;
186 for (i = 0; list[i]; i++) {
187 fprintf(stderr, "%s\n", list[i]);
188 free(list[i]);
191 free(result);
193 fprintf(stderr, "OK. Testing PWMD_LIST_ACCOUNT for specific account 'newaccount'...\n");
194 if ((ret = pwmd_command(pwm, &result, &error, PWMD_LIST_ACCOUNT, "newaccount")) != PWMD_OK) {
195 pwmd_close(pwm);
197 if (ret == PWMD_ERROR)
198 errx(EXIT_FAILURE, "PWMD_LIST_ACCOUNT: %s", strerror(error));
199 else
200 errx(EXIT_FAILURE, "PWMD_LIST_ACCOUNT: %s", pwmd_strerror(error));
203 list = result;
205 for (i = 0; list[i]; i++) {
206 fprintf(stderr, "%s\n", list[i]);
207 free(list[i]);
210 free(result);
211 fprintf(stderr, "OK. PWMD_GET'ing a single element from 'newaccount'...\n");
212 if ((ret = pwmd_command(pwm, &result, &error, PWMD_GET, "newaccount\tsmtp\thostname")) != PWMD_OK) {
213 pwmd_close(pwm);
215 if (ret == PWMD_ERROR)
216 errx(EXIT_FAILURE, "PWMD_GET: %s", strerror(error));
217 else
218 errx(EXIT_FAILURE, "PWMD_GET: %s", pwmd_strerror(error));
221 value = result;
222 fprintf(stderr, "%s\n", value);
223 free(result);
225 fprintf(stderr, "OK. Changing account 'newaccount' to 'namechange'...\n");
226 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETATTR, "newaccount", PWMD_ATTR_NAME, "namechange")) != PWMD_OK) {
227 pwmd_close(pwm);
229 if (ret == PWMD_ERROR)
230 errx(EXIT_FAILURE, "PWMD_SETATTR: %s", strerror(error));
231 else
232 errx(EXIT_FAILURE, "PWMD_SETATTR: %s", pwmd_strerror(error));
235 fprintf(stderr, "OK. see!\n");
236 if ((ret = pwmd_command(pwm, &result, &error, PWMD_LIST)) != PWMD_OK) {
237 pwmd_close(pwm);
239 if (ret == PWMD_ERROR)
240 errx(EXIT_FAILURE, "PWMD_LIST: %s", strerror(error));
241 else
242 errx(EXIT_FAILURE, "PWMD_LIST: %s", pwmd_strerror(error));
245 list = result;
247 for (i = 0; list[i]; i++) {
248 fprintf(stderr, "%s\n", list[i]);
249 free(list[i]);
252 free(result);
253 fprintf(stderr, "No really!\n");
254 if ((ret = pwmd_command(pwm, &result, &error, PWMD_LIST_ACCOUNT, "namechange")) != PWMD_OK) {
255 pwmd_close(pwm);
257 if (ret == PWMD_ERROR)
258 errx(EXIT_FAILURE, "PWMD_LIST_ACCOUNT: %s", strerror(error));
259 else
260 errx(EXIT_FAILURE, "PWMD_LIST_ACCOUNT: %s", pwmd_strerror(error));
263 list = result;
265 for (i = 0; list[i]; i++) {
266 fprintf(stderr, "%s\n", list[i]);
267 free(list[i]);
270 free(result);
271 fprintf(stderr, "Testing PWMD_DELETE of 'namechange\\tsmtp'...\n");
272 if ((ret = pwmd_command(pwm, &result, &error, PWMD_DELETE, "namechange\tsmtp")) != PWMD_OK) {
273 pwmd_close(pwm);
275 if (ret == PWMD_ERROR)
276 errx(EXIT_FAILURE, "PWMD_DELETE: %s", strerror(error));
277 else
278 errx(EXIT_FAILURE, "PWMD_DELETE: %s", pwmd_strerror(error));
281 fprintf(stderr, "OK. New pop3 tree (PWMD_STORE)...\n");
282 if ((ret = pwmd_command(pwm, &result, &error, PWMD_STORE, "namechange\tpop3\thostname\tsomehost.com")) != PWMD_OK) {
283 pwmd_close(pwm);
285 if (ret == PWMD_ERROR)
286 errx(EXIT_FAILURE, "PWMD_STORE: %s", strerror(error));
287 else
288 errx(EXIT_FAILURE, "PWMD_STORE: %s", pwmd_strerror(error));
291 fprintf(stderr, "OK. PWMD_LIST_ACCOUNT of account 'namechange'...\n");
292 if ((ret = pwmd_command(pwm, &result, &error, PWMD_LIST_ACCOUNT, "namechange")) != PWMD_OK) {
293 pwmd_close(pwm);
295 if (ret == PWMD_ERROR)
296 errx(EXIT_FAILURE, "PWMD_LIST_ACCOUNT: %s", strerror(error));
297 else
298 errx(EXIT_FAILURE, "PWMD_LIST_ACCOUNT: %s", pwmd_strerror(error));
301 list = result;
303 for (i = 0; list[i]; i++) {
304 fprintf(stderr, "%s\n", list[i]);
305 free(list[i]);
308 free(result);
309 if (noagent == 0) {
310 fprintf(stderr, "Setting PWMD_OPTION_DESC...\n");
311 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETOPT,
312 PWMD_OPTION_DESC, "Enter the new password for file \"testfile\".")) != PWMD_OK) {
313 pwmd_close(pwm);
315 if (ret == PWMD_ERROR)
316 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", strerror(error));
317 else
318 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", pwmd_strerror(error));
322 fprintf(stderr, "OK. PWMD_SAVE...\n");
323 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SAVE)) != PWMD_OK) {
324 pwmd_close(pwm);
326 if (ret == PWMD_ERROR)
327 errx(EXIT_FAILURE, "PWMD_SAVE: %s", strerror(error));
328 else if (ret == PWMD_PERROR)
329 errx(EXIT_FAILURE, "PWMD_SAVE: %s", pwmd_strerror(error));
330 else
331 errx(EXIT_FAILURE, "PWMD_OPEN: gpg-agent failed. Is GPG_AGENT_INFO set?");
334 pwmd_close(pwm);
336 fprintf(stderr, "Done! delete the file 'testfile' in your PWMD data directory\n");
337 exit(EXIT_SUCCESS);