The program shown in Example 7–4 uses an input procedure as the source for the body of a message to be sent. In the program, the input procedure msg_proc will read input until the runtime library routine fgets() signals an EOF condition, for example, a control-D has been input. The address of the procedure msg_proc is passed to mtaSend() using a MTA_MSG_PROC item code. The mtaSend() routine repeatedly calls the msg_proc procedure, until a negative value is returned by the procedure.
/* send_input.c -- Demonstrate the use of MTA_MSG_PROC */ #include <stdio.h\> #include <stdlib.h\> #include <string.h\> #include "mtasdk.h" #ifdef _WIN32 typedef long ssize_t; #endif /* Push an entry onto the item list */ #define ITEM(item,adr) item_list[index].item_code = item;\ item_list[index].item_address = adr;\ item_list[index].item_length = 0;\ item_list[index].item_status = 0;\ item_list[index++].item_smessage = NULL ssize_t msg_proc(const char **bufadr) { static char buf[1024]; if (!bufadr) return(-2); /* Call error; abort */ printf("input: "); if (fgets(buf, sizeof(buf), stdin)) { *bufadr = buf; buflen = strlen(buf); if (buf[buflen-1] == ’\n’) buflen -= 1; return(buflen); } else return(-1); /* EOF */ } main () { int istat, index = 0; mta_item_list_t item_list[4]; STRITEM(MTA_SUBJECT, "send_input.c"); STRITEM(MTA_TO, "root"); ITEM(MTA_MSG_PROC, msg_proc); ITEM(MTA_END_LIST, 0); exit(mtaSend(item_list)); } |