Re: [PATCHES] pg_ctl using START with paths needing quotes

Andrew Dunstan <[email protected]>
Newsgroups gmane.comp.db.postgresql.devel.win32,gmane.comp.db.postgresql.devel.patches
Message-ID <[email protected]>
Bruce Momjian wrote:

>Tom Lane wrote:
>  
>
>>Andrew Dunstan <[email protected]> writes:
>>    
>>
>>>Bruce Momjian wrote:
>>>      
>>>
>>>>This applied patch changes the way pg_ctl starts on Win32.
>>>>
>>>>Using START, it is not possible to quote the executable name, who's
>>>>directory might have spaces:
>>>>        
>>>>
>>>This is a really ugly hack (I take the blame since I gave Bruce the 
>>>idea). There are a few things to note:
>>>      
>>>
>>>. the .bat file should probably be created in the data dir - that's 
>>>about the only place that we should be guaranteed we can write.
>>>      
>>>
>>In that case, haven't we simply moved the spaces problem from the
>>executable directory to the data directory?
>>    
>>
>
>Yep.  That code is all gone now that we have the right fix, use:
>
>	 START "" "executable"
>
>  
>

For the record, and in case we need to use it in future, here's what I 
got working in pg_ctl.c for starting without any shell call required 
(lacks error checking).

cheers

andrew


#ifdef WIN32
 
    char exepath[MAXPGPATH];
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    bool rval;
    int null_fd, log_fd;
    int save_stdin, save_stdout, save_stderr;
 
    save_stdin = _dup(fileno(stdin));
 
    ZeroMemory(&si,sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
 
    null_fd = open("nul",O_RDONLY,0);
    dup2(null_fd, fileno(stdin));
    if (log_file != NULL)
      {
        save_stdout = _dup(fileno(stdout));
        save_stderr = _dup(fileno(stderr));
        log_fd = open(log_file,O_WRONLY|O_CREAT|O_APPEND,0700);
        dup2(log_fd, fileno(stdout));
        dup2(log_fd ,fileno(stderr));
      }
 
    snprintf(exepath,MAXPGPATH,"%s",postgres_path);
    snprintf(cmd,MAXPGPATH,"\"%s\" %s",postgres_path,post_opts);
    rval = CreateProcess(exepath,cmd,NULL,NULL,true,0,NULL,NULL,&si,&pi);
    if (rval == 0)
      {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
      }
    dup2(save_stdin, fileno(stdin));
    close(null_fd);
    if (log_file != NULL)
      {
        dup2(save_stdout,fileno(stdout));
        dup2(save_stderr,fileno(stderr));
        close(log_fd);
      }
    return (rval == 0);
 
#else

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.