@@ -18,18 +18,23 @@ extern char *crypt(const char *, const char *);
18
18
19
19
#endif
20
20
21
- char * comname ;
22
- static void usage (FILE * stream );
21
+ #define PG_PASSWD_LEN 13/* not including null */
22
+
23
+ const char * progname ;
24
+
25
+ static void usage (void );
23
26
static void read_pwd_file (char * filename );
24
27
static void write_pwd_file (char * filename ,char * bkname );
25
- static void encrypt_pwd (char key [9 ],char salt [3 ],char passwd [14 ]);
28
+ static void encrypt_pwd (char key [9 ],char salt [3 ],char passwd [PG_PASSWD_LEN + 1 ]);
26
29
static void prompt_for_username (char * username );
27
30
static void prompt_for_password (char * prompt ,char * password );
28
31
29
32
static void
30
- usage (FILE * stream )
33
+ usage (void )
31
34
{
32
- fprintf (stream ,"Usage: %s <password file>\n" ,comname );
35
+ printf ("%s manipulates flat text password files for PostgreSQL.\n\n" ,progname );
36
+ printf ("Usage:\n %s PASSWORD-FILE\n\n" ,progname );
37
+ printf ("Report bugs to <pgsql-bugs@postgresql.org>.\n" );
33
38
}
34
39
35
40
typedef struct
@@ -97,8 +102,8 @@ read_pwd_file(char *filename)
97
102
if (line [l - 1 ]== '\n' )
98
103
line [l - 1 ]= '\0' ;
99
104
else
100
- {/* too long */
101
- fprintf (stderr ,"%s: line %d: line too long. \n" ,
105
+ {
106
+ fprintf (stderr ,"%s:%d: line too long\n" ,
102
107
filename ,npwds + 1 );
103
108
exit (1 );
104
109
}
@@ -110,7 +115,7 @@ read_pwd_file(char *filename)
110
115
111
116
if (strlen (p )== 0 )
112
117
{
113
- fprintf (stderr ,"%s: line %d: null user name. \n" ,
118
+ fprintf (stderr ,"%s:%d: null user name\n" ,
114
119
filename ,npwds + 1 );
115
120
exit (1 );
116
121
}
@@ -121,7 +126,8 @@ read_pwd_file(char *filename)
121
126
{
122
127
if (strcmp (pwds [i ].uname ,pwds [npwds ].uname )== 0 )
123
128
{
124
- fprintf (stderr ,"%s: duplicated entry.\n" ,pwds [npwds ].uname );
129
+ fprintf (stderr ,"Duplicated entry: %s\n" ,
130
+ pwds [npwds ].uname );
125
131
exit (1 );
126
132
}
127
133
}
@@ -135,9 +141,9 @@ read_pwd_file(char *filename)
135
141
if (q != NULL )
136
142
* (q ++ )= '\0' ;
137
143
138
- if (strlen (p )!= 13 && strcmp (p ,"+" )!= 0 )
144
+ if (strlen (p )!= PG_PASSWD_LEN && strcmp (p ,"+" )!= 0 )
139
145
{
140
- fprintf (stderr ,"WARNING: %s: line %d: invalid password length. \n" ,
146
+ fprintf (stderr ,"%s:%d:warning: invalid password length\n" ,
141
147
filename ,npwds + 1 );
142
148
}
143
149
pwds [npwds ].pwd = strdup (p );
@@ -201,7 +207,7 @@ write_pwd_file(char *filename, char *bkname)
201
207
}
202
208
203
209
static void
204
- encrypt_pwd (char key [9 ],char salt [3 ],char passwd [14 ])
210
+ encrypt_pwd (char key [9 ],char salt [3 ],char passwd [PG_PASSWD_LEN + 1 ])
205
211
{
206
212
int n ;
207
213
@@ -233,17 +239,17 @@ encrypt_pwd(char key[9], char salt[3], char passwd[14])
233
239
234
240
#ifdef NOT_USED
235
241
static int
236
- check_pwd (char key [9 ],char passwd [14 ])
242
+ check_pwd (char key [9 ],char passwd [PG_PASSWD_LEN + 1 ])
237
243
{
238
- char shouldbe [14 ];
244
+ char shouldbe [PG_PASSWD_LEN + 1 ];
239
245
char salt [3 ];
240
246
241
247
salt [0 ]= passwd [0 ];
242
248
salt [1 ]= passwd [1 ];
243
249
salt [2 ]= '\0' ;
244
250
encrypt_pwd (key ,salt ,shouldbe );
245
251
246
- return strncmp (shouldbe ,passwd ,13 )== 0 ?1 :0 ;
252
+ return strncmp (shouldbe ,passwd ,PG_PASSWD_LEN )== 0 ?1 :0 ;
247
253
}
248
254
249
255
#endif
@@ -314,32 +320,53 @@ prompt_for_password(char *prompt, char *password)
314
320
int
315
321
main (int argc ,char * argv [])
316
322
{
317
- static char bkname [512 ];
323
+ static char bkname [MAXPGPATH ];
324
+ char * filename ;
318
325
char username [9 ];
319
326
char salt [3 ];
320
327
char key [9 ],
321
328
key2 [9 ];
322
- char e_passwd [14 ];
329
+ char e_passwd [PG_PASSWD_LEN + 1 ];
323
330
int i ;
324
331
325
- comname = argv [0 ];
332
+ progname = argv [0 ];
333
+
326
334
if (argc != 2 )
327
335
{
328
- usage (stderr );
336
+ fprintf (stderr ,"%s: too %s arguments\nTry '%s -?' for help.\n" ,
337
+ progname ,argc > 2 ?"many" :"few" ,progname );
338
+ exit (1 );
339
+ }
340
+
341
+ if (strcmp (argv [1 ],"--help" )== 0 || strcmp (argv [1 ],"-?" )== 0 )
342
+ {
343
+ usage ();
344
+ exit (0 );
345
+ }
346
+ if (strcmp (argv [1 ],"--version" )== 0 || strcmp (argv [1 ],"-V" )== 0 )
347
+ {
348
+ puts ("pg_passwd (PostgreSQL) " PG_VERSION );
349
+ exit (0 );
350
+ }
351
+ if (argv [1 ][0 ]== '-' )
352
+ {
353
+ fprintf (stderr ,"%s: invalid option: %s\nTry '%s -?' for help.\n" ,
354
+ progname ,argv [1 ],progname );
329
355
exit (1 );
330
356
}
331
357
358
+ filename = argv [1 ];
332
359
333
360
/* open file */
334
- read_pwd_file (argv [ 1 ] );
361
+ read_pwd_file (filename );
335
362
336
363
/* ask for the user name and the password */
337
364
prompt_for_username (username );
338
365
prompt_for_password ("New password: " ,key );
339
366
prompt_for_password ("Re-enter new password: " ,key2 );
340
367
if (strncmp (key ,key2 ,8 )!= 0 )
341
368
{
342
- fprintf (stderr ,"Password mismatch. \n" );
369
+ fprintf (stderr ,"Password mismatch\n" );
343
370
exit (1 );
344
371
}
345
372
salt [0 ]= '\0' ;
@@ -358,7 +385,7 @@ main(int argc, char *argv[])
358
385
{/* did not exist */
359
386
if (npwds == MAXPWDS )
360
387
{
361
- fprintf (stderr ,"%s: cannot handle so may entries. \n" , comname );
388
+ fprintf (stderr ,"Cannot handle so may entries\n" );
362
389
exit (1 );
363
390
}
364
391
pwds [npwds ].uname = strdup (username );
@@ -368,8 +395,8 @@ main(int argc, char *argv[])
368
395
}
369
396
370
397
/* write back the file */
371
- sprintf (bkname ,"%s.bk" ,argv [ 1 ] );
372
- write_pwd_file (argv [ 1 ] ,bkname );
398
+ sprintf (bkname ,"%s.bk" ,filename );
399
+ write_pwd_file (filename ,bkname );
373
400
374
401
return 0 ;
375
402
}