Пример #1
0
/*
  ipc_init -- initialize server, setting the global msqid that can be listened on.
*/
void
ipc_init (struct msgbuf **msgpp)
{
  key_t key;			/* messge key */
  char buf[GSERV_BUFSZ];	/* pathname for key */

  sprintf (buf,"%s/gsrv%d",tmpdir,(int)geteuid ());
  creat (buf,0600);
  key = ftok (buf,1);

  if ((ipc_qid = msgget (key,0600|IPC_CREAT)) == -1)
    {
      perror (progname);
      fprintf (stderr, "%s: unable to create msg queue\n", progname);
      ipc_exit (1);
    } /* if */

  ipc_spawn_watchdog ();

  signal (SIGTERM,ipc_handle_signal);
  signal (SIGINT,ipc_handle_signal);

  if ((*msgpp = (struct msgbuf *)
       malloc (sizeof **msgpp + GSERV_BUFSZ)) == NULL)
    {
      fprintf (stderr,
	       "%s: unable to allocate space for message buffer\n", progname);
      ipc_exit(1);
    } /* if */
} /* ipc_init */
Пример #2
0
/* Cleans up, i.e. releases allocated resources. Called via atexit() */
static void clean(void)
{
	mroute4_disable();
	mroute6_disable();
	ipc_exit();
	smclog(LOG_NOTICE, 0, "Exiting.");
}
Пример #3
0
/* Cleans up, i.e. releases allocated resources. Called via atexit() */
static void clean(void)
{
	mroute4_disable(1);
	mroute6_disable(1);
	mcgroup4_disable();
	mcgroup6_disable();
	ipc_exit();
	iface_exit();
	smclog(LOG_NOTICE, "Exiting.");
}
Пример #4
0
/*
  ipc_spawn_watchdog -- spawn a watchdog task to clean up the message queue should the
			server process die.
*/
void
ipc_spawn_watchdog (void)
{
  if ((ipc_wpid = fork ()) == 0)
    { /* child process */
      pid_t ppid = getppid ();	/* parent's process id */

      setpgrp();		/* gnu kills process group on exit */

      while (1)
	{
	  if (kill (ppid, 0) < 0) /* ppid is no longer valid, parent
				     may have died */
	    {
	      ipc_exit (0);
	    } /* if */

	  sleep(10);		/* have another go later */
	} /* while */
    } /* if */

} /* ipc_spawn_watchdog */
Пример #5
0
/*
  handle_ipc_request -- accept a request from a client, pass the request on
  			to the XEmacs process, then wait for its reply and
			pass that on to the client.
*/
void
handle_ipc_request (struct msgbuf *msgp)
{
  struct msqid_ds msg_st;	/* message status */
  char buf[GSERV_BUFSZ];
  int len;			/* length of message / read */
  int s, result_len;            /* tag fields on the response from emacs */
  int offset = 0;
  int total = 1;                /* # bytes that will actually be sent off */

  if ((len = msgrcv (ipc_qid, msgp, GSERV_BUFSZ - 1, 1, 0)) < 0)
    {
      perror (progname);
      fprintf (stderr, "%s: unable to receive\n", progname);
      ipc_exit (1);
    } /* if */

  msgctl (ipc_qid, IPC_STAT, &msg_st);
  strncpy (buf, msgp->mtext, len);
  buf[len] = '\0';		/* terminate */

  printf ("%d %s", ipc_qid, buf);
  fflush (stdout);

  /* now for the response from gnu */
  msgp->mtext[0] = '\0';

#if 0
  if ((len = read(0,buf,GSERV_BUFSZ-1)) < 0)
    {
      perror (progname);
      fprintf (stderr, "%s: unable to read\n", progname);
      ipc_exit (1);
  } /* if */

  sscanf (buf, "%d:%[^\n]\n", &junk, msgp->mtext);
#else

  /* read in "n/m:" (n=client fd, m=message length) */

  while (offset < (GSERV_BUFSZ-1) &&
	 ((len = read (0, buf + offset, 1)) > 0) &&
	 buf[offset] != ':')
    {
      offset += len;
    }

  if (len < 0)
    {
      perror (progname);
      fprintf (stderr, "%s: unable to read\n", progname);
      exit(1);
    }

  /* parse the response from emacs, getting client fd & result length */
  buf[offset] = '\0';
  sscanf (buf, "%d/%d", &s, &result_len);

  while (result_len > 0)
    {
      if ((len = read(0, buf, min2 (result_len, GSERV_BUFSZ - 1))) < 0)
	{
	  perror (progname);
	  fprintf (stderr, "%s: unable to read\n", progname);
	  exit (1);
	}

      /* Send this string off, but only if we have enough space */

      if (GSERV_BUFSZ > total)
	{
	  if (total + len <= GSERV_BUFSZ)
	    buf[len] = 0;
	  else
	    buf[GSERV_BUFSZ - total] = 0;

	  send_string(s,buf);
	  total += strlen(buf);
	}

      result_len -= len;
    }

  /* eat the newline */
  while ((len = read (0,buf,1)) == 0)
    ;
  if (len < 0)
    {
      perror(progname);
      fprintf (stderr,"%s: unable to read\n", progname);
      exit (1);
    }
  if (buf[0] != '\n')
    {
      fprintf (stderr,"%s: garbage after result [%c]\n", progname, buf[0]);
      exit (1);
    }
#endif

  /* Send a response back to the client. */

  msgp->mtype = msg_st.msg_lspid;
  if (msgsnd (ipc_qid,msgp,strlen(msgp->mtext)+1,0) < 0)
    perror ("msgsend(gnuserv)");

} /* handle_ipc_request */
Пример #6
0
/*
  ipc_handle_signal -- catch the signal given and clean up.
*/
void
ipc_handle_signal(int sig)
{
  ipc_exit (0);
} /* ipc_handle_signal */