/* * pqPutInt * write an integer of 2 or 4 bytes, converting from host byte order * to network byte order. */ int pqPutInt(int value, size_t bytes, PGconn *conn) { uint16 tmp2; uint32 tmp4; switch (bytes) { case 2: tmp2 = pg_hton16((uint16) value); if (pqPutMsgBytes((const char *) &tmp2, 2, conn)) return EOF; break; case 4: tmp4 = pg_hton32((uint32) value); if (pqPutMsgBytes((const char *) &tmp4, 4, conn)) return EOF; break; default: pqInternalNotice(&conn->noticeHooks, "integer of size %lu not supported by pqPutInt", (unsigned long) bytes); return EOF; } if (conn->Pfdebug) fprintf(conn->Pfdebug, "To backend (%lu#)> %d\n", (unsigned long) bytes, value); return 0; }
/* * pqPutMsgEnd: finish constructing a message and possibly send it * * Returns 0 on success, EOF on error * * We don't actually send anything here unless we've accumulated at least * 8K worth of data (the typical size of a pipe buffer on Unix systems). * This avoids sending small partial packets. The caller must use pqFlush * when it's important to flush all the data out to the server. */ int pqPutMsgEnd(PGconn *conn) { if (conn->Pfdebug) fprintf(conn->Pfdebug, "To backend> Msg complete, length %u\n", conn->outMsgEnd - conn->outCount); /* Fill in length word if needed */ if (conn->outMsgStart >= 0) { uint32 msgLen = conn->outMsgEnd - conn->outMsgStart; msgLen = pg_hton32(msgLen); memcpy(conn->outBuffer + conn->outMsgStart, &msgLen, 4); } /* Make message eligible to send */ conn->outCount = conn->outMsgEnd; if (conn->outCount >= 8192) { int toSend = conn->outCount - (conn->outCount % 8192); if (pqSendSome(conn, toSend) < 0) return EOF; /* in nonblock mode, don't complain if unable to send it all */ } return 0; }
/* * Construct startup packet * * Returns a malloc'd packet buffer, or NULL if out of memory */ char * pqBuildStartupPacket2(PGconn *conn, int *packetlen, const PQEnvironmentOption *options) { StartupPacket *startpacket; *packetlen = sizeof(StartupPacket); startpacket = (StartupPacket *) malloc(sizeof(StartupPacket)); if (!startpacket) return NULL; MemSet(startpacket, 0, sizeof(StartupPacket)); startpacket->protoVersion = pg_hton32(conn->pversion); /* strncpy is safe here: postmaster will handle full fields correctly */ strncpy(startpacket->user, conn->pguser, SM_USER); strncpy(startpacket->database, conn->dbName, SM_DATABASE); strncpy(startpacket->tty, conn->pgtty, SM_TTY); if (conn->pgoptions) strncpy(startpacket->options, conn->pgoptions, SM_OPTIONS); return (char *) startpacket; }