--- mqtt/src/mqtt_subs.c 2012/05/27 10:04:05 1.2.2.9 +++ mqtt/src/mqtt_subs.c 2012/06/20 09:23:28 1.2.2.13 @@ -8,6 +8,7 @@ io_enableDEBUG; extern char compiled[], compiledby[], compilehost[]; volatile intptr_t Kill; +sched_root_task_t *root; struct tagArgs *args; @@ -56,7 +57,11 @@ Subscribe(int sock, FILE *lf) u_short mid; mqtt_subscr_t *sub; +#ifdef __NetBSD__ + srandom(getpid() ^ time(NULL)); +#else srandomdev(); +#endif mid = random() % USHRT_MAX; printf(" > Execute SUBSCRIBE request #%d ... ", mid); @@ -80,7 +85,11 @@ Unsubscribe(int sock) { u_short mid; +#ifdef __NetBSD__ + srandom(getpid() ^ time(NULL)); +#else srandomdev(); +#endif mid = random() % USHRT_MAX; printf(" > Execute UNSUBSCRIBE request #%d ... ", mid); @@ -94,6 +103,37 @@ Unsubscribe(int sock) } +static void * +pubRX(sched_task_t *task) +{ + int siz, rlen; + char szTopic[STRSIZ] = { 0 }; + void *data = NULL; + u_short mid; + + rlen = RecvFrom(TASK_FD(task)); + if (rlen == -1) + goto end; + siz = mqtt_readPUBLISH(args->msg, szTopic, sizeof szTopic, &mid, &data); + if (siz == -1) + goto end; + + fprintf(TASK_ARG(task), "\nMessage ID: 0x%04hu, Length: %u, Topic: %s\n", + mid, siz, szTopic); + + if (data) { + fputs((const char*) data, TASK_ARG(task)); + free(data); + } + + fprintf(TASK_ARG(task), "\n.\n"); + fflush(TASK_ARG(task)); +end: + schedReadSelf(task); + return NULL; +} + + int main(int argc, char **argv) { @@ -173,7 +213,7 @@ main(int argc, char **argv) sub->sub_ret = (u_char) *str; } else sub->sub_ret = (u_char) args->QoS; - sub->sub_topic.msg_base = io_strdup(szStr); + sub->sub_topic.msg_base = strdup(szStr); sub->sub_topic.msg_len = strlen(szStr); break; case 'q': @@ -272,10 +312,18 @@ main(int argc, char **argv) else lf = stdout; if (lf) { + root = schedBegin(); + ret = Subscribe(args->cli->sock, lf); + + schedRead(root, pubRX, lf, args->cli->sock, NULL, 0); + schedRun(root, &Kill); + if (un) Unsubscribe(args->cli->sock); fclose(lf); + + schedEnd(&root); } else printf("Error:: in subscribe file #%d - %s\n", errno, strerror(errno)); } else