X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fos_priority.c;h=5946f2b3d4b32ae4ad256a0859bb64631c906742;hb=72c8645af31896829b674b575c5375706f362a30;hp=68b63908d3b897d8839c3a51bd7081871a5094bf;hpb=f25e1bdd066cf5a06bd6a3f5ed1806007259b546;p=oweals%2Fgnunet.git diff --git a/src/util/os_priority.c b/src/util/os_priority.c index 68b63908d..5946f2b3d 100644 --- a/src/util/os_priority.c +++ b/src/util/os_priority.c @@ -151,9 +151,20 @@ GNUNET_OS_install_parent_control_handler (void *cls, putenv (GNUNET_OS_CONTROL_PIPE "="); return; } - /* Gcc will issue a warning here. What to do with it? */ +#if !defined (WINDOWS) + if (pipe_fd >= FD_SETSIZE) +#else + if ((FILE_TYPE_UNKNOWN == GetFileType ((HANDLE) (uintptr_t) pipe_fd)) + && (0 != GetLastError ())) +#endif + { + LOG (GNUNET_ERROR_TYPE_ERROR, + "GNUNET_OS_CONTROL_PIPE `%s' contains garbage?\n", env_buf); + putenv (GNUNET_OS_CONTROL_PIPE "="); + return; + } #if WINDOWS - control_pipe = GNUNET_DISK_get_handle_from_w32_handle ((HANDLE) pipe_fd); + control_pipe = GNUNET_DISK_get_handle_from_w32_handle ((HANDLE) (uintptr_t) pipe_fd); #else control_pipe = GNUNET_DISK_get_handle_from_int_fd ((int) pipe_fd); #endif @@ -332,112 +343,6 @@ child_wait_thread (void *arg) #endif -/** - * Set process priority - * - * @param proc pointer to process structure - * @param prio priority value - * @return GNUNET_OK on success, GNUNET_SYSERR on error - */ -int -GNUNET_OS_set_process_priority (struct GNUNET_OS_Process *proc, - enum GNUNET_SCHEDULER_Priority prio) -{ - int rprio; - - GNUNET_assert (prio < GNUNET_SCHEDULER_PRIORITY_COUNT); - if (GNUNET_SCHEDULER_PRIORITY_KEEP == prio) - return GNUNET_OK; - - /* convert to MINGW/Unix values */ - switch (prio) - { - case GNUNET_SCHEDULER_PRIORITY_UI: - case GNUNET_SCHEDULER_PRIORITY_URGENT: -#ifdef MINGW - rprio = HIGH_PRIORITY_CLASS; -#else - rprio = 0; -#endif - break; - - case GNUNET_SCHEDULER_PRIORITY_HIGH: -#ifdef MINGW - rprio = ABOVE_NORMAL_PRIORITY_CLASS; -#else - rprio = 5; -#endif - break; - - case GNUNET_SCHEDULER_PRIORITY_DEFAULT: -#ifdef MINGW - rprio = NORMAL_PRIORITY_CLASS; -#else - rprio = 7; -#endif - break; - - case GNUNET_SCHEDULER_PRIORITY_BACKGROUND: -#ifdef MINGW - rprio = BELOW_NORMAL_PRIORITY_CLASS; -#else - rprio = 10; -#endif - break; - - case GNUNET_SCHEDULER_PRIORITY_IDLE: -#ifdef MINGW - rprio = IDLE_PRIORITY_CLASS; -#else - rprio = 19; -#endif - break; - default: - GNUNET_assert (0); - return GNUNET_SYSERR; - } - - /* Set process priority */ -#ifdef MINGW - { - HANDLE h = proc->handle; - - GNUNET_assert (h != NULL); - SetPriorityClass (h, rprio); - } -#elif LINUX - pid_t pid; - - pid = proc->pid; - if ((0 == pid) || (pid == getpid ())) - { - int have = nice (0); - int delta = rprio - have; - - errno = 0; - if ((delta != 0) && (rprio == nice (delta)) && (errno != 0)) - { - LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, "nice"); - return GNUNET_SYSERR; - } - } - else - { - if (0 != setpriority (PRIO_PROCESS, pid, rprio)) - { - LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, - "setpriority"); - return GNUNET_SYSERR; - } - } -#else - LOG (GNUNET_ERROR_TYPE_DEBUG | GNUNET_ERROR_TYPE_BULK, - "Priority management not availabe for this platform\n"); -#endif - return GNUNET_OK; -} - - #if MINGW static char * CreateCustomEnvTable (char **vars) @@ -623,12 +528,13 @@ start_process (int pipe_control, int fd_stdin_read; int fd_stdin_write; - if (GNUNET_SYSERR == GNUNET_OS_check_helper_binary (filename)) + if (GNUNET_SYSERR == GNUNET_OS_check_helper_binary (filename, GNUNET_NO, NULL)) return NULL; /* not executable */ if (GNUNET_YES == pipe_control) { struct GNUNET_DISK_PipeHandle *childpipe; int dup_childpipe_read_fd = -1; + childpipe = GNUNET_DISK_pipe (GNUNET_NO, GNUNET_NO, GNUNET_YES, GNUNET_NO); if (NULL == childpipe) return NULL; @@ -640,9 +546,9 @@ start_process (int pipe_control, &childpipe_read_fd, sizeof (int))) || (-1 == (dup_childpipe_read_fd = dup (childpipe_read_fd)))) { - if (childpipe_read) + if (NULL != childpipe_read) GNUNET_DISK_file_close (childpipe_read); - if (childpipe_write) + if (NULL != childpipe_write) GNUNET_DISK_file_close (childpipe_write); if (0 <= dup_childpipe_read_fd) close (dup_childpipe_read_fd); @@ -653,8 +559,8 @@ start_process (int pipe_control, } else { - childpipe_read = NULL; childpipe_write = NULL; + childpipe_read_fd = -1; } if (NULL != pipe_stdout) { @@ -699,9 +605,7 @@ start_process (int pipe_control, int eno = errno; LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "fork"); GNUNET_array_grow (lscp, ls, 0); - if (childpipe_read) - GNUNET_DISK_file_close (childpipe_read); - if (childpipe_write) + if (NULL != childpipe_write) GNUNET_DISK_file_close (childpipe_write); if (0 <= childpipe_read_fd) close (childpipe_read_fd); @@ -710,6 +614,7 @@ start_process (int pipe_control, } if (0 != ret) { + unsetenv (GNUNET_OS_CONTROL_PIPE); gnunet_proc = GNUNET_malloc (sizeof (struct GNUNET_OS_Process)); gnunet_proc->pid = ret; gnunet_proc->control_pipe = childpipe_write; @@ -730,6 +635,8 @@ start_process (int pipe_control, snprintf (fdbuf, 100, "%x", childpipe_read_fd); setenv (GNUNET_OS_CONTROL_PIPE, fdbuf, 1); } + else + unsetenv (GNUNET_OS_CONTROL_PIPE); if (NULL != pipe_stdin) { GNUNET_break (0 == close (fd_stdin_write)); @@ -851,7 +758,7 @@ start_process (int pipe_control, BOOL bresult; DWORD error_code; - if (GNUNET_SYSERR == GNUNET_OS_check_helper_binary (filename)) + if (GNUNET_SYSERR == GNUNET_OS_check_helper_binary (filename, GNUNET_NO, NULL)) return NULL; /* not executable */ /* Search in prefix dir (hopefully - the directory from which @@ -1057,7 +964,6 @@ start_process (int pipe_control, if (childpipe_write) GNUNET_DISK_file_close (childpipe_write); GNUNET_free (cmd); - GNUNET_free (path); return NULL; } /* Unlike *nix variant, we don't dup the handle, so can't close @@ -1078,7 +984,6 @@ start_process (int pipe_control, if (lsocks_pipe == NULL) { GNUNET_free (cmd); - GNUNET_free (path); GNUNET_DISK_pipe_close (lsocks_pipe); if (GNUNET_YES == pipe_control) { @@ -1150,7 +1055,7 @@ start_process (int pipe_control, return NULL; } - bresult = CreateProcessW (wpath, wcmd, NULL, NULL, TRUE, + bresult = CreateProcessW (wpath, wcmd, NULL, NULL, GNUNET_YES, DETACHED_PROCESS | CREATE_SUSPENDED, env_block, NULL, &start, &proc); error_code = GetLastError (); @@ -1169,7 +1074,6 @@ start_process (int pipe_control, GNUNET_free (env_block); GNUNET_free (cmd); - GNUNET_free (path); free (wpath); free (wcmd); if (GNUNET_YES == pipe_control)