On Tue, Aug 28, 2012 at 04:25:36PM -0400, Tom Lane wrote: > Bruce Momjian <br...@momjian.us> writes: > > Updated patch attached which just reports the file as empty. I assume > > we don't want the extra text output for pg_ctl like we do for the > > backend. > > The backend side of this looks mostly sane to me (but drop the \n, > messages are not supposed to contain those). But the feof test proposed
Removed. I thought we needed to add \n so that strings >80 would wrap properly. How do we handle this? > for pg_ctl is no good: consider a file containing just, say, "-". > fscanf would eat the "-", then hit eof, and this would complain the file > is empty. Possibly checking for ftell(pidf) == 0 would do, though I'm > not sure whether it's portable to assume fscanf would eat a non-numeric > character before complaining. ftell() seems to work fine when combined with feof(), so I used that in the attached patch. ftell() alone remains at zero if the file contains "A", so feof() is also needed. -- Bruce Momjian <br...@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + It's impossible for everything to be true. +
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c new file mode 100644 index 775d71f..eadfcbf *** a/src/backend/utils/init/miscinit.c --- b/src/backend/utils/init/miscinit.c *************** CreateLockFile(const char *filename, boo *** 766,771 **** --- 766,781 ---- filename))); close(fd); + if (len == 0) + { + ereport(FATAL, + (errcode(ERRCODE_LOCK_FILE_EXISTS), + errmsg("lock file \"%s\" is empty", filename), + errhint( + "Either another server is starting, or the lock file is the remnant " + "of a previous server startup crash."))); + } + buffer[len] = '\0'; encoded_pid = atoi(buffer); diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c new file mode 100644 index af8d8b2..81ba39e *** a/src/bin/pg_ctl/pg_ctl.c --- b/src/bin/pg_ctl/pg_ctl.c *************** get_pgpid(void) *** 292,299 **** } if (fscanf(pidf, "%ld", &pid) != 1) { ! write_stderr(_("%s: invalid data in PID file \"%s\"\n"), ! progname, pid_file); exit(1); } fclose(pidf); --- 292,304 ---- } if (fscanf(pidf, "%ld", &pid) != 1) { ! /* Is the file empty? */ ! if (ftell(pidf) == 0 && feof(pidf)) ! write_stderr(_("%s: the PID file \"%s\" is empty\n"), ! progname, pid_file); ! else ! write_stderr(_("%s: invalid data in PID file \"%s\"\n"), ! progname, pid_file); exit(1); } fclose(pidf);
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers