f80935e66086e97d29426bb9053c10eae078385b kent Sun Feb 2 16:22:01 2014 -0800 Moving a check on commands against message size to library since in fact it was already implemented twice, and I needed it a third time. diff --git src/parasol/inc/paraMessage.h src/parasol/inc/paraMessage.h index 5307e17..c31fd76 100644 --- src/parasol/inc/paraMessage.h +++ src/parasol/inc/paraMessage.h @@ -1,129 +1,133 @@ /* paraMessage - routines to pack and unpack messages in * the parasol system, and also to send them via sockets. */ #ifndef PARAMESSAGE_H #define PARAMESSAGE_H #ifndef RUDP_H #include "rudp.h" #endif struct paraMessage /* A parasol message. */ { struct paraMessage *next; /* Next in list. */ struct sockaddr_in ipAddress; /* IP address of machine message is from/to */ int size; /* Size of data. */ char data[rudpMaxSize+1]; /* Data. Extra byte for zero tag at end. */ }; struct paraMultiMessage /* A parasol multi-packet response message. */ { struct paraMessage *pm; struct sockaddr_in ipAddress; /* IP address of machine message is from/to */ bits32 id; /* Message id. Returned with ack. */ }; void pmInit(struct paraMessage *pm, rudpHost ipAddress, bits16 port); /* Initialize message (that might be on stack). ipAddress is in host * order. */ void pmInitFromName(struct paraMessage *pm, char *hostName, bits16 port); /* Initialize message with ascii ip address. */ struct paraMessage *pmNew(rudpHost ipAddress, bits16 port); /* Create new message in memory. ipAddress is in host order. */ struct paraMessage *pmNewFromName(char *hostName, bits16 port); /* Create new message in memory */ void pmFree(struct paraMessage **pPm); /* Free up message. */ void pmClear(struct paraMessage *pm); /* Clear out data buffer. */ void pmSet(struct paraMessage *pm, char *message); -/* Set message in data buffer. */ +/* Set message in data buffer. Aborts if message too long (rudpMaxSize or more). */ void pmPrintf(struct paraMessage *pm, char *format, ...) /* Print message into end of data buffer. Warn if it goes * past limit. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; boolean pmSend(struct paraMessage *pm, struct rudp *ru); /* Send out message. Print warning message and return FALSE if * there is a problem. */ boolean pmSendString(struct paraMessage *pm, struct rudp *ru, char *string); /* Send out given message strng. Print warning message and return FALSE if * there is a problem. */ +void pmCheckCommandSize(char *string, int len); +/* Check that string of given len is not too long to fit into paraMessage. + * If it is, abort with good error message assuming it was a command string */ + boolean pmReceive(struct paraMessage *pm, struct rudp *ru); /* Receive message. Print warning message and return FALSE if * there is a problem. */ boolean pmReceiveTimeOut(struct paraMessage *pm, struct rudp *ru, int timeOut); /* Wait up to timeOut microseconds for message. To wait forever * set timeOut to zero. */ void pmmInit(struct paraMultiMessage *pmm, struct paraMessage *pm, struct in_addr sin_addr); /* Initialize structure for multi-message response */ boolean pmmReceiveTimeOut(struct paraMultiMessage *pmm, struct rudp *ru, int timeOut); /* Multi-message receive * Wait up to timeOut microseconds for message. To wait forever * set timeOut to zero. For multi-message response * We know the ip, and can track the port for continuity * and the packet id for sequential series. */ boolean pmmReceive(struct paraMultiMessage *pmm, struct rudp *ru); /* Receive multi message. Print warning message and return FALSE if * there is a problem. */ void pmFetchOpenFile(struct paraMessage *pm, struct rudp *ru, char *fileName); /* Read everything you can from socket and output to file. */ void pmFetchFile(char *host, char *sourceName, char *destName); /* Fetch small file. */ boolean pmSendStringWithRetries(struct paraMessage *pm, struct rudp *ru, char *string); /* Send out given message strng. Print warning message and return FALSE if * there is a problem. Try up to 5 times sleeping for 60 seconds in between. * This is an attempt to help automated processes. */ char *pmHubSendSimple(char *message, char *host); /* Send message to host, no response. */ char *pmHubSingleLineQuery(char *query, char *host); /* Send message to hub and get single line response. * This should be freeMem'd when done. */ struct slName *pmHubMultilineQuery(char *query, char *host); /* Send a command with a multiline response to hub, * and return response as a list of strings. */ struct paraPstat2Job /* The job information returned by a pstat2 message by parasol, * parsed out. */ { struct paraPstat2Job *next; char *status; // 'r' mostly char *parasolId; // Parasol ID as a string char *user; // Name of user char *program; // Name of program being run char *host; // Host name of node running job. }; #define PARAPSTAT2JOB_NUM_COLS 5 struct paraPstat2Job *paraPstat2JobLoad(char **row); /* Turn an array of 5 strings into a paraPstat2Job. */ #endif /* PARAMESSAGE_H */