33 *
44 * Copyright (c) 2000-2005, PostgreSQL Global Development Group
55 *
6- * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.155 2005/12/08 21:18:22 petere Exp $
6+ * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.156 2005/12/18 02:17:16 petere Exp $
77 */
88#include "postgres_fe.h"
99#include "command.h"
3535
3636#include "libpq-fe.h"
3737#include "pqexpbuffer.h"
38+ #include "libpq/crypt.h"
39+ #include "dumputils.h"
3840
3941#include "common.h"
4042#include "copy.h"
@@ -81,7 +83,7 @@ backslashResult
8183HandleSlashCmds (PsqlScanState scan_state ,
8284PQExpBuffer query_buf )
8385{
84- backslashResult status = CMD_SKIP_LINE ;
86+ backslashResult status = PSQL_CMD_SKIP_LINE ;
8587char * cmd ;
8688char * arg ;
8789
@@ -93,7 +95,7 @@ HandleSlashCmds(PsqlScanState scan_state,
9395/* And try to execute it */
9496status = exec_command (cmd ,scan_state ,query_buf );
9597
96- if (status == CMD_UNKNOWN && strlen (cmd )> 1 )
98+ if (status == PSQL_CMD_UNKNOWN && strlen (cmd )> 1 )
9799{
98100/*
99101 * If the command was not recognized, try to parse it as a one-letter
@@ -110,23 +112,23 @@ HandleSlashCmds(PsqlScanState scan_state,
110112
111113status = exec_command (new_cmd ,scan_state ,query_buf );
112114
113- if (status != CMD_UNKNOWN )
115+ if (status != PSQL_CMD_UNKNOWN )
114116{
115117/* adjust cmd for possible messages below */
116118cmd [1 ]= '\0' ;
117119}
118120}
119121
120- if (status == CMD_UNKNOWN )
122+ if (status == PSQL_CMD_UNKNOWN )
121123{
122124if (pset .cur_cmd_interactive )
123125fprintf (stderr ,_ ("Invalid command \\%s. Try \\? for help.\n" ),cmd );
124126else
125127psql_error ("invalid command \\%s\n" ,cmd );
126- status = CMD_ERROR ;
128+ status = PSQL_CMD_ERROR ;
127129}
128130
129- if (status != CMD_ERROR )
131+ if (status != PSQL_CMD_ERROR )
130132{
131133/* eat any remaining arguments after a valid command */
132134/* note we suppress evaluation of backticks here */
@@ -164,7 +166,7 @@ exec_command(const char *cmd,
164166bool success = true;/* indicate here if the command ran ok or
165167 * failed */
166168bool quiet = QUIET ();
167- backslashResult status = CMD_SKIP_LINE ;
169+ backslashResult status = PSQL_CMD_SKIP_LINE ;
168170
169171/*
170172 * \a -- toggle field alignment This makes little sense but we keep it
@@ -368,7 +370,7 @@ exec_command(const char *cmd,
368370break ;
369371
370372default :
371- status = CMD_UNKNOWN ;
373+ status = PSQL_CMD_UNKNOWN ;
372374}
373375
374376if (pattern )
@@ -387,7 +389,7 @@ exec_command(const char *cmd,
387389if (!query_buf )
388390{
389391psql_error ("no query buffer\n" );
390- status = CMD_ERROR ;
392+ status = PSQL_CMD_ERROR ;
391393}
392394else
393395{
@@ -396,7 +398,7 @@ exec_command(const char *cmd,
396398expand_tilde (& fname );
397399if (fname )
398400canonicalize_path (fname );
399- status = do_edit (fname ,query_buf ) ?CMD_NEWEDIT :CMD_ERROR ;
401+ status = do_edit (fname ,query_buf ) ?PSQL_CMD_NEWEDIT :PSQL_CMD_ERROR ;
400402free (fname );
401403}
402404}
@@ -486,7 +488,7 @@ exec_command(const char *cmd,
486488pset .gfname = pg_strdup (fname );
487489}
488490free (fname );
489- status = CMD_SEND ;
491+ status = PSQL_CMD_SEND ;
490492}
491493
492494/* help */
@@ -590,7 +592,7 @@ exec_command(const char *cmd,
590592}
591593
592594else
593- status = CMD_UNKNOWN ;
595+ status = PSQL_CMD_UNKNOWN ;
594596
595597free (opt1 );
596598free (opt2 );
@@ -618,6 +620,57 @@ exec_command(const char *cmd,
618620fflush (stdout );
619621}
620622
623+ /* \password -- set user password */
624+ else if (strcmp (cmd ,"password" )== 0 )
625+ {
626+ char * pw1 ;
627+ char * pw2 ;
628+
629+ pw1 = simple_prompt ("Enter new password: " ,100 , false);
630+ pw2 = simple_prompt ("Enter it again: " ,100 , false);
631+
632+ if (strcmp (pw1 ,pw2 )!= 0 )
633+ {
634+ fprintf (stderr ,_ ("Passwords didn't match.\n" ));
635+ success = false;
636+ }
637+ else
638+ {
639+ char * opt0 = psql_scan_slash_option (scan_state ,OT_SQLID ,NULL , true);
640+ char * user ;
641+ char encrypted_password [MD5_PASSWD_LEN + 1 ];
642+
643+ if (opt0 )
644+ user = opt0 ;
645+ else
646+ user = PQuser (pset .db );
647+
648+ if (!pg_md5_encrypt (pw1 ,user ,strlen (user ),encrypted_password ))
649+ {
650+ fprintf (stderr ,_ ("Password encryption failed.\n" ));
651+ success = false;
652+ }
653+ else
654+ {
655+ PQExpBufferData buf ;
656+ PGresult * res ;
657+
658+ initPQExpBuffer (& buf );
659+ printfPQExpBuffer (& buf ,"ALTER ROLE %s PASSWORD '%s';" ,
660+ fmtId (user ),encrypted_password );
661+ res = PSQLexec (buf .data , false);
662+ termPQExpBuffer (& buf );
663+ if (!res )
664+ success = false;
665+ else
666+ PQclear (res );
667+ }
668+ }
669+
670+ free (pw1 );
671+ free (pw2 );
672+ }
673+
621674/* \pset -- set printing parameters */
622675else if (strcmp (cmd ,"pset" )== 0 )
623676{
@@ -640,7 +693,7 @@ exec_command(const char *cmd,
640693
641694/* \q or \quit */
642695else if (strcmp (cmd ,"q" )== 0 || strcmp (cmd ,"quit" )== 0 )
643- status = CMD_TERMINATE ;
696+ status = PSQL_CMD_TERMINATE ;
644697
645698/* reset(clear) the buffer */
646699else if (strcmp (cmd ,"r" )== 0 || strcmp (cmd ,"reset" )== 0 )
@@ -780,7 +833,7 @@ exec_command(const char *cmd,
780833if (!query_buf )
781834{
782835psql_error ("no query buffer\n" );
783- status = CMD_ERROR ;
836+ status = PSQL_CMD_ERROR ;
784837}
785838else
786839{
@@ -884,10 +937,10 @@ exec_command(const char *cmd,
884937#endif
885938
886939else
887- status = CMD_UNKNOWN ;
940+ status = PSQL_CMD_UNKNOWN ;
888941
889942if (!success )
890- status = CMD_ERROR ;
943+ status = PSQL_CMD_ERROR ;
891944
892945return status ;
893946}