/** * Service entry * @return SUCCEED/FAIL */ void USERREGSV (TPSVCINFO *p_svc) { int ret = SUCCEED; int rsp = 0; Message_t msg; long len; char * buf = p_svc->data; memset(&msg, 0, sizeof(msg)); /* allocate some stuff for more data to put in */ len = tptypes(p_svc->data, NULL, NULL) + 1024; if (NULL==(buf = tprealloc(buf, len))) { TP_LOG(log_error, "Failed reallocate buffer to size %d: %s", len, tpstrerror(tperrno)); ret=FAIL; goto out; } if (SUCCEED != parse_msg(&msg, buf, len)) { TP_LOG(log_error, "Failed to parse msg"); ret=FAIL; goto out; } msg.rsp.rspstatus = 100; strcpy(msg.rsp.rsprspmsg, "User successfully registered"); if(SUCCEED != msg_build(&msg, &buf, &len)) { TP_LOG(log_error, "Failed to build msg"); ret=FAIL; goto out; } out: tpreturn( ret==SUCCEED?TPSUCCESS:TPFAIL, 0L, buf, 0L, 0L); }
int main(int argc, char **argv) { int tpstatus; char *retbuf; char type[20]; char subtype[20]; long retbufsize; char *sbuf; long sbufsize; long callflags; int i; for (i = 0; i < 10; i++) { callflags = 0L; sbufsize = 29; sbuf = tpalloc("X_OCTET", 0, sbufsize); memset(sbuf, 0, sbufsize); strcpy(sbuf, "THIS IS YOUR CLIENT SPEAKING"); retbufsize = 15; retbuf = tpalloc("X_OCTET", 0, retbufsize); memset(retbuf, 0, retbufsize); // tptypes tptypes(sbuf, type, subtype); // tpcall btlogger((char*) "Calling tpcall with input: %s", sbuf); tpstatus = tpcall("FOOAPP", sbuf, sbufsize, (char **) &retbuf, &retbufsize, callflags); btlogger( (char*) "Called tpcall with length: %d output: %s and status: %d and tperrno: %d", retbufsize, retbuf, tpstatus, tperrno); if (tpstatus == -1 && tperrno == TPENOENT) { tpfree(sbuf); tpfree(retbuf); return -1; } tpfree(sbuf); tpfree(retbuf); } return 0; }
static void Iowait(void) { int maxfd; fd_set readfds; QUEUE *q; /* accept input on any descriptor */ FD_ZERO(&readfds); FD_SET(master, &readfds); maxfd = master; for (q = QFIRST(tpclients); q != &tpclients; q = QNEXT(q)) { struct tpclient * c = OFFSET(q, struct tpclient, global); if (c->fd > maxfd) maxfd = c->fd; FD_SET(c->fd, &readfds); } debug(3, "entering select to fd %d", maxfd); /* wait for something to do */ if (select(maxfd + 1, &readfds, 0, 0, 0) == -1) { error("select: %m"); return; } /* new client connection */ if (FD_ISSET(master, &readfds)) { debug(1, "new connection"); int i = accept(master, 0, 0); if (i == -1) error("accept: %m"); else svr_next_command(new_client(i)); } q = QFIRST(tpclients); while (q != &tpclients) { struct tpclient * c = OFFSET(q, struct tpclient, global); q = QNEXT(q); if (FD_ISSET(c->fd, &readfds)) { long bufsize = c->input ? tptypes(c->input, 0, 0) : 0; int used = c->used; if (used >= bufsize) // something unexpected. could be EOF { char check_eof[100]; int len = read(c->fd, &check_eof, sizeof check_eof); if (len > 0) { error("Iowait: read %d unexpected bytes from fd %d", len, c->fd); dump(c->fd, "unexpected", check_eof, len); } del_client(c); } else if ((used = read(c->fd, c->input + used, bufsize - used)) == -1) { error("Iowait: read: %m"); del_client(c); } else if (used == 0) { debug(1, "eof on %d", c->fd); del_client(c); } else if ((c->used = c->used + used) == bufsize) { void (*handle)(struct tpclient *, char *) = c->handler; char *buf = c->input; char *handler_name = c->handler_name; c->handler_name = 0; c->handler = 0; c->input = 0; c->used = 0; debug(1, "%d bytes read from %d. calling handler %s at 0x%x", bufsize, c->fd, handler_name, handle); if (DEBUG > 2) dump(c->fd, "read", buf, bufsize); handle(c, buf); debug(2, "back from handler %s at 0x%x", handler_name, handle); } else debug(2, "%d bytes read from %d. waiting for %d more...", used, c->fd, bufsize - c->used); } if (q != &tpclients) debug(2, "-------"); } }