diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index a1e82fea215..e17f18b9ea4 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -2320,19 +2320,6 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname - - servicefile - - - This option specifies the name of the per-user connection service file - (see ). - Defaults to ~/.pg_service.conf, or - %APPDATA%\postgresql\.pg_service.conf on - Microsoft Windows. - - - - target_session_attrs @@ -9170,8 +9157,12 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough) PGSERVICEFILE - PGSERVICEFILE behaves the same as the - connection parameter. + PGSERVICEFILE specifies the name of the per-user + connection service file + (see ). + Defaults to ~/.pg_service.conf, or + %APPDATA%\postgresql\.pg_service.conf on + Microsoft Windows. @@ -9612,8 +9603,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough) On Microsoft Windows, it is named %APPDATA%\postgresql\.pg_service.conf (where %APPDATA% refers to the Application Data subdirectory - in the user's profile). A different file name can be specified using the - servicefile key word in a libpq connection string or by + in the user's profile). A different file name can be specified by setting the environment variable PGSERVICEFILE. The system-wide file is named pg_service.conf. By default it is sought in the etc directory diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index a08c9332384..6c437cc5ac0 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -4688,15 +4688,6 @@ bar - - SERVICEFILE - - - The service file name, if applicable. - - - - SHELL_ERROR diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index f130687d7ed..f5fe9d2fb9e 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -4587,7 +4587,6 @@ SyncVariables(void) char vbuf[32]; const char *server_version; char *service_name; - char *service_file; /* get stuff from connection */ pset.encoding = PQclientEncoding(pset.db); @@ -4607,11 +4606,6 @@ SyncVariables(void) if (service_name) pg_free(service_name); - service_file = get_conninfo_value("servicefile"); - SetVariable(pset.vars, "SERVICEFILE", service_file); - if (service_file) - pg_free(service_file); - /* this bit should match connection_warnings(): */ /* Try to get full text form of version, might include "devel" etc */ server_version = PQparameterStatus(pset.db, "server_version"); @@ -4641,7 +4635,6 @@ UnsyncVariables(void) { SetVariable(pset.vars, "DBNAME", NULL); SetVariable(pset.vars, "SERVICE", NULL); - SetVariable(pset.vars, "SERVICEFILE", NULL); SetVariable(pset.vars, "USER", NULL); SetVariable(pset.vars, "HOST", NULL); SetVariable(pset.vars, "PORT", NULL); diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index ad8ae163699..357a67b47aa 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -202,10 +202,6 @@ static const internalPQconninfoOption PQconninfoOptions[] = { "Database-Service", "", 20, offsetof(struct pg_conn, pgservice)}, - {"servicefile", "PGSERVICEFILE", NULL, NULL, - "Database-Service-File", "", 64, - offsetof(struct pg_conn, pgservicefile)}, - {"user", "PGUSER", NULL, NULL, "Database-User", "", 20, offsetof(struct pg_conn, pguser)}, @@ -5081,7 +5077,6 @@ freePGconn(PGconn *conn) free(conn->dbName); free(conn->replication); free(conn->pgservice); - free(conn->pgservicefile); free(conn->pguser); if (conn->pgpass) { @@ -5959,7 +5954,6 @@ static int parseServiceInfo(PQconninfoOption *options, PQExpBuffer errorMessage) { const char *service = conninfo_getval(options, "service"); - const char *service_fname = conninfo_getval(options, "servicefile"); char serviceFile[MAXPGPATH]; char *env; bool group_found = false; @@ -5979,13 +5973,10 @@ parseServiceInfo(PQconninfoOption *options, PQExpBuffer errorMessage) return 0; /* - * First, try the "servicefile" option in connection string. Then, try - * the PGSERVICEFILE environment variable. Finally, check - * ~/.pg_service.conf (if that exists). + * Try PGSERVICEFILE if specified, else try ~/.pg_service.conf (if that + * exists). */ - if (service_fname != NULL) - strlcpy(serviceFile, service_fname, sizeof(serviceFile)); - else if ((env = getenv("PGSERVICEFILE")) != NULL) + if ((env = getenv("PGSERVICEFILE")) != NULL) strlcpy(serviceFile, env, sizeof(serviceFile)); else { @@ -6017,18 +6008,6 @@ next_file: if (status != 0) return status; - /* Update servicefile to the file that actually supplied the service */ - if (group_found && service_fname != NULL && - conninfo_storeval(options, "servicefile", serviceFile, - errorMessage, false, false) == NULL) - { - /* - * conninfo_storeval already set an error message, that could be only - * an OOM. - */ - return 3; - } - last_file: if (!group_found) { @@ -6153,17 +6132,7 @@ parseServiceFile(const char *serviceFile, if (strcmp(key, "service") == 0) { libpq_append_error(errorMessage, - "nested \"service\" specifications not supported in service file \"%s\", line %d", - serviceFile, - linenr); - result = 3; - goto exit; - } - - if (strcmp(key, "servicefile") == 0) - { - libpq_append_error(errorMessage, - "nested \"servicefile\" specifications not supported in service file \"%s\", line %d", + "nested service specifications not supported in service file \"%s\", line %d", serviceFile, linenr); result = 3; @@ -6206,33 +6175,6 @@ parseServiceFile(const char *serviceFile, } exit: - - /* - * If a service has been successfully found, set the "servicefile" option - * if not already set. This matters when we use a default service file or - * PGSERVICEFILE, where we want to be able track the value. - */ - if (*group_found && result == 0) - { - for (i = 0; options[i].keyword; i++) - { - if (strcmp(options[i].keyword, "servicefile") != 0) - continue; - - /* If value is already set, nothing to do */ - if (options[i].val != NULL) - break; - - options[i].val = strdup(serviceFile); - if (options[i].val == NULL) - { - libpq_append_error(errorMessage, "out of memory"); - result = 3; - } - break; - } - } - fclose(f); return result; diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index 61b9d486d29..750dfab2d40 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -392,8 +392,6 @@ struct pg_conn char *dbName; /* database name */ char *replication; /* connect as the replication standby? */ char *pgservice; /* Postgres service, if any */ - char *pgservicefile; /* path to a service file containing - * service(s) */ char *pguser; /* Postgres username and password, if any */ char *pgpass; char *pgpassfile; /* path to a file containing password(s) */ diff --git a/src/interfaces/libpq/t/006_service.pl b/src/interfaces/libpq/t/006_service.pl index 8e29880731f..be8a9ad0531 100644 --- a/src/interfaces/libpq/t/006_service.pl +++ b/src/interfaces/libpq/t/006_service.pl @@ -49,12 +49,6 @@ copy($srvfile_valid, $srvfile_nested) or die "Could not copy $srvfile_valid to $srvfile_nested: $!"; append_to_file($srvfile_nested, "service=invalid_srv\n"); -# Service file with nested "servicefile" defined. -my $srvfile_nested_2 = "$td/pg_service_nested_2.conf"; -copy($srvfile_valid, $srvfile_nested_2) - or die "Could not copy $srvfile_valid to $srvfile_nested_2: $!"; -append_to_file($srvfile_nested_2, 'servicefile=' . $srvfile_default . "\n"); - # Set the fallback directory lookup of the service file to the temporary # directory of this test. PGSYSCONFDIR is used if the service file # defined in PGSERVICEFILE cannot be found, or when a service file is @@ -143,14 +137,6 @@ local $ENV{PGSERVICEFILE} = "$srvfile_empty"; sql => "SELECT 'connect2_3'", expected_stdout => qr/connect2_3/); - my $srvfile_empty_win_cared = $srvfile_empty; - $srvfile_empty_win_cared =~ s/\\/\\\\/g; - $dummy_node->connect_ok( - q{service=my_srv servicefile='} . $srvfile_empty_win_cared . q{'}, - 'SERVICEFILE updated when service is found in default pg_service.conf', - sql => '\echo :SERVICEFILE', - expected_stdout => qr/^\Q$srvfile_default\E$/); - local $ENV{PGSERVICE} = 'undefined-service'; $dummy_node->connect_fails( '', @@ -168,77 +154,9 @@ local $ENV{PGSERVICEFILE} = "$srvfile_empty"; $dummy_node->connect_fails( 'service=my_srv', - 'connection with "service" in nested service file', + 'connection with nested service file', expected_stderr => - qr/nested "service" specifications not supported in service file/); - - local $ENV{PGSERVICEFILE} = $srvfile_nested_2; - - $dummy_node->connect_fails( - 'service=my_srv', - 'connection with "servicefile" in nested service file', - expected_stderr => - qr/nested "servicefile" specifications not supported in service file/ - ); -} - -# Properly escape backslashes in the path, to ensure the generation of -# correct connection strings. -my $srvfile_win_cared = $srvfile_valid; -$srvfile_win_cared =~ s/\\/\\\\/g; - -# Checks that the "servicefile" option works as expected -{ - $dummy_node->connect_ok( - q{service=my_srv servicefile='} . $srvfile_win_cared . q{'}, - 'connection with valid servicefile in connection string', - sql => "SELECT 'connect3_1'", - expected_stdout => qr/connect3_1/); - - # Encode slashes and backslash - my $encoded_srvfile = $srvfile_valid =~ s{([\\/])}{ - $1 eq '/' ? '%2F' : '%5C' - }ger; - - # Additionally encode a colon in servicefile path of Windows - $encoded_srvfile =~ s/:/%3A/g; - - $dummy_node->connect_ok( - 'postgresql:///?service=my_srv&servicefile=' . $encoded_srvfile, - 'connection with valid servicefile in URI', - sql => "SELECT 'connect3_2'", - expected_stdout => qr/connect3_2/); - - local $ENV{PGSERVICE} = 'my_srv'; - $dummy_node->connect_ok( - q{servicefile='} . $srvfile_win_cared . q{'}, - 'connection with PGSERVICE and servicefile in connection string', - sql => "SELECT 'connect3_3'", - expected_stdout => qr/connect3_3/); - - $dummy_node->connect_ok( - 'postgresql://?servicefile=' . $encoded_srvfile, - 'connection with PGSERVICE and servicefile in URI', - sql => "SELECT 'connect3_4'", - expected_stdout => qr/connect3_4/); -} - -# Check that the "servicefile" option takes priority over the PGSERVICEFILE -# environment variable. -{ - local $ENV{PGSERVICEFILE} = 'non-existent-file.conf'; - - $dummy_node->connect_fails( - 'service=my_srv', - 'connection with invalid PGSERVICEFILE', - expected_stderr => - qr/service file "non-existent-file\.conf" not found/); - - $dummy_node->connect_ok( - q{service=my_srv servicefile='} . $srvfile_win_cared . q{'}, - 'connection with both servicefile and PGSERVICEFILE', - sql => "SELECT 'connect4_1'", - expected_stdout => qr/connect4_1/); + qr/nested service specifications not supported in service file/); } $node->teardown_node;