Commit c911543b authored by Geoff Voelker's avatar Geoff Voelker

Initial revision

parent 14f29224
/* Utility and Unix shadow routines for GNU Emacs support programs on NT.
Copyright (C) 1994 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any later
version.
GNU Emacs is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along
with GNU Emacs; see the file COPYING. If not, write to the Free Software
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <pwd.h>
#include <malloc.h>
void sleep(int seconds);
int getwd (char *dir);
int getppid(void);
char * getlogin ();
char * cuserid (char * s);
int getuid ();
int setuid (int uid);
struct passwd * getpwuid (int uid);
char * getpass (const char * prompt);
int fchown (int fd, int uid, int gid);
#ifndef BSTRING
#define bzero(b, l) memset(b, 0, l)
#define bcopy(s, d, l) memcpy(d, s, l)
#define bcmp(a, b, l) memcmp(a, b, l)
#define index strchr
#define rindex strrchr
#endif
/* end of ntlib.h */
/* null version of <arpa/inet.h> - <sys/socket.h> has everything */
/* null version of <netdb.h> - <sys/socket.h> has everything */
/* null version of <netinet/in.h> - <sys/socket.h> has everything */
/* Workable version of <sys/socket.h> based on winsock.h */
#ifndef _SOCKET_H_
#define _SOCKET_H_
/* defeat the multiple include protection */
#ifdef _WINSOCKAPI_
#undef _WINSOCKAPI_
#endif
/* avoid confusion with our version of select */
#ifdef select
#undef select
#define MUST_REDEF_SELECT
#endif
/* avoid clashing with our version of FD_SET if already defined */
#ifdef FD_SET
#undef FD_SET
#undef FD_CLR
#undef FD_ISSET
#undef FD_ZERO
#endif
/* allow us to provide our own version of fd_set */
#define fd_set ws_fd_set
/* avoid duplicate definition of timeval */
#ifdef HAVE_TIMEVAL
#define timeval ws_timeval
#endif
#include <winsock.h>
/* redefine select to reference our version */
#ifdef MUST_REDEF_SELECT
#define select sys_select
#undef MUST_REDEF_SELECT
#endif
/* revert to our version of FD_SET */
#undef FD_SET
#undef FD_CLR
#undef FD_ISSET
#undef FD_ZERO
#undef fd_set
#include "nt.h"
#ifdef HAVE_TIMEVAL
#undef timeval
#endif
/* shadow functions where we provide our own wrapper */
#define socket sys_socket
#define bind sys_bind
#define connect sys_connect
#define htons sys_htons
#define ntohs sys_ntohs
#define inet_addr sys_inet_addr
#define gethostname sys_gethostname
#define gethostbyname sys_gethostbyname
#define getservbyname sys_getservbyname
int sys_socket(int af, int type, int protocol);
int sys_bind (int s, const struct sockaddr *addr, int namelen);
int sys_connect (int s, const struct sockaddr *addr, int namelen);
u_short sys_htons (u_short hostshort);
u_short sys_ntohs (u_short netshort);
unsigned long sys_inet_addr (const char * cp);
int sys_gethostname (char * name, int namelen);
struct hostent * sys_gethostbyname(const char * name);
struct servent * sys_getservbyname(const char * name, const char * proto);
/* we are providing a real h_errno variable */
#undef h_errno
extern int h_errno;
/* map winsock error codes to standard names */
#define EWOULDBLOCK WSAEWOULDBLOCK
#define EINPROGRESS WSAEINPROGRESS
#define EALREADY WSAEALREADY
#define ENOTSOCK WSAENOTSOCK
#define EDESTADDRREQ WSAEDESTADDRREQ
#define EMSGSIZE WSAEMSGSIZE
#define EPROTOTYPE WSAEPROTOTYPE
#define ENOPROTOOPT WSAENOPROTOOPT
#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
#define EOPNOTSUPP WSAEOPNOTSUPP
#define EPFNOSUPPORT WSAEPFNOSUPPORT
#define EAFNOSUPPORT WSAEAFNOSUPPORT
#define EADDRINUSE WSAEADDRINUSE
#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
#define ENETDOWN WSAENETDOWN
#define ENETUNREACH WSAENETUNREACH
#define ENETRESET WSAENETRESET
#define ECONNABORTED WSAECONNABORTED
#define ECONNRESET WSAECONNRESET
#define ENOBUFS WSAENOBUFS
#define EISCONN WSAEISCONN
#define ENOTCONN WSAENOTCONN
#define ESHUTDOWN WSAESHUTDOWN
#define ETOOMANYREFS WSAETOOMANYREFS
#define ETIMEDOUT WSAETIMEDOUT
#define ECONNREFUSED WSAECONNREFUSED
#define ELOOP WSAELOOP
/* #define ENAMETOOLONG WSAENAMETOOLONG */
#define EHOSTDOWN WSAEHOSTDOWN
#define EHOSTUNREACH WSAEHOSTUNREACH
/* #define ENOTEMPTY WSAENOTEMPTY */
#define EPROCLIM WSAEPROCLIM
#define EUSERS WSAEUSERS
#define EDQUOT WSAEDQUOT
#define ESTALE WSAESTALE
#define EREMOTE WSAEREMOTE
#endif /* _SOCKET_H_ */
/* end of socket.h */
/*
* sys/time.h doesn't exist on NT
*/
struct timeval
{
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
struct timezone
{
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of dst correction */
};
void gettimeofday (struct timeval *, struct timezone *);
/* end of sys/time.h */
/* Fake unistd.h: config.h already provides most of the relevant things. */
/*
Simple program to start Emacs with its console window hidden.
This program is provided purely for convenience, since most users will
use Emacs in windowing (GUI) mode, and will not want to have an extra
console window lying around. */
#define WIN32
#include <windows.h>
#include <string.h>
#include <malloc.h>
int WINAPI
WinMain (HINSTANCE hSelf, HINSTANCE hPrev, LPSTR cmdline, int nShow)
{
STARTUPINFO start;
SECURITY_ATTRIBUTES sec_attrs;
SECURITY_DESCRIPTOR sec_desc;
PROCESS_INFORMATION child;
int wait_for_child = FALSE;
DWORD ret_code = 0;
char * new_cmdline;
char * p;
char modname[MAX_PATH];
if (!GetModuleFileName (NULL, modname, MAX_PATH))
goto error;
if ((p = strrchr (modname, '\\')) == NULL)
goto error;
*p = 0;
new_cmdline = alloca (MAX_PATH + strlen (cmdline) + 1);
strcpy (new_cmdline, modname);
strcat (new_cmdline, "\\emacs.exe ");
/* append original arguments if any; first look for -wait as first
argument, and apply that ourselves */
if (strncmp (cmdline, "-wait", 5) == 0)
{
wait_for_child = TRUE;
cmdline += 5;
}
strcat (new_cmdline, cmdline);
/* set emacs_dir variable if runemacs was in "%emacs_dir%\bin" */
if ((p = strrchr (modname, '\\')) && stricmp (p, "\\bin") == 0)
{
*p = 0;
SetEnvironmentVariable ("emacs_dir", modname);
}
memset (&start, 0, sizeof (start));
start.cb = sizeof (start);
start.dwFlags = STARTF_USESHOWWINDOW;
start.wShowWindow = SW_HIDE;
sec_attrs.nLength = sizeof (sec_attrs);
sec_attrs.lpSecurityDescriptor = NULL;
sec_attrs.bInheritHandle = FALSE;
if (CreateProcess (NULL, new_cmdline, &sec_attrs, NULL, TRUE, 0,
NULL, NULL, &start, &child))
{
if (wait_for_child)
{
WaitForSingleObject (child.hProcess, INFINITE);
GetExitCodeProcess (child.hProcess, &ret_code);
}
CloseHandle (child.hThread);
CloseHandle (child.hProcess);
}
else
goto error;
return (int) ret_code;
error:
MessageBox (NULL, "Could not start Emacs.", "Error", MB_ICONSTOP);
return 1;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment