3939 * Portions Copyright (c) 1994, Regents of the University of California
4040 * Portions taken from FreeBSD.
4141 *
42- * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.39 2004/06/21 01:04:44 momjian Exp $
42+ * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.40 2004/06/24 19:26:59 tgl Exp $
4343 *
4444 *-------------------------------------------------------------------------
4545 */
@@ -84,6 +84,7 @@ char *lc_time = "";
8484char * lc_messages = "" ;
8585char * username = "" ;
8686bool pwprompt = false;
87+ char * pwfilename = NULL ;
8788bool debug = false;
8889bool noclean = false;
8990bool show_setting = false;
@@ -1076,15 +1077,55 @@ get_set_pwd(void)
10761077char pwdpath [MAXPGPATH ];
10771078struct stat statbuf ;
10781079
1079- pwd1 = simple_prompt ("Enter new superuser password: " ,100 , false);
1080- pwd2 = simple_prompt ("Enter it again: " ,100 , false);
1081- if (strcmp (pwd1 ,pwd2 )!= 0 )
1080+ if (pwprompt )
10821081{
1083- fprintf (stderr ,_ ("Passwords didn't match.\n" ));
1084- exit_nicely ();
1082+ /*
1083+ * Read password from terminal
1084+ */
1085+ pwd1 = simple_prompt ("Enter new superuser password: " ,100 , false);
1086+ pwd2 = simple_prompt ("Enter it again: " ,100 , false);
1087+ if (strcmp (pwd1 ,pwd2 )!= 0 )
1088+ {
1089+ fprintf (stderr ,_ ("Passwords didn't match.\n" ));
1090+ exit_nicely ();
1091+ }
1092+ free (pwd2 );
10851093}
1086- free (pwd2 );
1094+ else
1095+ {
1096+ /*
1097+ * Read password from file
1098+ *
1099+ * Ideally this should insist that the file not be world-readable.
1100+ * However, this option is mainly intended for use on Windows where
1101+ * file permissions may not exist at all, so we'll skip the paranoia
1102+ * for now.
1103+ */
1104+ FILE * pwf = fopen (pwfilename ,"r" );
1105+ char pwdbuf [MAXPGPATH ];
1106+ int i ;
10871107
1108+ if (!pwf )
1109+ {
1110+ fprintf (stderr ,_ ("%s: could not open file \"%s\" for reading: %s\n" ),
1111+ progname ,pwfilename ,strerror (errno ));
1112+ exit_nicely ();
1113+ }
1114+ if (!fgets (pwdbuf ,sizeof (pwdbuf ),pwf ))
1115+ {
1116+ fprintf (stderr ,_ ("%s: could not read password from file \"%s\": %s\n" ),
1117+ progname ,pwfilename ,strerror (errno ));
1118+ exit_nicely ();
1119+ }
1120+ fclose (pwf );
1121+
1122+ i = strlen (pwdbuf );
1123+ while (i > 0 && (pwdbuf [i - 1 ]== '\r' || pwdbuf [i - 1 ]== '\n' ))
1124+ pwdbuf [-- i ]= '\0' ;
1125+
1126+ pwd1 = xstrdup (pwdbuf );
1127+
1128+ }
10881129printf (_ ("setting password ... " ));
10891130fflush (stdout );
10901131
@@ -1737,6 +1778,7 @@ usage(const char *progname)
17371778printf (_ (" --no-locale equivalent to --locale=C\n" ));
17381779printf (_ (" -U, --username=NAME database superuser name\n" ));
17391780printf (_ (" -W, --pwprompt prompt for a password for the new superuser\n" ));
1781+ printf (_ (" --pwfile=filename read password for the new superuser from file\n" ));
17401782printf (_ (" -?, --help show this help, then exit\n" ));
17411783printf (_ (" -V, --version output version information, then exit\n" ));
17421784printf (_ ("\nLess commonly used options:\n" ));
@@ -1768,6 +1810,7 @@ main(int argc, char *argv[])
17681810{"lc-messages" ,required_argument ,NULL ,7 },
17691811{"no-locale" ,no_argument ,NULL ,8 },
17701812{"pwprompt" ,no_argument ,NULL ,'W' },
1813+ {"pwfile" ,required_argument ,NULL ,9 },
17711814{"username" ,required_argument ,NULL ,'U' },
17721815{"help" ,no_argument ,NULL ,'?' },
17731816{"version" ,no_argument ,NULL ,'V' },
@@ -1857,6 +1900,9 @@ main(int argc, char *argv[])
18571900case 8 :
18581901locale = "C" ;
18591902break ;
1903+ case 9 :
1904+ pwfilename = xstrdup (optarg );
1905+ break ;
18601906case 's' :
18611907show_setting = true;
18621908break ;
@@ -1882,6 +1928,12 @@ main(int argc, char *argv[])
18821928progname );
18831929}
18841930
1931+ if (pwprompt && pwfilename )
1932+ {
1933+ fprintf (stderr ,_ ("%s: you cannot specify both password prompt and password file\n" ),progname );
1934+ exit (1 );
1935+ }
1936+
18851937if (strlen (pg_data )== 0 )
18861938{
18871939pgdenv = getenv ("PGDATA" );
@@ -2147,7 +2199,7 @@ main(int argc, char *argv[])
21472199/* Create the stuff we don't need to use bootstrap mode for */
21482200
21492201setup_shadow ();
2150- if (pwprompt )
2202+ if (pwprompt || pwfilename )
21512203get_set_pwd ();
21522204
21532205unlimit_systables ();