Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
/* -*-C-*-
* Common library code for the GNU Emacs server and client.
*
* This file is not part of GNU Emacs.
*
* Copying is permitted under those conditions described by the GNU
* General Public License.
*
* Copyright (C) 1996 Nico Francois
*
* Author: Nico Francois
* Based heavily on Peter Breton's code (pbreton@cs.umb.edu), which itself
* was based heavily on Andy Norman's gnuserv (ange@hplb.hpl.hp.com),
* which in turn was based on 'etc/emacsclient.c' from the GNU
* Emacs 18.52 distribution.
*
* Modifications: Nico Francois (nico.francois@scala.nl)
* Mon Sep 16 1996
* If WIN_VERSION is defined error messages are put up using the Win32
* MessageBox() function.
* If gnuclient or gnudoit can't open the gnuserv mailslot we now try
* running 'runemacs.exe' and then try again (for a maximum of 30 seconds).
*/
#include "gnuserv.h"
HANDLE CreateGnuServSlot (BOOL clientslot, DWORD clientid)
{
char buff[sizeof (GNUSERV_RECEIVE_CLIENTSLOT) + 10];
char *slotname = GNUSERV_RECEIVE_MAILSLOT;
HANDLE slot;
// Do we need to create a slot for the server or client ?
if (clientslot) {
slotname = buff;
sprintf (slotname, GNUSERV_RECEIVE_CLIENTSLOT, clientid);
}
// Create a mailslot for receiving messages
// If we are running on Windows 95 we need to set the time-out to
// 0 seconds to work around two problems: we will be able to get
// aborted properly when Emacs quits and we will not consume 100%
// CPU time.
// Note that our "receive code" will loop when reading the mailslot
// and sleep for a small amount of time when nothing was received.
// On Windows NT all this rubbish is not necessary and we will simply
// wait forever.
slot = CreateMailslot (slotname, 0,
IsWindowsNT() ? MAILSLOT_WAIT_FOREVER : 0, NULL);
// Check and see if the mailslot was created
if (INVALID_HANDLE_VALUE == slot)
OutputErrorString ("Unable to create mailslot");
return (slot);
}
BOOL StartEmacs (void)
{
PROCESS_INFORMATION procinfo;
STARTUPINFO startupinfo;
memset (&startupinfo, 0, sizeof (STARTUPINFO));
startupinfo.cb = sizeof (STARTUPINFO);
startupinfo.wShowWindow = SW_SHOW;
if (!CreateProcess (NULL, "runemacs", NULL, NULL, FALSE,
CREATE_DEFAULT_ERROR_MODE, NULL, NULL,
&startupinfo, &procinfo)) {
OutputErrorString ("Could not start runemacs.exe");
return (FALSE);
}
return (TRUE);
}
HANDLE ConnectToMailslot (char *host, BOOL clientslot, DWORD clientid)
{
char slotname[sizeof (GNUSERV_SEND_MAILSLOT) + 80];
HANDLE slot;
int runemacs = 0;
if (clientslot)
sprintf (slotname, GNUSERV_SEND_CLIENTSLOT, host, clientid);
else
sprintf (slotname, GNUSERV_SEND_MAILSLOT, host);
while (1) {
// Create the mailslot file handle
slot = CreateFile (slotname, GENERIC_WRITE, FILE_SHARE_READ,
(LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);
// Check and see if the mailslot file was opened correctly
if (INVALID_HANDLE_VALUE != slot) break;
// Check if last error was a sharing violation error.
if (GetLastError() == ERROR_SHARING_VIOLATION) {
// A sharing violation occured. This means someone else
// is in the process of writing to the mailslot. We'll
// simply wait a bit and then try again. We'll be able to
// get a handle as soon as the other process does a
// CloseHandle().
Sleep (250);
}
else {
if (!clientslot && (ERROR_FILE_NOT_FOUND == GetLastError())) {
if (runemacs == 0) {
// Since we could not connect to the mailslot we
// are going to assume this failed since gnuserv was
// not running. We'll try to start Emacs by
// running runemacs.exe and then try again.
if (!StartEmacs())
break;
}
// Don't wait longer than 30 seconds. If Emacs hasn't
// launched the server by then we give up.
// Even succesfully launching Emacs doesn't guarantee it
// starting gnuserv, so we have to give up at one time.
if (++runemacs < 30) {
// Try to connect again every second.
Sleep (1000);
continue;
}
}
OutputErrorString ("Unable to connect to mailslot");
if (!clientslot && (ERROR_FILE_NOT_FOUND == GetLastError()))
fprintf (stderr,
"Make sure Emacs/gnuserv program is running.\n");
break;
}
}
return (slot);
}
void DisconnectFromMailslot (HANDLE slot)
{
CloseHandle (slot);
}
// Send string to mailslot, returns boolean indicating success or failure.
BOOL SendString (HANDLE slot, char *msg)
{
DWORD byteswritten;
int runemacs = 0;
while (1) {
// Write message to the mailslot
if (!WriteFile (slot, msg, (DWORD)strlen(msg) + 1,
&byteswritten, (LPOVERLAPPED)NULL)) {
if (ERROR_FILE_NOT_FOUND == GetLastError()) {
if (runemacs == 0) {
// Since we could not write to the mailslot we are
// going to assume this failed since gnuserv was not
// running. We'll try to start Emacs by running
// runemacs.exe and then try again.
if (!StartEmacs())
return (FALSE);
}
// Don't wait longer than 30 seconds. If Emacs hasn't
// launched the server by then we give up.
// Even succesfully launching Emacs doesn't guarantee it
// starting gnuserv, so we have to give up at one time.
if (++runemacs < 30) {
// Try to write again every second.
Sleep (1000);
continue;
}
OutputErrorString ("Unable to write to mailslot");
fprintf(stderr, "Make sure Emacs/gnuserv program is running.\n");
}
else {
OutputErrorString ("Unable to write to mailslot");
}
return (FALSE);
}
return (TRUE);
}
}
void WaitForServerResult (HANDLE slot, BOOL echo)
{
char result[256];
DWORD bytesread;
int waiting = TRUE;
while (waiting) {
while (ReadFile (slot, result, sizeof (result), &bytesread, NULL)) {
if (bytesread) {
result[bytesread] = '\0';
if (echo)
printf ("%s", result);
if (strchr (result, '\n')) {
waiting = FALSE;
break;
}
}
else {
// We should only get here on Windows 95 (mailslot
// timeout set to 0).
// We did not receive anything. Sleep for 2/10th
// of a second, then try again.
Sleep (200);
}
}
}
}
BOOL IsWindowsNT (void)
{
return (GetVersion() < 0x80000000);
}
void OutputErrorString (char *errormsg)
{
#ifdef WIN_VERSION
char message[256];
sprintf (message, "%s. Error code: %d\n", errormsg, GetLastError());
MessageBox (NULL, message, NULL, MB_ICONEXCLAMATION);
#else
fprintf (stderr, "%s. Error code: %d\n", errormsg, GetLastError());
fflush (stderr);
#endif
}