summaryrefslogtreecommitdiff
path: root/app/fvwm/libs/Module.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/fvwm/libs/Module.c')
-rw-r--r--app/fvwm/libs/Module.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/app/fvwm/libs/Module.c b/app/fvwm/libs/Module.c
new file mode 100644
index 000000000..e0a210112
--- /dev/null
+++ b/app/fvwm/libs/Module.c
@@ -0,0 +1,165 @@
+/*
+** Module.c: code for modules to communicate with fvwm
+*/
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <errno.h>
+
+#include "fvwmlib.h"
+#include "../fvwm/module.h"
+
+
+/************************************************************************
+ *
+ * Reads a single packet of info from fvwm. Prototype is:
+ * unsigned long header[HEADER_SIZE];
+ * unsigned long *body;
+ * int fd[2];
+ * void DeadPipe(int nonsense); * Called if the pipe is no longer open *
+ *
+ * ReadFvwmPacket(fd[1],header, &body);
+ *
+ * Returns:
+ * > 0 everything is OK.
+ * = 0 invalid packet.
+ * < 0 pipe is dead. (Should never occur)
+ * body is a malloc'ed space which needs to be freed
+ *
+ **************************************************************************/
+int ReadFvwmPacket(int fd, unsigned long *header, unsigned long **body)
+{
+ int count,total,count2,body_length;
+ char *cbody;
+ extern RETSIGTYPE DeadPipe(int);
+
+ errno = 0;
+ if((count = read(fd,header,HEADER_SIZE*sizeof(unsigned long))) >0)
+ {
+ if(header[0] == START_FLAG)
+ {
+ body_length = header[2]-HEADER_SIZE;
+ *body = (unsigned long *)
+ safemalloc(body_length * sizeof(unsigned long));
+ cbody = (char *)(*body);
+ total = 0;
+ while(total < body_length*sizeof(unsigned long))
+ {
+ errno = 0;
+ if((count2=
+ read(fd,&cbody[total],
+ body_length*sizeof(unsigned long)-total)) >0)
+ {
+ total += count2;
+ }
+ else if(count2 < 0)
+ {
+ DeadPipe(errno);
+ }
+ }
+ }
+ else
+ count = 0;
+ }
+ if(count <= 0)
+ DeadPipe(errno);
+ return count;
+}
+
+/************************************************************************
+ *
+ * SendText - Sends arbitrary text/command back to fvwm
+ *
+ ***********************************************************************/
+void SendText(int *fd,char *message,unsigned long window)
+{
+ int w;
+
+ if(message != NULL)
+ {
+ write(fd[0],&window, sizeof(unsigned long));
+
+ w=strlen(message);
+ write(fd[0],&w,sizeof(int));
+ if (w)
+ write(fd[0],message,w);
+
+ /* keep going */
+ w = 1;
+ write(fd[0],&w,sizeof(int));
+ }
+}
+
+/***************************************************************************
+ *
+ * Sets the which-message-types-do-I-want mask for modules
+ *
+ **************************************************************************/
+void SetMessageMask(int *fd, unsigned long mask)
+{
+ char set_mask_mesg[50];
+
+ sprintf(set_mask_mesg,"SET_MASK %lu\n",mask);
+ SendText(fd,set_mask_mesg,0);
+}
+
+/***************************************************************************
+ * Gets a module configuration line from fvwm. Returns NULL if there are
+ * no more lines to be had. "line" is a pointer to a char *.
+ *
+ * Changed 10/19/98 by Dan Espen:
+ *
+ * - The "isspace" call was referring to memory beyond the end of the
+ * input area. This could have led to the creation of a core file. Added
+ * "body_size" to keep it in bounds.
+ **************************************************************************/
+void GetConfigLine(int *fd, char **tline)
+{
+ static int first_pass = 1;
+ int count,done = 0;
+ int body_size;
+ static char *line = NULL;
+ unsigned long header[HEADER_SIZE];
+
+ if(line != NULL)
+ free(line);
+
+ if(first_pass)
+ {
+ SendInfo(fd,"Send_ConfigInfo",0);
+ first_pass = 0;
+ }
+
+ while(!done)
+ {
+ count = ReadFvwmPacket(fd[1],header,(unsigned long **)&line);
+ /* DB(("Packet count is %d", count)); */
+ if (count <= 0)
+ *tline = NULL;
+ else {
+ *tline = &line[3*sizeof(long)];
+ body_size = header[2]-HEADER_SIZE;
+ /* DB(("Config line (%d): `%s'", body_size, body_size ? *tline : "")); */
+ while((body_size > 0)
+ && isspace(**tline)) {
+ (*tline)++;
+ --body_size;
+ }
+ }
+
+/* fprintf(stderr,"%x %x\n",header[1],M_END_CONFIG_INFO);*/
+ if(header[1] == M_CONFIG_INFO)
+ done = 1;
+ else if(header[1] == M_END_CONFIG_INFO)
+ {
+ done = 1;
+ if(line != NULL)
+ free(line);
+ line = NULL;
+ *tline = NULL;
+ }
+ }
+}