1 /*
2 * uri-regress.c
3 * A test program for libpq URI format
4 *
5 * This is a helper for libpq conninfo regression testing. It takes a single
6 * conninfo string as a parameter, parses it using PQconninfoParse, and then
7 * prints out the values from the parsed PQconninfoOption struct that differ
8 * from the defaults (obtained from PQconndefaults).
9 *
10 * Portions Copyright (c) 2012-2017, PostgreSQL Global Development Group
11 *
12 * IDENTIFICATION
13 * src/interfaces/libpq/test/uri-regress.c
14 */
15
16 #include "postgres_fe.h"
17
18 #include "libpq-fe.h"
19
20 int
main(int argc,char * argv[])21 main(int argc, char *argv[])
22 {
23 PQconninfoOption *opts;
24 PQconninfoOption *defs;
25 PQconninfoOption *opt;
26 PQconninfoOption *def;
27 char *errmsg = NULL;
28 bool local = true;
29
30 if (argc != 2)
31 return 1;
32
33 opts = PQconninfoParse(argv[1], &errmsg);
34 if (opts == NULL)
35 {
36 fprintf(stderr, "uri-regress: %s", errmsg);
37 return 1;
38 }
39
40 defs = PQconndefaults();
41 if (defs == NULL)
42 {
43 fprintf(stderr, "uri-regress: cannot fetch default options\n");
44 return 1;
45 }
46
47 /*
48 * Loop on the options, and print the value of each if not the default.
49 *
50 * XXX this coding assumes that PQconninfoOption structs always have the
51 * keywords in the same order.
52 */
53 for (opt = opts, def = defs; opt->keyword; ++opt, ++def)
54 {
55 if (opt->val != NULL)
56 {
57 if (def->val == NULL || strcmp(opt->val, def->val) != 0)
58 printf("%s='%s' ", opt->keyword, opt->val);
59
60 /*
61 * Try to detect if this is a Unix-domain socket or inet. This is
62 * a bit grotty but it's the same thing that libpq itself does.
63 *
64 * Note that we directly test for '/' instead of using
65 * is_absolute_path, as that would be considerably more messy.
66 * This would fail on Windows, but that platform doesn't have
67 * Unix-domain sockets anyway.
68 */
69 if (*opt->val &&
70 (strcmp(opt->keyword, "hostaddr") == 0 ||
71 (strcmp(opt->keyword, "host") == 0 && *opt->val != '/')))
72 {
73 local = false;
74 }
75 }
76 }
77
78 if (local)
79 printf("(local)\n");
80 else
81 printf("(inet)\n");
82
83 return 0;
84 }
85