summaryrefslogtreecommitdiffstats
path: root/mqueue_pop.c
diff options
context:
space:
mode:
Diffstat (limited to 'mqueue_pop.c')
-rw-r--r--mqueue_pop.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/mqueue_pop.c b/mqueue_pop.c
new file mode 100644
index 0000000..32cf6db
--- /dev/null
+++ b/mqueue_pop.c
@@ -0,0 +1,113 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <mqueue.h>
+#include <errno.h>
+
+typedef struct {
+ char *f_mqname;
+ int f_verbose;
+ int f_helper;
+} mqueue_params;
+
+mqueue_params g_params;
+
+void helper(char *progname)
+{
+ printf("Usage: %s [OPTS] VALUE\n\n"
+ "Version: 0.0.1 \n"
+ "-m mqueue name\n"
+ "-v verbose output\n"
+ "-h help options\n"
+ "\n"
+ , progname);
+}
+
+#define full_mqpath_len 1024
+
+int main(int argc, char **argv)
+{
+ //stack params
+ int ret=0;
+ int c,err;
+ int i;
+ int mq_fd;
+ char full_mqpath[full_mqpath_len];
+ int prio;
+ struct mq_attr attr;
+ char *pop_val=NULL;
+ int pop_size;
+
+
+ memset(&g_params,0,sizeof(g_params));
+
+ //process arguments
+ while ((c = getopt(argc, argv, "m:vh")) != -1)
+ {
+ switch (c)
+ {
+ case 'm':
+ g_params.f_mqname = optarg;
+ break;
+ case 'v':
+ g_params.f_verbose = 1;
+ break;
+ case 'h':
+ default:
+ helper(argv[0]);
+ exit(1);
+ }
+ }
+
+ if (g_params.f_helper)
+ {
+ helper(argv[0]);
+ return 0;
+ }
+
+ //set mqueue name
+ if (g_params.f_mqname == NULL)
+ {
+ g_params.f_mqname = "/stack-0";
+ }
+
+ //compose string
+ memset(&full_mqpath[0], 0, full_mqpath_len);
+ snprintf(&full_mqpath[0], full_mqpath_len-1, "%s", g_params.f_mqname);
+ if (g_params.f_verbose)
+ {
+ printf("Full path: %s\n",&full_mqpath);
+ }
+
+ mq_fd = mq_open(g_params.f_mqname,O_RDWR | O_CREAT, 0666, NULL);
+ err = errno;
+ if (mq_fd == -1)
+ {
+ if (g_params.f_verbose)
+ {
+ printf("ERROR:%d,%s\n",err,strerror(err));
+ }
+ return -1;
+ }
+ //printf("%s\n",g_params.f_mqname);
+
+ mq_getattr(mq_fd, &attr);
+
+ pop_val = malloc(attr.mq_msgsize+1);
+ memset(pop_val, 0, attr.mq_msgsize+1);
+
+ if (attr.mq_curmsgs > 0)
+ {
+ pop_size = mq_receive(mq_fd, pop_val, attr.mq_msgsize, &prio);
+ printf("%s\n",pop_val);
+ } else {
+ ret = -1;
+ }
+
+ close(mq_fd);
+ free(pop_val);
+
+ return ret;
+} \ No newline at end of file