]> granicus.if.org Git - postgresql/commitdiff
Suppress -Wunused-result warnings about write() and fwrite().
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 19 Oct 2011 01:37:51 +0000 (21:37 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 19 Oct 2011 01:37:51 +0000 (21:37 -0400)
This is merely an exercise in satisfying pedants, not a bug fix, because
in every case we were checking for failure later with ferror(), or else
there was nothing useful to be done about a failure anyway.  Document
the latter cases.

src/backend/access/transam/xlog.c
src/backend/commands/copy.c
src/backend/postmaster/pgstat.c
src/backend/utils/error/elog.c
src/bin/psql/common.c

index befb507047721bcde868a5682b97a3829cc85b81..1c17348472e7513e3d1425030ae26b86e502ba17 100644 (file)
@@ -9067,8 +9067,10 @@ do_pg_start_backup(const char *backupidstr, bool fast, char **labelfile)
                                                (errcode_for_file_access(),
                                                 errmsg("could not create file \"%s\": %m",
                                                                BACKUP_LABEL_FILE)));
-                       fwrite(labelfbuf.data, labelfbuf.len, 1, fp);
-                       if (fflush(fp) || ferror(fp) || FreeFile(fp))
+                       if (fwrite(labelfbuf.data, labelfbuf.len, 1, fp) != 1 ||
+                               fflush(fp) != 0 ||
+                               ferror(fp) ||
+                               FreeFile(fp))
                                ereport(ERROR,
                                                (errcode_for_file_access(),
                                                 errmsg("could not write file \"%s\": %m",
index a9c1980e5d53a6d5222282f68f110114a6c7a0ae..e0c72d9cdc1d503448083cd5e45187f4cf4528e0 100644 (file)
@@ -466,9 +466,9 @@ CopySendEndOfRow(CopyState cstate)
 #endif
                        }
 
-                       (void) fwrite(fe_msgbuf->data, fe_msgbuf->len,
-                                                 1, cstate->copy_file);
-                       if (ferror(cstate->copy_file))
+                       if (fwrite(fe_msgbuf->data, fe_msgbuf->len, 1,
+                                          cstate->copy_file) != 1 ||
+                               ferror(cstate->copy_file))
                                ereport(ERROR,
                                                (errcode_for_file_access(),
                                                 errmsg("could not write to COPY file: %m")));
index 9132db7e812d52a580f9d6bc21f2bcd49a1cf57c..44956c15b5aae8785814751e4b6e7e114d5a5f1f 100644 (file)
@@ -3284,6 +3284,7 @@ pgstat_write_statsfile(bool permanent)
        int32           format_id;
        const char *tmpfile = permanent ? PGSTAT_STAT_PERMANENT_TMPFILE : pgstat_stat_tmpname;
        const char *statfile = permanent ? PGSTAT_STAT_PERMANENT_FILENAME : pgstat_stat_filename;
+       int                     rc;
 
        /*
         * Open the statistics temp file to write out the current values.
@@ -3307,12 +3308,14 @@ pgstat_write_statsfile(bool permanent)
         * Write the file header --- currently just a format ID.
         */
        format_id = PGSTAT_FILE_FORMAT_ID;
-       fwrite(&format_id, sizeof(format_id), 1, fpout);
+       rc = fwrite(&format_id, sizeof(format_id), 1, fpout);
+       (void) rc;                                      /* we'll check for error with ferror */
 
        /*
         * Write global stats struct
         */
-       fwrite(&globalStats, sizeof(globalStats), 1, fpout);
+       rc = fwrite(&globalStats, sizeof(globalStats), 1, fpout);
+       (void) rc;                                      /* we'll check for error with ferror */
 
        /*
         * Walk through the database table.
@@ -3326,7 +3329,8 @@ pgstat_write_statsfile(bool permanent)
                 * use to any other process.
                 */
                fputc('D', fpout);
-               fwrite(dbentry, offsetof(PgStat_StatDBEntry, tables), 1, fpout);
+               rc = fwrite(dbentry, offsetof(PgStat_StatDBEntry, tables), 1, fpout);
+               (void) rc;                              /* we'll check for error with ferror */
 
                /*
                 * Walk through the database's access stats per table.
@@ -3335,7 +3339,8 @@ pgstat_write_statsfile(bool permanent)
                while ((tabentry = (PgStat_StatTabEntry *) hash_seq_search(&tstat)) != NULL)
                {
                        fputc('T', fpout);
-                       fwrite(tabentry, sizeof(PgStat_StatTabEntry), 1, fpout);
+                       rc = fwrite(tabentry, sizeof(PgStat_StatTabEntry), 1, fpout);
+                       (void) rc;                      /* we'll check for error with ferror */
                }
 
                /*
@@ -3345,7 +3350,8 @@ pgstat_write_statsfile(bool permanent)
                while ((funcentry = (PgStat_StatFuncEntry *) hash_seq_search(&fstat)) != NULL)
                {
                        fputc('F', fpout);
-                       fwrite(funcentry, sizeof(PgStat_StatFuncEntry), 1, fpout);
+                       rc = fwrite(funcentry, sizeof(PgStat_StatFuncEntry), 1, fpout);
+                       (void) rc;                      /* we'll check for error with ferror */
                }
 
                /*
index f0b3b1feb06b9a8d57b2bb6848331b794afc90d1..7122b59b96a8a113eb85e2f23f9055058ec495f8 100644 (file)
@@ -1747,10 +1747,12 @@ write_eventlog(int level, const char *line, int len)
 static void
 write_console(const char *line, int len)
 {
+       int                     rc;
+
 #ifdef WIN32
 
        /*
-        * WriteConsoleW() will fail of stdout is redirected, so just fall through
+        * WriteConsoleW() will fail if stdout is redirected, so just fall through
         * to writing unconverted to the logfile in this case.
         *
         * Since we palloc the structure required for conversion, also fall
@@ -1788,13 +1790,18 @@ write_console(const char *line, int len)
 #else
 
        /*
-        * Conversion on non-win32 platform is not implemented yet. It requires
+        * Conversion on non-win32 platforms is not implemented yet. It requires
         * non-throw version of pg_do_encoding_conversion(), that converts
         * unconvertable characters to '?' without errors.
         */
 #endif
 
-       write(fileno(stderr), line, len);
+       /*
+        * We ignore any error from write() here.  We have no useful way to report
+        * it ... certainly whining on stderr isn't likely to be productive.
+        */
+       rc = write(fileno(stderr), line, len);
+       (void) rc;
 }
 
 /*
@@ -2457,13 +2464,30 @@ send_message_to_server_log(ErrorData *edata)
 
 /*
  * Send data to the syslogger using the chunked protocol
+ *
+ * Note: when there are multiple backends writing into the syslogger pipe,
+ * it's critical that each write go into the pipe indivisibly, and not
+ * get interleaved with data from other processes.  Fortunately, the POSIX
+ * spec requires that writes to pipes be atomic so long as they are not
+ * more than PIPE_BUF bytes long.  So we divide long messages into chunks
+ * that are no more than that length, and send one chunk per write() call.
+ * The collector process knows how to reassemble the chunks.
+ *
+ * Because of the atomic write requirement, there are only two possible
+ * results from write() here: -1 for failure, or the requested number of
+ * bytes.  There is not really anything we can do about a failure; retry would
+ * probably be an infinite loop, and we can't even report the error usefully.
+ * (There is noplace else we could send it!)  So we might as well just ignore
+ * the result from write().  However, on some platforms you get a compiler
+ * warning from ignoring write()'s result, so do a little dance with casting
+ * rc to void to shut up the compiler.
  */
 static void
 write_pipe_chunks(char *data, int len, int dest)
 {
        PipeProtoChunk p;
-
        int                     fd = fileno(stderr);
+       int                     rc;
 
        Assert(len > 0);
 
@@ -2476,7 +2500,8 @@ write_pipe_chunks(char *data, int len, int dest)
                p.proto.is_last = (dest == LOG_DESTINATION_CSVLOG ? 'F' : 'f');
                p.proto.len = PIPE_MAX_PAYLOAD;
                memcpy(p.proto.data, data, PIPE_MAX_PAYLOAD);
-               write(fd, &p, PIPE_HEADER_SIZE + PIPE_MAX_PAYLOAD);
+               rc = write(fd, &p, PIPE_HEADER_SIZE + PIPE_MAX_PAYLOAD);
+               (void) rc;
                data += PIPE_MAX_PAYLOAD;
                len -= PIPE_MAX_PAYLOAD;
        }
@@ -2485,7 +2510,8 @@ write_pipe_chunks(char *data, int len, int dest)
        p.proto.is_last = (dest == LOG_DESTINATION_CSVLOG ? 'T' : 't');
        p.proto.len = len;
        memcpy(p.proto.data, data, len);
-       write(fd, &p, PIPE_HEADER_SIZE + len);
+       rc = write(fd, &p, PIPE_HEADER_SIZE + len);
+       (void) rc;
 }
 
 
index 101544800d25a43837bfe5cbc2fb027300613bba..5ab736e30b06a94a351e73f5d3751de18705c473 100644 (file)
@@ -228,6 +228,7 @@ static void
 handle_sigint(SIGNAL_ARGS)
 {
        int                     save_errno = errno;
+       int                     rc;
        char            errbuf[256];
 
        /* if we are waiting for input, longjmp out of it */
@@ -244,11 +245,16 @@ handle_sigint(SIGNAL_ARGS)
        if (cancelConn != NULL)
        {
                if (PQcancel(cancelConn, errbuf, sizeof(errbuf)))
-                       write_stderr("Cancel request sent\n");
+               {
+                       rc = write_stderr("Cancel request sent\n");
+                       (void) rc;                      /* ignore errors, nothing we can do here */
+               }
                else
                {
-                       write_stderr("Could not send cancel request: ");
-                       write_stderr(errbuf);
+                       rc = write_stderr("Could not send cancel request: ");
+                       (void) rc;                      /* ignore errors, nothing we can do here */
+                       rc = write_stderr(errbuf);
+                       (void) rc;                      /* ignore errors, nothing we can do here */
                }
        }