* cygwin.din: Export endusershell, getusershell and setusershell.

* syscalls.cc (getusershell): New function.
	(setusershell): Ditto.
	(endusershell): Ditto.
	* include/cygwin/version.h: Bump API minor number.
This commit is contained in:
Corinna Vinschen 2003-09-08 20:08:53 +00:00
parent 6c73e54252
commit 24efca1401
4 changed files with 82 additions and 4 deletions

View File

@ -1,3 +1,11 @@
2003-09-08 Corinna Vinschen <corinna@vinschen.de>
* cygwin.din: Export endusershell, getusershell and setusershell.
* syscalls.cc (getusershell): New function.
(setusershell): Ditto.
(endusershell): Ditto.
* include/cygwin/version.h: Bump API minor number.
2003-09-08 Nicholas Wourms <nwourms@netscape.net>
* cygwin.din: Export argz_add argz_add_sep argz_append argz_count

View File

@ -289,6 +289,7 @@ cygwin32_detach_dll = cygwin_detach_dll
cygwin_dll_init
endprotoent = cygwin_endprotoent
endservent = cygwin_endservent
endusershell
gethostbyaddr = cygwin_gethostbyaddr
gethostbyname = cygwin_gethostbyname
_gethostname = cygwin_gethostname
@ -302,6 +303,7 @@ getservbyport = cygwin_getservbyport
getservent = cygwin_getservent
getsockname = cygwin_getsockname
getsockopt = cygwin_getsockopt
getusershell
herror = cygwin_herror
hstrerror = cygwin_hstrerror
inet_addr = cygwin_inet_addr
@ -335,6 +337,7 @@ cygwin_set_impersonation_token
setprotoent = cygwin_setprotoent
setservent = cygwin_setservent
setsockopt = cygwin_setsockopt
setusershell
shutdown = cygwin_shutdown
socket = cygwin_socket
cygwin_split_path

View File

@ -214,13 +214,14 @@ details. */
argz_create_sep argz_delete argz_extract argz_insert
argz_next argz_replace argz_stringify envz_add envz_entry
envz_get envz_merge envz_remove envz_strip
92: Export getusershell, setusershell, eetusershell
*/
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
#define CYGWIN_VERSION_API_MAJOR 0
#define CYGWIN_VERSION_API_MINOR 91
#define CYGWIN_VERSION_API_MINOR 92
/* There is also a compatibity version number associated with the
shared memory regions. It is incremented when incompatible

View File

@ -30,6 +30,8 @@ details. */
#include <process.h>
#include <utmp.h>
#include <sys/uio.h>
#include <errno.h>
#include <ctype.h>
#include <limits.h>
#include <unistd.h>
#include <setjmp.h>
@ -2897,3 +2899,67 @@ long gethostid(void)
return hostid;
}
#define ETC_SHELLS "/etc/shells"
static int shell_index;
static FILE *shell_fp;
extern "C" char *
getusershell ()
{
/* List of default shells if no /etc/shells exists, defined as on Linux.
FIXME: SunOS has a far longer list, containing all shells which
might be shipped with the OS. Should we do the same for the Cygwin
distro, adding bash, tcsh, ksh, pdksh and zsh? */
static NO_COPY const char *def_shells[] = {
"/bin/sh",
"/bin/csh",
"/usr/bin/sh",
"/usr/bin/csh",
NULL
};
static char buf[MAX_PATH];
int ch, buf_idx;
if (!shell_fp && !(shell_fp = fopen (ETC_SHELLS, "rt")))
{
if (def_shells[shell_index])
return strcpy (buf, def_shells[shell_index++]);
return NULL;
}
/* Skip white space characters. */
while ((ch = getc (shell_fp)) != EOF && isspace (ch))
;
/* Get each non-whitespace character as part of the shell path as long as
it fits in buf. */
for (buf_idx = 0;
ch != EOF && !isspace (ch) && buf_idx < MAX_PATH;
buf_idx++, ch = getc (shell_fp))
buf[buf_idx] = ch;
/* Skip any trailing non-whitespace character not fitting in buf. If the
path is longer than MAX_PATH, it's invalid anyway. */
while (ch != EOF && !isspace (ch))
ch = getc (shell_fp);
if (buf_idx)
{
buf[buf_idx] = '\0';
return buf;
}
return NULL;
}
extern "C" void
setusershell ()
{
if (shell_fp)
fseek (shell_fp, 0L, SEEK_SET);
shell_index = 0;
}
extern "C" void
endusershell ()
{
if (shell_fp)
fclose (shell_fp);
shell_index = 0;
}