Mercurial > jwe > octave
view liboctave/wrappers/unistd-wrappers.c @ 24118:f87c9f5c0f43
maint: silence several compiler warnings when building for Windows
* sighandlers.cc (w32_interrupt_manager::do_jump_to_enclosing_context): Use
reinterpret_cast to silence compiler warning from -Wold-style-cast.
* welcome-wizard.cc (welcome_wizard::welcome_wizard): Likewise.
* oct-procbuf.cc (octave_procbuf_list): Only define on systems that use it to
silence compiler warning from -Wunused-variable.
* sysdep.cc (w32_shell_execute): Delete empty unused function to silence several
compiler warnings. (raw_mode): Use octave_unused_parameter to silence compiler
warnings from -Wunused-parameter on certain systems.
* cdisplay.c (octave_get_display_info): Use octave_unused_parameter to silence
compiler warning from -Wunused-parameter on certain systems.
* oct-group.cc (octave::sys::group::getgrgid, octave::sys::group::getgrnam,
octave::sys::group::group): Likewise.
* oct-passwd.cc (octave::sys::password::getpwuid,
octave::sys::password::getpwnam, octave::sys::password::password): Likewise.
* signal-wrappers.c (octave_kill_wrapper, block_or_unblock_signal): Likewise.
* wait-for-input.c (octave_wait_for_input): Likewise.
* unistd-wrappers.c (prepare_spawn): Add const-qualifier on argument to silence
compiler warning from -Wdiscarded-qualifiers.
* stat-wrappers.c: Use pragma to disable -Wunused-parameter warnings for wrapper
functions around macros that may discard their arguments on certain systems.
* wait-wrappers.c Use pragma to disable -Wunused-parameter warnings for wrapper
functions around macros that may discard their arguments on certain systems.
Reorder functions to group related wrappers.
(octave_waitpid_wrapper): Use octave_unused_parameter to silence compiler
warning from -Wunused-parameter on certain systems.
author | Mike Miller <mtmiller@octave.org> |
---|---|
date | Sun, 01 Oct 2017 14:52:33 -0700 |
parents | 092078913d54 |
children | 194eb4bd202b |
line wrap: on
line source
/* Copyright (C) 2016-2017 John W. Eaton This file is part of Octave. Octave 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 3 of the License, or (at your option) any later version. Octave 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 Octave; see the file COPYING. If not, see <http://www.gnu.org/licenses/>. */ // These functions may be provided by gnulib. We don't include gnulib // headers directly in Octave's C++ source files to avoid problems that // may be caused by the way that gnulib overrides standard library // functions. #if defined (HAVE_CONFIG_H) # include "config.h" #endif #include <stdio.h> #include <stdio.h> #include <sys/types.h> #include <unistd.h> #if defined (__WIN32__) && ! defined (__CYGWIN__) # include <process.h> #endif #include "unistd-wrappers.h" int octave_access_f_ok (void) { return F_OK; } int octave_access_r_ok (void) { return R_OK; } int octave_access_w_ok (void) { return W_OK; } int octave_access_x_ok (void) { return X_OK; } int octave_access_wrapper (const char *nm, int mode) { return access (nm, mode); } int octave_chdir_wrapper (const char *nm) { return chdir (nm); } int octave_close_wrapper (int fd) { return close (fd); } const char * octave_ctermid_wrapper (void) { #if defined (HAVE_CTERMID) return ctermid (0); #else return "/dev/tty"; #endif } int octave_dup2_wrapper (int fd1, int fd2) { return dup2 (fd1, fd2); } #if defined (__WIN32__) && ! defined (__CYGWIN__) // Adapted from libtool wrapper. /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS \ "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS \ " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" static char ** prepare_spawn (char *const *argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = (char **) malloc (argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = strdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = (char *) malloc (length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = strdup (string); } new_argv[argc] = NULL; return new_argv; } #endif int octave_execv_wrapper (const char *file, char *const *argv) { #if defined (__WIN32__) && ! defined (__CYGWIN__) char **sanitized_argv = prepare_spawn (argv); int status = spawnv (P_OVERLAY, file, sanitized_argv); // This only happens if spawnv fails. char **p = sanitized_argv; while (*p) free (*p++); free (sanitized_argv); return status; #else return execv (file, argv); #endif } int octave_execvp_wrapper (const char *file, char *const *argv) { return execvp (file, argv); } pid_t octave_fork_wrapper (void) { #if defined (HAVE_FORK) return fork (); #else return -1; #endif } int octave_ftruncate_wrapper (int fd, off_t sz) { return ftruncate (fd, sz); } char * octave_getcwd_wrapper (char *nm, size_t len) { return getcwd (nm, len); } gid_t octave_getegid_wrapper (void) { #if defined (HAVE_GETEGID) return getegid (); #else return -1; #endif } uid_t octave_geteuid_wrapper (void) { #if defined (HAVE_GETEUID) return geteuid (); #else return -1; #endif } gid_t octave_getgid_wrapper (void) { #if defined (HAVE_GETGID) return getgid (); #else return -1; #endif } int octave_gethostname_wrapper (char *nm, size_t len) { return gethostname (nm, len); } pid_t octave_getpgrp_wrapper (void) { #if defined (HAVE_GETPGRP) return getpgrp (); #else return -1; #endif } pid_t octave_getpid_wrapper (void) { #if defined (HAVE_GETPID) return getpid (); #else return -1; #endif } pid_t octave_getppid_wrapper (void) { #if defined (HAVE_GETPPID) return getppid (); #else return -1; #endif } uid_t octave_getuid_wrapper (void) { #if defined (HAVE_GETUID) return getuid (); #else return -1; #endif } int octave_isatty_wrapper (int fd) { return isatty (fd); } int octave_link_wrapper (const char *nm1, const char *nm2) { return link (nm1, nm2); } int octave_pipe_wrapper (int *fd) { return pipe (fd); } int octave_rmdir_wrapper (const char *nm) { return rmdir (nm); } pid_t octave_setsid_wrapper (void) { #if defined (HAVE_SETSID) return setsid (); #else return -1; #endif } int octave_stdin_fileno (void) { return STDIN_FILENO; } int octave_stdout_fileno (void) { return STDOUT_FILENO; } int octave_symlink_wrapper (const char *nm1, const char *nm2) { return symlink (nm1, nm2); } int octave_unlink_wrapper (const char *nm) { return unlink (nm); } pid_t octave_vfork_wrapper (void) { #if defined (HAVE_VFORK) return vfork (); #else return -1; #endif } bool octave_have_fork (void) { #if defined (HAVE_FORK) return true; #else return false; #endif } bool octave_have_vfork (void) { #if defined (HAVE_VFORK) return true; #else return false; #endif }