Hi Vincent,

On Sat, Apr 14, 2018 at 2:05 PM, <Vincent.Blondeau@lamresearch.com> wrote:



I would like to know from inside the image whether the ST image is a console executable, e.g. PharoConsole.exe vs Pharo.exe (Related to this pull request: https://github.com/pharo-project/pharo/pull/694).

The solution is to add a primitive inside the VM but I have no idea where I should look for…

Could someone give me some pointers?

A quick hack would be to use system attribute 0, the name of the executable:

Smalltalk getSystemAttribute: 0 '/Users/eliot/oscogvm/build.macos64x64/squeak.cog.spur/Squeak.app/Contents/MacOS/Squeak'

and match for Console.exe.  A more thorough approach on unix is to test stdin to see if it is attached to a tty.  Try this at a unix/macos terminal:

$ tty
$ tty </dev/null
not a tty
$ man 3 ttyname
$ man 2 ioctl

I'm not sure how to do this on Windows.  I wrote this in platforms/win32/vm/sqWin32Main.c::WinMain

#if 0 /* This way used to work.  Does no longer. */
  DWORD mode;

  fIsConsole = GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &mode);
#elif 0 /* This does /not/ work with STD_INPUT_HANDLE or STD_OUTPUT_HANDLE */

  if ((fIsConsole = GetConsoleScreenBufferInfo
                        (GetStdHandle(STD_INPUT_HANDLE), &csbi)))
        fIsConsole = csbi.dwCursorPosition.X || csbi.dwCursorPosition.Y;
#else /* This /does/ work; see */
    /* https://stackoverflow.com/questions/9009333/how-to-check-if-the-program-is-run-from-a-console */
  HWND consoleWnd = GetConsoleWindow();
  DWORD dwProcessId;
  GetWindowThreadProcessId(consoleWnd, &dwProcessId);
  fIsConsole = GetCurrentProcessId() != dwProcessId;

but it seems like a hack to me.  I'd love to know what the approved future proof way is.


Thanks in advance!



Vincent Blondeau
Software Engineer, Software and Controls | Global Product Group
Desk +1 510.572.7499

Lam Research Corporation
4650 Cushing Pkwy, Fremont, CA 94538 USA | www.lamresearch.com

Connect with Lam Research: Facebook | Twitter | LinkedIn


best, Eliot