mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			189 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdlib.h>
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
#include "postgres.h"
 | 
						|
#include "libpq/pqcomm.h"
 | 
						|
 | 
						|
#ifdef		  HAVE_ENDIAN_H
 | 
						|
#include	<endian.h>
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
/* --------------------------------------------------------------------- */
 | 
						|
/* These definitions for ntoh/hton are the other way around from the
 | 
						|
 *	default system definitions, so we roll our own here.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef BYTE_ORDER
 | 
						|
#error BYTE_ORDER must be defined as LITTLE_ENDIAN, BIG_ENDIAN or PDP_ENDIAN
 | 
						|
#endif
 | 
						|
 | 
						|
#if BYTE_ORDER == LITTLE_ENDIAN
 | 
						|
#define ntoh_s(n) n
 | 
						|
#define ntoh_l(n) n
 | 
						|
#define hton_s(n) n
 | 
						|
#define hton_l(n) n
 | 
						|
#else							/* BYTE_ORDER != LITTLE_ENDIAN */
 | 
						|
#if BYTE_ORDER == BIG_ENDIAN
 | 
						|
#define ntoh_s(n) (u_short)(((u_char *)&n)[1] << 8 \
 | 
						|
							  | ((u_char *)&n)[0])
 | 
						|
#define ntoh_l(n) (u_long) (((u_char *)&n)[3] << 24 \
 | 
						|
							  | ((u_char *)&n)[2] << 16 \
 | 
						|
							  | ((u_char *)&n)[1] <<  8 \
 | 
						|
							  | ((u_char *)&n)[0])
 | 
						|
#define hton_s(n) (ntoh_s(n))
 | 
						|
#define hton_l(n) (ntoh_l(n))
 | 
						|
#else
 | 
						|
/* BYTE_ORDER != BIG_ENDIAN */
 | 
						|
#if BYTE_ORDER == PDP_ENDIAN
 | 
						|
#error PDP_ENDIAN macros not written yet
 | 
						|
#else
 | 
						|
/* BYTE_ORDER !=  anything known */
 | 
						|
#error BYTE_ORDER not defined as anything understood
 | 
						|
#endif							/* BYTE_ORDER == PDP_ENDIAN */
 | 
						|
#endif							/* BYTE_ORDER == BIG_ENDIAN */
 | 
						|
#endif							/* BYTE_ORDER == LITTLE_ENDIAN */
 | 
						|
 | 
						|
/* --------------------------------------------------------------------- */
 | 
						|
int
 | 
						|
pqPutShort(int integer, FILE * f)
 | 
						|
{
 | 
						|
	int				retval = 0;
 | 
						|
	u_short			n,
 | 
						|
					s;
 | 
						|
 | 
						|
	s = integer;
 | 
						|
	n = hton_s(s);
 | 
						|
	if (fwrite(&n, sizeof(u_short), 1, f) != 1)
 | 
						|
		retval = EOF;
 | 
						|
 | 
						|
	return retval;
 | 
						|
}
 | 
						|
 | 
						|
/* --------------------------------------------------------------------- */
 | 
						|
int
 | 
						|
pqPutLong(int integer, FILE * f)
 | 
						|
{
 | 
						|
	int				retval = 0;
 | 
						|
	u_long			n;
 | 
						|
 | 
						|
	n = hton_l(integer);
 | 
						|
	if (fwrite(&n, sizeof(u_long), 1, f) != 1)
 | 
						|
		retval = EOF;
 | 
						|
 | 
						|
	return retval;
 | 
						|
}
 | 
						|
 | 
						|
/* --------------------------------------------------------------------- */
 | 
						|
int
 | 
						|
pqGetShort(int *result, FILE * f)
 | 
						|
{
 | 
						|
	int				retval = 0;
 | 
						|
	u_short			n;
 | 
						|
 | 
						|
	if (fread(&n, sizeof(u_short), 1, f) != 1)
 | 
						|
		retval = EOF;
 | 
						|
 | 
						|
	*result = ntoh_s(n);
 | 
						|
	return retval;
 | 
						|
}
 | 
						|
 | 
						|
/* --------------------------------------------------------------------- */
 | 
						|
int
 | 
						|
pqGetLong(int *result, FILE * f)
 | 
						|
{
 | 
						|
	int				retval = 0;
 | 
						|
	u_long			n;
 | 
						|
 | 
						|
	if (fread(&n, sizeof(u_long), 1, f) != 1)
 | 
						|
		retval = EOF;
 | 
						|
 | 
						|
	*result = ntoh_l(n);
 | 
						|
	return retval;
 | 
						|
}
 | 
						|
 | 
						|
/* --------------------------------------------------------------------- */
 | 
						|
/* pqGetNBytes: Read a chunk of exactly len bytes in buffer s.
 | 
						|
		Return 0 if ok.
 | 
						|
*/
 | 
						|
int
 | 
						|
pqGetNBytes(char *s, size_t len, FILE * f)
 | 
						|
{
 | 
						|
	int				cnt;
 | 
						|
 | 
						|
	if (f == NULL)
 | 
						|
		return EOF;
 | 
						|
 | 
						|
	cnt = fread(s, 1, len, f);
 | 
						|
	s[cnt] = '\0';
 | 
						|
	/* mjl: actually needs up to len+1 bytes, is this okay? XXX */
 | 
						|
 | 
						|
	return (cnt == len) ? 0 : EOF;
 | 
						|
}
 | 
						|
 | 
						|
/* --------------------------------------------------------------------- */
 | 
						|
int
 | 
						|
pqPutNBytes(const char *s, size_t len, FILE * f)
 | 
						|
{
 | 
						|
	if (f == NULL)
 | 
						|
		return 0;
 | 
						|
 | 
						|
	if (fwrite(s, 1, len, f) != len)
 | 
						|
		return EOF;
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* --------------------------------------------------------------------- */
 | 
						|
int
 | 
						|
pqGetString(char *s, size_t len, FILE * f)
 | 
						|
{
 | 
						|
	int				c;
 | 
						|
 | 
						|
	if (f == NULL)
 | 
						|
		return EOF;
 | 
						|
 | 
						|
	while (len-- && (c = getc(f)) != EOF && c)
 | 
						|
		*s++ = c;
 | 
						|
	*s = '\0';
 | 
						|
	/* mjl: actually needs up to len+1 bytes, is this okay? XXX */
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* --------------------------------------------------------------------- */
 | 
						|
int
 | 
						|
pqPutString(const char *s, FILE * f)
 | 
						|
{
 | 
						|
	if (f == NULL)
 | 
						|
		return 0;
 | 
						|
 | 
						|
	if (fputs(s, f) == EOF)
 | 
						|
		return EOF;
 | 
						|
 | 
						|
	fputc('\0', f);				/* important to send an ending \0 since
 | 
						|
								 * backend expects it */
 | 
						|
	fflush(f);
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* --------------------------------------------------------------------- */
 | 
						|
int
 | 
						|
pqGetByte(FILE * f)
 | 
						|
{
 | 
						|
	return getc(f);
 | 
						|
}
 | 
						|
 | 
						|
/* --------------------------------------------------------------------- */
 | 
						|
int
 | 
						|
pqPutByte(int c, FILE * f)
 | 
						|
{
 | 
						|
	if (!f)
 | 
						|
		return 0;
 | 
						|
 | 
						|
	return (putc(c, f) == c) ? 0 : EOF;
 | 
						|
}
 | 
						|
 | 
						|
/* --------------------------------------------------------------------- */
 |