Commit ecb651c0 authored by Alexandre Julliard's avatar Alexandre Julliard

tools: Add a common helper to get the argv0 directory.

parent a0a3c25e
...@@ -30,6 +30,9 @@ ...@@ -30,6 +30,9 @@
#include <fcntl.h> #include <fcntl.h>
#include <time.h> #include <time.h>
#include <errno.h> #include <errno.h>
#ifdef HAVE_SYS_SYSCTL_H
# include <sys/sysctl.h>
#endif
#ifdef _WIN32 #ifdef _WIN32
# include <direct.h> # include <direct.h>
...@@ -603,6 +606,29 @@ static inline struct target init_argv0_target( const char *argv0 ) ...@@ -603,6 +606,29 @@ static inline struct target init_argv0_target( const char *argv0 )
} }
static inline char *get_argv0_dir( const char *argv0 )
{
#ifndef _WIN32
char *dir = NULL;
#if defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
dir = realpath( "/proc/self/exe", NULL );
#elif defined (__FreeBSD__) || defined(__DragonFly__)
static int pathname[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
size_t path_size = PATH_MAX;
char *path = xmalloc( path_size );
if (!sysctl( pathname, ARRAY_SIZE(pathname), path, &path_size, NULL, 0 ))
dir = realpath( path, NULL );
free( path );
#endif
if (!dir && !(dir = realpath( argv0, NULL ))) return NULL;
return get_dirname( dir );
#else
return get_dirname( argv0 );
#endif
}
/* output buffer management */ /* output buffer management */
extern unsigned char *output_buffer; extern unsigned char *output_buffer;
......
...@@ -31,9 +31,6 @@ ...@@ -31,9 +31,6 @@
#include <signal.h> #include <signal.h>
#include <limits.h> #include <limits.h>
#include <sys/types.h> #include <sys/types.h>
#ifdef HAVE_SYS_SYSCTL_H
# include <sys/sysctl.h>
#endif
#include "widl.h" #include "widl.h"
#include "utils.h" #include "utils.h"
...@@ -482,23 +479,11 @@ void write_id_data(const statement_list_t *stmts) ...@@ -482,23 +479,11 @@ void write_id_data(const statement_list_t *stmts)
static void init_argv0_dir( const char *argv0 ) static void init_argv0_dir( const char *argv0 )
{ {
#ifndef _WIN32 char *dir = get_argv0_dir( argv0 );
char *dir = NULL;
if (!dir) return;
#if defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) includedir = strmake( "%s/%s", dir, BIN_TO_INCLUDEDIR );
dir = realpath( "/proc/self/exe", NULL ); dlldir = strmake( "%s/%s", dir, BIN_TO_DLLDIR );
#elif defined (__FreeBSD__) || defined(__DragonFly__)
static int pathname[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
size_t path_size = PATH_MAX;
char *path = xmalloc( path_size );
if (!sysctl( pathname, ARRAY_SIZE(pathname), path, &path_size, NULL, 0 ))
dir = realpath( path, NULL );
free( path );
#endif
if (!dir && !(dir = realpath( argv0, NULL ))) return;
includedir = strmake( "%s/%s", get_dirname( dir ), BIN_TO_INCLUDEDIR );
dlldir = strmake( "%s/%s", get_dirname( dir ), BIN_TO_DLLDIR );
#endif
} }
static void option_callback( int optc, char *optarg ) static void option_callback( int optc, char *optarg )
......
...@@ -98,9 +98,6 @@ ...@@ -98,9 +98,6 @@
#include <ctype.h> #include <ctype.h>
#include <limits.h> #include <limits.h>
#include <sys/types.h> #include <sys/types.h>
#ifdef HAVE_SYS_SYSCTL_H
# include <sys/sysctl.h>
#endif
#include "utils.h" #include "utils.h"
...@@ -646,24 +643,9 @@ static char *get_lib_dir( struct options *opts ) ...@@ -646,24 +643,9 @@ static char *get_lib_dir( struct options *opts )
static void init_argv0_dir( const char *argv0 ) static void init_argv0_dir( const char *argv0 )
{ {
#ifndef _WIN32 if (!(bindir = get_argv0_dir( argv0 ))) return;
char *dir = NULL;
#if defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
dir = realpath( "/proc/self/exe", NULL );
#elif defined (__FreeBSD__) || defined(__DragonFly__)
static int pathname[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
size_t path_size = PATH_MAX;
char *path = xmalloc( path_size );
if (!sysctl( pathname, ARRAY_SIZE(pathname), path, &path_size, NULL, 0 ))
dir = realpath( path, NULL );
free( path );
#endif
if (!dir && !(dir = realpath( argv0, NULL ))) return;
bindir = get_dirname( dir );
includedir = strmake( "%s/%s", bindir, BIN_TO_INCLUDEDIR ); includedir = strmake( "%s/%s", bindir, BIN_TO_INCLUDEDIR );
libdir = strmake( "%s/%s", bindir, BIN_TO_LIBDIR ); libdir = strmake( "%s/%s", bindir, BIN_TO_LIBDIR );
#endif
} }
static void compile(struct options* opts, const char* lang) static void compile(struct options* opts, const char* lang)
......
...@@ -26,9 +26,6 @@ ...@@ -26,9 +26,6 @@
#include <signal.h> #include <signal.h>
#include <limits.h> #include <limits.h>
#include <sys/types.h> #include <sys/types.h>
#ifdef HAVE_SYS_SYSCTL_H
# include <sys/sysctl.h>
#endif
#include "wmc.h" #include "wmc.h"
#include "utils.h" #include "utils.h"
...@@ -149,24 +146,11 @@ static void exit_on_signal( int sig ) ...@@ -149,24 +146,11 @@ static void exit_on_signal( int sig )
static void init_argv0_dir( const char *argv0 ) static void init_argv0_dir( const char *argv0 )
{ {
#ifndef _WIN32 char *dir = get_argv0_dir( argv0 );
char *dir = NULL;
if (!dir) return;
#if defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
dir = realpath( "/proc/self/exe", NULL );
#elif defined (__FreeBSD__) || defined(__DragonFly__)
static int pathname[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
size_t path_size = PATH_MAX;
char *path = xmalloc( path_size );
if (!sysctl( pathname, ARRAY_SIZE(pathname), path, &path_size, NULL, 0 ))
dir = realpath( path, NULL );
free( path );
#endif
if (!dir && !(dir = realpath( argv0, NULL ))) return;
dir = get_dirname( dir );
if (strendswith( dir, "/tools/wmc" )) nlsdirs[0] = strmake( "%s/../../nls", dir ); if (strendswith( dir, "/tools/wmc" )) nlsdirs[0] = strmake( "%s/../../nls", dir );
else nlsdirs[0] = strmake( "%s/%s", dir, BIN_TO_NLSDIR ); else nlsdirs[0] = strmake( "%s/%s", dir, BIN_TO_NLSDIR );
#endif
} }
static void option_callback( int optc, char *optarg ) static void option_callback( int optc, char *optarg )
......
...@@ -29,9 +29,6 @@ ...@@ -29,9 +29,6 @@
#include <signal.h> #include <signal.h>
#include <limits.h> #include <limits.h>
#include <sys/types.h> #include <sys/types.h>
#ifdef HAVE_SYS_SYSCTL_H
# include <sys/sysctl.h>
#endif
#include "../tools.h" #include "../tools.h"
#include "wrc.h" #include "wrc.h"
...@@ -294,25 +291,12 @@ static int load_file( const char *input_name, const char *output_name ) ...@@ -294,25 +291,12 @@ static int load_file( const char *input_name, const char *output_name )
static void init_argv0_dir( const char *argv0 ) static void init_argv0_dir( const char *argv0 )
{ {
#ifndef _WIN32 char *dir = get_argv0_dir( argv0 );
char *dir = NULL;
if (!dir) return;
#if defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
dir = realpath( "/proc/self/exe", NULL );
#elif defined (__FreeBSD__) || defined(__DragonFly__)
static int pathname[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
size_t path_size = PATH_MAX;
char *path = xmalloc( path_size );
if (!sysctl( pathname, ARRAY_SIZE(pathname), path, &path_size, NULL, 0 ))
dir = realpath( path, NULL );
free( path );
#endif
if (!dir && !(dir = realpath( argv0, NULL ))) return;
dir = get_dirname( dir );
includedir = strmake( "%s/%s", dir, BIN_TO_INCLUDEDIR ); includedir = strmake( "%s/%s", dir, BIN_TO_INCLUDEDIR );
if (strendswith( dir, "/tools/wrc" )) nlsdirs[0] = strmake( "%s/../../nls", dir ); if (strendswith( dir, "/tools/wrc" )) nlsdirs[0] = strmake( "%s/../../nls", dir );
else nlsdirs[0] = strmake( "%s/%s", dir, BIN_TO_NLSDIR ); else nlsdirs[0] = strmake( "%s/%s", dir, BIN_TO_NLSDIR );
#endif
} }
static void option_callback( int optc, char *optarg ) static void option_callback( int optc, char *optarg )
......
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