xenocara/app/fvwm/extras/FvwmPipe/FvwmPipe.c

188 lines
4.2 KiB
C
Raw Normal View History

/*
FvwmPipe v0.1 Copyright 1996 Matthias Ettrich
(ettrich@informatik.uni-tuebingen.de)
Permission is granted to distribute this software freely
for any purpose as long as the copyright and this
copyright notice remain intact.
Simple hacked module to control fvwm from outside.
When invoked this module creates a pipe "$HOME/.fvwmpipe.in".
Whatever you write to this pipe will be passed through to fvwm.
For example:
echo "restart" > $HOME/.fvwmpipe.in
(restarts fvwm)
or
echo "AddtoMenu \"StartMenu\" \"Emacs\" Exec emacs " > $HOME/.fvwmpipe.in
(adds emacs to the StartMenu)
or
echo "DestroyMenu \"StartMenu\" " > $HOME/.fvwmpipe.in
(destroys the StartMenu)
The module makes it possible to write config-tools for fvwm
in any language, for example TCL/TK.
The code is somewhat based on the FvwmTalk module.
*/
/* This module, and the entire NoClutter program, and the concept for
* interfacing this module to the Window Manager, are all original work
* by Robert Nation
*
* Copyright 1994, Robert Nation. No guarantees or warantees or anything
* are provided or implied in any way whatsoever. Use this program at your
* own risk. Permission to use this program for any purpose is given,
* as long as the copyright is kept intact. */
#define TRUE 1
#define FALSE
#define UPDATE_ONLY 1
#define ALL 2
#define PROP_SIZE 1024
#include "config.h"
#if HAVE_SYS_BSDTYPES
#include <sys/bsdtypes.h> /* Saul */
#endif
#include <stdio.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/time.h>
#if HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#include <unistd.h>
#include <ctype.h>
#include <stdlib.h>
#include "fvwmlib.h"
#include "../../fvwm/module.h"
char *MyName;
int fd_width;
int fd[2];
/***********************************************************************
*
* Procedure:
* SIGPIPE handler - SIGPIPE means fvwm is dying
*
***********************************************************************/
void DeadPipe(int nonsense)
{
fprintf(stderr,"FvwmPipe: dead pipe\n");
exit(0);
}
void Loop(int *fvwmfd){
int fd;
int res;
char s[256];
int a,i;
char* Home;
int HomeLen;
char* inpipename;
fd_set fdset;
Home = getenv("HOME");
if (Home == NULL)
Home = "./";
HomeLen = strlen(Home);
inpipename = safemalloc(HomeLen + 17);
strcpy(inpipename,Home);
strcat(inpipename,"/.fvwmpipe.in");
fd = open(inpipename, O_RDWR|O_NONBLOCK);
if (fd){
/* send an empty message to end elder FvwmPipes */
write (fd, "\n", 1);
close(fd);
}
mkfifo(inpipename, 0600);
fd = open(inpipename, O_RDONLY|O_NONBLOCK);
if (fd<0){
fprintf(stderr,"FvwmPipe: cannot create %s\n", inpipename);
exit(0);
}
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
FD_SET(fvwmfd[1], &fdset);
while (1){
select(fd_width,SELECT_TYPE_ARG234 &fdset, 0, 0, NULL);
if (FD_ISSET(fd, &fdset)){
/* read from the fvwmpipe.in and send the stuff to fvwm */
res = read(fd, s, 255);
if(res>=0) {
s[res] = '\0';
a = 0;
for (i=0; i<res;i++)
if (s[i] == '\n'){
s[i] = '\0';
SendText(fvwmfd,(s+a),0);
a = i+1;
}
}
}
else {
/* ignore what comes from fvwm but empty the pipe */
do {
res = read(fvwmfd[1], s, 99);
} while (res >= 0);
}
}
}
int main(int argc, char **argv)
{
char *temp, *s;
/* Save the program name - its used for error messages and option parsing */
temp = argv[0];
s=strrchr(argv[0], '/');
if (s != NULL)
temp = s + 1;
MyName = safemalloc(strlen(temp)+2);
strcpy(MyName,"*");
strcat(MyName, temp);
if((argc != 6)&&(argc != 7))
{
fprintf(stderr,"%s Version %s should only be executed by fvwm!\n",MyName,
VERSION);
exit(1);
}
/* Save the program name - its used for error messages and option parsing */
temp = argv[0];
s=strrchr(argv[0], '/');
if (s != NULL)
temp = s + 1;
MyName = safemalloc(strlen(temp)+2);
strcpy(MyName,"*");
strcat(MyName, temp);
/* Dead pipes mean fvwm died */
signal (SIGPIPE, DeadPipe);
fd[0] = atoi(argv[1]);
fd[1] = atoi(argv[2]);
fd_width = GetFdWidth();
Loop(fd);
return 0;
}