freebsd-dev/crypto/openssh/openbsd-compat/bsd-cygwin_util.c

121 lines
3.2 KiB
C
Raw Normal View History

2002-06-27 22:31:32 +00:00
/*
2013-05-17 08:55:26 +00:00
* Copyright (c) 2000, 2001, 2011, 2013 Corinna Vinschen <vinschen@redhat.com>
2002-06-27 22:31:32 +00:00
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Created: Sat Sep 02 12:17:00 2000 cv
*
* This file contains functions for forcing opened file descriptors to
* binary mode on Windows systems.
*/
2013-05-17 08:55:26 +00:00
#define NO_BINARY_OPEN /* Avoid redefining open to binary_open for this file */
2002-06-27 22:31:32 +00:00
#include "includes.h"
#ifdef HAVE_CYGWIN
2006-09-30 13:29:51 +00:00
#include <sys/types.h>
#include <fcntl.h>
2013-05-17 08:55:26 +00:00
#include <string.h>
2006-09-30 13:29:51 +00:00
#include <unistd.h>
2018-08-28 10:47:58 +00:00
#include <stdarg.h>
2006-09-30 13:29:51 +00:00
2005-06-05 15:40:50 +00:00
#include "xmalloc.h"
2002-06-27 22:31:32 +00:00
2017-01-31 12:33:47 +00:00
int
2004-01-07 11:10:17 +00:00
binary_open(const char *filename, int flags, ...)
2002-06-27 22:31:32 +00:00
{
va_list ap;
mode_t mode;
2017-01-31 12:33:47 +00:00
2002-06-27 22:31:32 +00:00
va_start(ap, flags);
mode = va_arg(ap, mode_t);
va_end(ap);
2004-01-07 11:10:17 +00:00
return (open(filename, flags | O_BINARY, mode));
2002-06-27 22:31:32 +00:00
}
2004-01-07 11:10:17 +00:00
int
check_ntsec(const char *filename)
2002-06-27 22:31:32 +00:00
{
2008-07-23 09:33:08 +00:00
return (pathconf(filename, _PC_POSIX_PERMISSIONS));
2002-06-27 22:31:32 +00:00
}
2015-01-05 16:09:55 +00:00
const char *
cygwin_ssh_privsep_user()
{
static char cyg_privsep_user[DNLEN + UNLEN + 2];
if (!cyg_privsep_user[0])
{
#ifdef CW_CYGNAME_FROM_WINNAME
if (cygwin_internal (CW_CYGNAME_FROM_WINNAME, "sshd", cyg_privsep_user,
sizeof cyg_privsep_user) != 0)
#endif
2015-07-02 13:18:50 +00:00
strlcpy(cyg_privsep_user, "sshd", sizeof(cyg_privsep_user));
2015-01-05 16:09:55 +00:00
}
return cyg_privsep_user;
}
2005-06-05 15:40:50 +00:00
#define NL(x) x, (sizeof (x) - 1)
#define WENV_SIZ (sizeof (wenv_arr) / sizeof (wenv_arr[0]))
static struct wenv {
const char *name;
size_t namelen;
} wenv_arr[] = {
{ NL("ALLUSERSPROFILE=") },
{ NL("COMPUTERNAME=") },
{ NL("COMSPEC=") },
2005-06-05 15:41:57 +00:00
{ NL("CYGWIN=") },
2005-06-05 15:40:50 +00:00
{ NL("OS=") },
{ NL("PATH=") },
{ NL("PATHEXT=") },
2012-08-29 15:46:01 +00:00
{ NL("PROGRAMFILES=") },
2005-06-05 15:40:50 +00:00
{ NL("SYSTEMDRIVE=") },
{ NL("SYSTEMROOT=") },
2005-06-05 15:41:57 +00:00
{ NL("WINDIR=") }
2005-06-05 15:40:50 +00:00
};
char **
fetch_windows_environment(void)
{
char **e, **p;
2006-09-30 13:29:51 +00:00
unsigned int i, idx = 0;
2005-06-05 15:40:50 +00:00
2006-09-30 13:29:51 +00:00
p = xcalloc(WENV_SIZ + 1, sizeof(char *));
2005-06-05 15:40:50 +00:00
for (e = environ; *e != NULL; ++e) {
for (i = 0; i < WENV_SIZ; ++i) {
if (!strncmp(*e, wenv_arr[i].name, wenv_arr[i].namelen))
p[idx++] = *e;
}
}
p[idx] = NULL;
return p;
}
void
free_windows_environment(char **p)
{
2013-09-18 17:27:38 +00:00
free(p);
2005-06-05 15:40:50 +00:00
}
2002-06-27 22:31:32 +00:00
#endif /* HAVE_CYGWIN */