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-2021, 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