postgresql/src/port
Tom Lane 805889d7d2 Make snprintf.c follow the C99 standard for snprintf's result value.
C99 says that the result should be the number of bytes that would have
been emitted given a large enough buffer, not the number we actually
were able to put in the buffer.  It's time to make our substitute
implementation comply with that.  Not doing so results in inefficiency
in buffer-enlargement cases, and also poses a portability hazard for
third-party code that might expect C99-compliant snprintf behavior
within Postgres.

In passing, remove useless tests for str == NULL; neither C99 nor
predecessor standards ever allowed that except when count == 0,
so I see no reason to expend cycles on making that a non-crash case
for this implementation.  Also, don't waste a byte in pg_vfprintf's
local I/O buffer; this might have performance benefits by allowing
aligned writes during flushbuffer calls.

Discussion: https://postgr.es/m/17245.1534289329@sss.pgh.pa.us
2018-08-15 13:21:37 -04:00
..
.gitignore Convert cvsignore to gitignore, and add .gitignore for build targets. 2010-09-22 12:57:04 +02:00
chklocale.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
crypt.c Phase 2 of pgindent updates. 2017-06-21 15:19:25 -04:00
dirent.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
dirmod.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
erand48.c Replace PostmasterRandom() with a stronger source, second attempt. 2016-12-05 13:42:59 +02:00
fls.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
fseeko.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
getaddrinfo.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
getopt.c Phase 2 of pgindent updates. 2017-06-21 15:19:25 -04:00
getopt_long.c Phase 3 of pgindent updates. 2017-06-21 15:35:54 -04:00
getpeereid.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
getrusage.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
gettimeofday.c Phase 3 of pgindent updates. 2017-06-21 15:35:54 -04:00
inet_aton.c Correct include file name in inet_aton fallback. 2017-10-01 17:41:00 -07:00
inet_net_ntop.c Fix file paths in comments 2018-05-14 18:59:43 +02:00
isinf.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
kill.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
Makefile Fix partial-build problems introduced by having more generated headers. 2018-04-09 16:42:10 -04:00
mkdtemp.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
noblock.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
open.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
path.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
pg_crc32c_armv8.c Preliminary work for pgindent run. 2018-04-26 14:45:04 -04:00
pg_crc32c_armv8_choose.c Further improve code for probing the availability of ARM CRC instructions. 2018-05-03 11:32:57 -04:00
pg_crc32c_sb8.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
pg_crc32c_sse42.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
pg_crc32c_sse42_choose.c Use ARMv8 CRC instructions where available. 2018-04-04 12:22:45 +03:00
pg_strong_random.c Guard against rare RAND_bytes() failures in pg_strong_random(). 2018-07-20 08:55:44 +01:00
pgcheckdir.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
pgmkdirp.c Fix various typos and grammar errors in comments. 2015-04-26 18:42:31 +02:00
pgsleep.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
pgstrcasecmp.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
pqsignal.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
pthread-win32.h Remove cvs keywords from all files. 2010-09-20 22:08:53 +02:00
qsort.c Fix a low-probability crash in our qsort implementation. 2015-07-16 22:57:46 -04:00
qsort_arg.c Fix a low-probability crash in our qsort implementation. 2015-07-16 22:57:46 -04:00
quotes.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
random.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
README Refer to OS X as "macOS", except for the port name which is still "darwin". 2016-09-25 15:40:57 -04:00
rint.c Rethink how to get float.h in old Windows API for isnan/isinf 2018-07-11 09:11:48 -04:00
snprintf.c Make snprintf.c follow the C99 standard for snprintf's result value. 2018-08-15 13:21:37 -04:00
sprompt.c Fix simple_prompt() to disable echo on Windows when stdin != terminal. 2018-05-23 19:04:34 -04:00
srandom.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
strerror.c Remove cvs keywords from all files. 2010-09-20 22:08:53 +02:00
strlcat.c pgindent run for 9.4 2014-05-06 12:12:18 -04:00
strlcpy.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
strnlen.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
system.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
tar.c Allow pg_basebackup to stream transaction log in tar mode 2016-10-23 15:23:11 +02:00
thread.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
unsetenv.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
win32.ico Revert binary change in copyright year adjustment. 2012-01-01 19:40:13 -05:00
win32env.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
win32error.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
win32security.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
win32setlocale.c Update copyright for 2018 2018-01-02 23:30:12 -05:00
win32ver.rc Stamp HEAD as 12devel 2018-06-30 12:47:59 -04:00

src/port/README

libpgport
=========

libpgport must have special behavior.  It supplies functions to both
libraries and applications.  However, there are two complexities:

1)  Libraries need to use object files that are compiled with exactly
the same flags as the library.  libpgport might not use the same flags,
so it is necessary to recompile the object files for individual
libraries.  This is done by removing -lpgport from the link line:

        # Need to recompile any libpgport object files
        LIBS := $(filter-out -lpgport, $(LIBS))

and adding infrastructure to recompile the object files:

        OBJS= execute.o typename.o descriptor.o data.o error.o prepare.o memory.o \
                connect.o misc.o path.o exec.o \
                $(filter snprintf.o, $(LIBOBJS))

The problem is that there is no testing of which object files need to be
added, but missing functions usually show up when linking user
applications.

2) For applications, we use -lpgport before -lpq, so the static files
from libpgport are linked first.  This avoids having applications
dependent on symbols that are _used_ by libpq, but not intended to be
exported by libpq.  libpq's libpgport usage changes over time, so such a
dependency is a problem.  Windows, Linux, and macOS use an export list to
control the symbols exported by libpq.