grammar updates
[mono.git] / mono / io-layer / processes.c
index 07bfefde119618caa79d04da4b07b12099d0c35d..79737275b72d7d44a645fff9ef469d82f1415eef 100644 (file)
 #include <unistd.h>
 
 #include <mono/io-layer/wapi.h>
-#include <mono/io-layer/unicode.h>
 #include <mono/io-layer/wapi-private.h>
 #include <mono/io-layer/handles-private.h>
 #include <mono/io-layer/misc-private.h>
 #include <mono/io-layer/mono-mutex.h>
 #include <mono/io-layer/process-private.h>
 #include <mono/io-layer/threads.h>
+#include <mono/utils/strenc.h>
 
 /* The process' environment strings */
 extern char **environ;
@@ -125,7 +125,7 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
         * so crap, with an API like this :-(
         */
        if(appname!=NULL) {
-               cmd=_wapi_unicode_to_utf8 (appname);
+               cmd=mono_unicode_to_external (appname);
                if(cmd==NULL) {
 #ifdef DEBUG
                        g_message (G_GNUC_PRETTY_FUNCTION
@@ -145,7 +145,7 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
        }
        
        if(cmdline!=NULL) {
-               args=_wapi_unicode_to_utf8 (cmdline);
+               args=mono_unicode_to_external (cmdline);
                if(args==NULL) {
 #ifdef DEBUG
                        g_message (G_GNUC_PRETTY_FUNCTION
@@ -155,17 +155,10 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
                        SetLastError(ERROR_PATH_NOT_FOUND);
                        goto cleanup;
                }
-
-               /* Turn all the slashes round the right way */
-               for(i=0; i<strlen (args); i++) {
-                       if(args[i]=='\\') {
-                               args[i]='/';
-                       }
-               }
        }
 
        if(cwd!=NULL) {
-               dir=_wapi_unicode_to_utf8 (cwd);
+               dir=mono_unicode_to_external (cwd);
                if(dir==NULL) {
 #ifdef DEBUG
                        g_message (G_GNUC_PRETTY_FUNCTION
@@ -198,7 +191,7 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
         */
        if(new_environ!=NULL) {
                gchar **strings;
-               guint32 count;
+               guint32 count=0;
                gunichar2 *new_environp;
 
                /* Count the number of strings */
@@ -212,13 +205,13 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
                strings=g_new0 (gchar *, count);
                
                /* Copy each environ string into 'strings' turning it
-                * into utf8 at the same time
+                * into utf8 (or the requested encoding) at the same
+                * time
                 */
                count=0;
                for(new_environp=(gunichar2 *)new_environ; *new_environp;
                    new_environp++) {
-                       strings[count]=g_utf16_to_utf8 (new_environp, -1, NULL,
-                                                       NULL, NULL);
+                       strings[count]=mono_unicode_to_external (new_environp);
                        count++;
                        while(*new_environp) {
                                new_environp++;
@@ -250,10 +243,10 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
 
                        /* Executable existing ? */
                        if(access (prog, X_OK)!=0) {
-                               g_free (prog);
 #ifdef DEBUG
-                               g_message (G_GNUC_PRETTY_FUNCTION ": Couldn't find executable %s", token);
+                               g_message (G_GNUC_PRETTY_FUNCTION ": Couldn't find executable %s", prog);
 #endif
+                               g_free (prog);
                                SetLastError (ERROR_FILE_NOT_FOUND);
                                goto cleanup;
                        }
@@ -307,7 +300,7 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
                        for(i=0; args[i]!='\0'; i++) {
                                if(g_ascii_isspace (args[i])) {
                                        token=g_strndup (args, i);
-                                       args_after_prog=args+i;
+                                       args_after_prog=args+i+1;
                                        break;
                                }
                        }
@@ -330,6 +323,13 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
                        goto cleanup;
                }
                
+               /* Turn all the slashes round the right way. Only for the prg. name */
+               for(i=0; i < strlen (token); i++) {
+                       if (token[i]=='\\') {
+                               token[i]='/';
+                       }
+               }
+
                if(g_ascii_isalpha (token[0]) && (token[1]==':')) {
                        /* Strip off the drive letter.  I can't
                         * believe that CP/M holdover is still
@@ -452,43 +452,40 @@ cleanup:
        
        return(ret);
 }
-
-static gboolean process_compare (gpointer handle, gpointer user_data)
+               
+static void process_set_name (struct _WapiHandle_process *process_handle)
 {
-       struct _WapiHandle_process *process_handle;
-       gboolean ok;
-       pid_t pid;
+       gchar *progname, *utf8_progname, *slash;
        
-       ok=_wapi_lookup_handle (handle, WAPI_HANDLE_PROCESS,
-                               (gpointer *)&process_handle, NULL);
-       if(ok==FALSE) {
-               g_warning (G_GNUC_PRETTY_FUNCTION
-                          ": error looking up process handle %p", handle);
-               return(FALSE);
-       }
+       progname=g_get_prgname ();
+       utf8_progname=mono_utf8_from_external (progname);
 
-       pid=GPOINTER_TO_UINT (user_data);
-       if(process_handle->id==pid) {
-               return(TRUE);
-       } else {
-               return(FALSE);
+#ifdef DEBUG
+       g_message (G_GNUC_PRETTY_FUNCTION ": using [%s] as prog name",
+                  progname);
+#endif
+
+       if(utf8_progname!=NULL) {
+               slash=strrchr (utf8_progname, '/');
+               if(slash!=NULL) {
+                       process_handle->proc_name=_wapi_handle_scratch_store (slash+1, strlen (slash+1));
+               } else {
+                       process_handle->proc_name=_wapi_handle_scratch_store (utf8_progname, strlen (utf8_progname));
+               }
+
+               g_free (utf8_progname);
        }
 }
-       
+
 static void process_set_current (void)
 {
        struct _WapiHandle_process *process_handle;
        gboolean ok;
        pid_t pid=getpid ();
+       char *handle_env;
        
-       current_process=_wapi_search_handle (WAPI_HANDLE_PROCESS,
-                                            process_compare,
-                                            GUINT_TO_POINTER (pid),
-                                            (gpointer *)&process_handle,
-                                            NULL);
-       if(current_process==0) {
-               gchar *progname, *slash;
-               
+       handle_env=getenv ("_WAPI_PROCESS_HANDLE");
+       if(handle_env==NULL) {
 #ifdef DEBUG
                g_message (G_GNUC_PRETTY_FUNCTION
                           ": Need to create my own process handle");
@@ -515,31 +512,52 @@ static void process_set_current (void)
                /* These seem to be the defaults on w2k */
                process_handle->min_working_set=204800;
                process_handle->max_working_set=1413120;
+
+               process_set_name (process_handle);
+               
+               /* Make sure the new handle has a reference so it wont go away
+                * until this process exits
+                */
+               _wapi_handle_ref (current_process);
+       } else {
+               guchar *procname;
                
-               progname=g_get_prgname ();
+               current_process=GUINT_TO_POINTER (atoi (handle_env));
 
 #ifdef DEBUG
-               g_message (G_GNUC_PRETTY_FUNCTION ": using [%s] as prog name",
-                          progname);
+               g_message (G_GNUC_PRETTY_FUNCTION
+                          ": Found my process handle: %p", current_process);
 #endif
 
-               if(progname!=NULL) {
-                       slash=strrchr (progname, '/');
-                       if(slash!=NULL) {
-                               process_handle->proc_name=_wapi_handle_scratch_store (slash+1, strlen (slash+1));
-                       } else {
-                               process_handle->proc_name=_wapi_handle_scratch_store (progname, strlen (progname));
-                       }
+               ok=_wapi_lookup_handle (current_process, WAPI_HANDLE_PROCESS,
+                                       (gpointer *)&process_handle, NULL);
+               if(ok==FALSE) {
+                       g_warning (G_GNUC_PRETTY_FUNCTION
+                                  ": error looking up process handle %p",
+                                  current_process);
+                       return;
                }
 
-               /* Make sure the new handle has a reference so it wont go away
-                * until this process exits
-                */
-               _wapi_handle_ref (current_process);
-       } else {
+               procname=_wapi_handle_scratch_lookup (process_handle->proc_name);
+               if(procname!=NULL) {
+                       if(!strcmp (procname, "mono")) {
+                               /* Set a better process name */
+#ifdef DEBUG
+                               g_message (G_GNUC_PRETTY_FUNCTION ": Setting better process name");
+#endif
+
+                               _wapi_handle_scratch_delete (process_handle->proc_name);
+                               process_set_name (process_handle);
+                       } else {
 #ifdef DEBUG
-               g_message (G_GNUC_PRETTY_FUNCTION ": Found my process handle");
+                               g_message (G_GNUC_PRETTY_FUNCTION
+                                          ": Leaving process name: %s",
+                                          procname);
 #endif
+                       }
+                       
+                       g_free (procname);
+               }
        }
 }
 
@@ -813,7 +831,7 @@ guint32 GetModuleBaseName (gpointer process, gpointer module,
 #endif
 
                pid=process_handle->id;
-               procname_utf8=_wapi_handle_scratch_lookup_as_string (process_handle->proc_name);
+               procname_utf8=_wapi_handle_scratch_lookup (process_handle->proc_name);
        
 #ifdef DEBUG
                g_message (G_GNUC_PRETTY_FUNCTION ": Process name is [%s]",