aboutsummaryrefslogtreecommitdiff
path: root/src/bin/psql/command.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/psql/command.c')
-rw-r--r--src/bin/psql/command.c87
1 files changed, 70 insertions, 17 deletions
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index fbff2092624..35da9cdf829 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.155 2005/12/08 21:18:22 petere Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.156 2005/12/18 02:17:16 petere Exp $
*/
#include "postgres_fe.h"
#include "command.h"
@@ -35,6 +35,8 @@
#include "libpq-fe.h"
#include "pqexpbuffer.h"
+#include "libpq/crypt.h"
+#include "dumputils.h"
#include "common.h"
#include "copy.h"
@@ -81,7 +83,7 @@ backslashResult
HandleSlashCmds(PsqlScanState scan_state,
PQExpBuffer query_buf)
{
- backslashResult status = CMD_SKIP_LINE;
+ backslashResult status = PSQL_CMD_SKIP_LINE;
char *cmd;
char *arg;
@@ -93,7 +95,7 @@ HandleSlashCmds(PsqlScanState scan_state,
/* And try to execute it */
status = exec_command(cmd, scan_state, query_buf);
- if (status == CMD_UNKNOWN && strlen(cmd) > 1)
+ if (status == PSQL_CMD_UNKNOWN && strlen(cmd) > 1)
{
/*
* If the command was not recognized, try to parse it as a one-letter
@@ -110,23 +112,23 @@ HandleSlashCmds(PsqlScanState scan_state,
status = exec_command(new_cmd, scan_state, query_buf);
- if (status != CMD_UNKNOWN)
+ if (status != PSQL_CMD_UNKNOWN)
{
/* adjust cmd for possible messages below */
cmd[1] = '\0';
}
}
- if (status == CMD_UNKNOWN)
+ if (status == PSQL_CMD_UNKNOWN)
{
if (pset.cur_cmd_interactive)
fprintf(stderr, _("Invalid command \\%s. Try \\? for help.\n"), cmd);
else
psql_error("invalid command \\%s\n", cmd);
- status = CMD_ERROR;
+ status = PSQL_CMD_ERROR;
}
- if (status != CMD_ERROR)
+ if (status != PSQL_CMD_ERROR)
{
/* eat any remaining arguments after a valid command */
/* note we suppress evaluation of backticks here */
@@ -164,7 +166,7 @@ exec_command(const char *cmd,
bool success = true; /* indicate here if the command ran ok or
* failed */
bool quiet = QUIET();
- backslashResult status = CMD_SKIP_LINE;
+ backslashResult status = PSQL_CMD_SKIP_LINE;
/*
* \a -- toggle field alignment This makes little sense but we keep it
@@ -368,7 +370,7 @@ exec_command(const char *cmd,
break;
default:
- status = CMD_UNKNOWN;
+ status = PSQL_CMD_UNKNOWN;
}
if (pattern)
@@ -387,7 +389,7 @@ exec_command(const char *cmd,
if (!query_buf)
{
psql_error("no query buffer\n");
- status = CMD_ERROR;
+ status = PSQL_CMD_ERROR;
}
else
{
@@ -396,7 +398,7 @@ exec_command(const char *cmd,
expand_tilde(&fname);
if (fname)
canonicalize_path(fname);
- status = do_edit(fname, query_buf) ? CMD_NEWEDIT : CMD_ERROR;
+ status = do_edit(fname, query_buf) ? PSQL_CMD_NEWEDIT : PSQL_CMD_ERROR;
free(fname);
}
}
@@ -486,7 +488,7 @@ exec_command(const char *cmd,
pset.gfname = pg_strdup(fname);
}
free(fname);
- status = CMD_SEND;
+ status = PSQL_CMD_SEND;
}
/* help */
@@ -590,7 +592,7 @@ exec_command(const char *cmd,
}
else
- status = CMD_UNKNOWN;
+ status = PSQL_CMD_UNKNOWN;
free(opt1);
free(opt2);
@@ -618,6 +620,57 @@ exec_command(const char *cmd,
fflush(stdout);
}
+ /* \password -- set user password */
+ else if (strcmp(cmd, "password") == 0)
+ {
+ char *pw1;
+ char *pw2;
+
+ pw1 = simple_prompt("Enter new password: ", 100, false);
+ pw2 = simple_prompt("Enter it again: ", 100, false);
+
+ if (strcmp(pw1, pw2) != 0)
+ {
+ fprintf(stderr, _("Passwords didn't match.\n"));
+ success = false;
+ }
+ else
+ {
+ char *opt0 = psql_scan_slash_option(scan_state, OT_SQLID, NULL, true);
+ char *user;
+ char encrypted_password[MD5_PASSWD_LEN + 1];
+
+ if (opt0)
+ user = opt0;
+ else
+ user = PQuser(pset.db);
+
+ if (!pg_md5_encrypt(pw1, user, strlen(user), encrypted_password))
+ {
+ fprintf(stderr, _("Password encryption failed.\n"));
+ success = false;
+ }
+ else
+ {
+ PQExpBufferData buf;
+ PGresult *res;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf, "ALTER ROLE %s PASSWORD '%s';",
+ fmtId(user), encrypted_password);
+ res = PSQLexec(buf.data, false);
+ termPQExpBuffer(&buf);
+ if (!res)
+ success = false;
+ else
+ PQclear(res);
+ }
+ }
+
+ free(pw1);
+ free(pw2);
+ }
+
/* \pset -- set printing parameters */
else if (strcmp(cmd, "pset") == 0)
{
@@ -640,7 +693,7 @@ exec_command(const char *cmd,
/* \q or \quit */
else if (strcmp(cmd, "q") == 0 || strcmp(cmd, "quit") == 0)
- status = CMD_TERMINATE;
+ status = PSQL_CMD_TERMINATE;
/* reset(clear) the buffer */
else if (strcmp(cmd, "r") == 0 || strcmp(cmd, "reset") == 0)
@@ -780,7 +833,7 @@ exec_command(const char *cmd,
if (!query_buf)
{
psql_error("no query buffer\n");
- status = CMD_ERROR;
+ status = PSQL_CMD_ERROR;
}
else
{
@@ -884,10 +937,10 @@ exec_command(const char *cmd,
#endif
else
- status = CMD_UNKNOWN;
+ status = PSQL_CMD_UNKNOWN;
if (!success)
- status = CMD_ERROR;
+ status = PSQL_CMD_ERROR;
return status;
}