//===-- Launcher.cpp --------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

//----------------------------------------------------------------------
// Darwin launch helper
//
// This program was written to allow programs to be launched in a new
// Terminal.app window and have the application be stopped for debugging
// at the program entry point.
//
// Although it uses posix_spawn(), it uses Darwin specific posix spawn
// attribute flags to accomplish its task. It uses an "exec only" flag
// which avoids forking this process, and it uses a "stop at entry"
// flag to stop the program at the entry point.
// 
// Since it uses darwin specific flags this code should not be compiled
// on other systems.
//----------------------------------------------------------------------
#if defined (__APPLE__)

#include <crt_externs.h> // for _NSGetEnviron()
#include <getopt.h>
#include <limits.h>
#include <mach/machine.h>
#include <signal.h>
#include <spawn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/un.h>

#include <string>

#ifndef _POSIX_SPAWN_DISABLE_ASLR
#define _POSIX_SPAWN_DISABLE_ASLR       0x0100
#endif

#define streq(a,b) strcmp(a,b) == 0

static struct option g_long_options[] = 
{
	{ "arch",			required_argument,	NULL,           'a'		},
	{ "disable-aslr",   no_argument,		NULL,           'd'		},
	{ "no-env",         no_argument,		NULL,           'e'		},
	{ "help",           no_argument,		NULL,           'h'		},
	{ "setsid",         no_argument,		NULL,           's'		},
	{ "unix-socket",    required_argument,  NULL,           'u'		},
    { "working-dir",    required_argument,  NULL,           'w'     },
    { "env",            required_argument,  NULL,           'E'     },
	{ NULL,				0,					NULL,            0		}
};

static void
usage()
{
    puts (
"NAME\n"
"    darwin-debug -- posix spawn a process that is stopped at the entry point\n"
"                    for debugging.\n"
"\n"
"SYNOPSIS\n"
"    darwin-debug --unix-socket=<SOCKET> [--arch=<ARCH>] [--working-dir=<PATH>] [--disable-aslr] [--no-env] [--setsid] [--help] -- <PROGRAM> [<PROGRAM-ARG> <PROGRAM-ARG> ....]\n"
"\n"
"DESCRIPTION\n"
"    darwin-debug will exec itself into a child process <PROGRAM> that is\n"
"    halted for debugging. It does this by using posix_spawn() along with\n"
"    darwin specific posix_spawn flags that allows exec only (no fork), and\n"
"    stop at the program entry point. Any program arguments <PROGRAM-ARG> are\n"
"    passed on to the exec as the arguments for the new process. The current\n"
"    environment will be passed to the new process unless the \"--no-env\"\n"
"    option is used. A unix socket must be supplied using the\n"
"    --unix-socket=<SOCKET> option so the calling program can handshake with\n"
"    this process and get its process id.\n"
"\n"
"EXAMPLE\n"
"   darwin-debug --arch=i386 -- /bin/ls -al /tmp\n"
);
    exit (1);
}

static void
exit_with_errno (int err, const char *prefix)
{
    if (err)
    {
        fprintf (stderr, 
                 "%s%s", 
                 prefix ? prefix : "", 
                 strerror(err));
        exit (err);
    }
}

pid_t
posix_spawn_for_debug 
(
    char *const *argv, 
    char *const *envp, 
    const char *working_dir,
    cpu_type_t cpu_type, 
    int disable_aslr)
{
    pid_t pid = 0;

    const char *path = argv[0];

    posix_spawnattr_t attr;

    exit_with_errno (::posix_spawnattr_init (&attr), "::posix_spawnattr_init (&attr) error: ");

    // Here we are using a darwin specific feature that allows us to exec only
    // since we want this program to turn into the program we want to debug, 
    // and also have the new program start suspended (right at __dyld_start)
    // so we can debug it
    short flags = POSIX_SPAWN_START_SUSPENDED | POSIX_SPAWN_SETEXEC | POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK;

    // Disable ASLR if we were asked to
    if (disable_aslr)
        flags |= _POSIX_SPAWN_DISABLE_ASLR;
    
    sigset_t no_signals;
    sigset_t all_signals;
    sigemptyset (&no_signals);
    sigfillset (&all_signals);
    ::posix_spawnattr_setsigmask(&attr, &no_signals);
    ::posix_spawnattr_setsigdefault(&attr, &all_signals);
    
    // Set the flags we just made into our posix spawn attributes
    exit_with_errno (::posix_spawnattr_setflags (&attr, flags), "::posix_spawnattr_setflags (&attr, flags) error: ");
    
    
    // Another darwin specific thing here where we can select the architecture
    // of the binary we want to re-exec as.
    if (cpu_type != 0)
    {
        size_t ocount = 0;
        exit_with_errno (::posix_spawnattr_setbinpref_np (&attr, 1, &cpu_type, &ocount), "posix_spawnattr_setbinpref_np () error: ");
    }
    
    // I wish there was a posix_spawn flag to change the working directory of
    // the inferior process we will spawn, but there currently isn't. If there
    // ever is a better way to do this, we should use it. I would rather not
    // manually fork, chdir in the child process, and then posix_spawn with exec
    // as the whole reason for doing posix_spawn is to not hose anything up
    // after the fork and prior to the exec...
    if (working_dir)
        ::chdir (working_dir);

    exit_with_errno (::posix_spawnp (&pid, path, NULL, &attr, (char * const*)argv, (char * const*)envp), "posix_spawn() error: ");
    
    // This code will only be reached if the posix_spawn exec failed...
    ::posix_spawnattr_destroy (&attr);

    return pid;
}


int main (int argc, char *const *argv, char *const *envp, const char **apple)
{
#if defined (DEBUG_LLDB_LAUNCHER)
    const char *program_name = strrchr(apple[0], '/');
    
    if (program_name)
        program_name++; // Skip the last slash..
    else
        program_name = apple[0];
    
    printf("%s called with:\n", program_name);
    for (int i=0; i<argc; ++i)
        printf("argv[%u] = '%s'\n", i, argv[i]);
#endif

    cpu_type_t cpu_type = 0;
    bool show_usage = false;
    int ch;
    int disable_aslr = 0; // By default we disable ASLR
    bool pass_env = true;
    std::string unix_socket_name;
    std::string working_dir;
    
#if __GLIBC__
    optind = 0;
#else
    optreset = 1;
    optind = 1;
#endif

	while ((ch = getopt_long_only(argc, argv, "a:deE:hsu:?", g_long_options, NULL)) != -1)
	{
		switch (ch) 
		{
        case 0:
            break;

		case 'a':	// "-a i386" or "--arch=i386"
			if (optarg)
			{
				if (streq (optarg, "i386"))
                    cpu_type = CPU_TYPE_I386;
				else if (streq (optarg, "x86_64"))
                    cpu_type = CPU_TYPE_X86_64;
                else if (streq (optarg, "x86_64h"))
                    cpu_type = 0; // Don't set CPU type when we have x86_64h
                else if (strstr (optarg, "arm") == optarg)
                    cpu_type = CPU_TYPE_ARM;
                else
                {
                    ::fprintf (stderr, "error: unsupported cpu type '%s'\n", optarg);
                    ::exit (1);
                }
			} 
			break;

        case 'd':
            disable_aslr = 1;
            break;            

        case 'e':
            pass_env = false;
            break;
            
        case 'E':
            {
                // Since we will exec this program into our new program, we can just set environment
                // variables in this process and they will make it into the child process.
                std::string name;
                std::string value;
                const char *equal_pos = strchr (optarg, '=');
                if (equal_pos)
                {
                    name.assign (optarg, equal_pos - optarg);
                    value.assign (equal_pos + 1);
                }
                else
                {
                    name = optarg;
                }
                ::setenv (name.c_str(), value.c_str(), 1);
            }
            break;
            
        case 's':
            // Create a new session to avoid having control-C presses kill our current
            // terminal session when this program is launched from a .command file
            ::setsid();
            break;

        case 'u':
            unix_socket_name.assign (optarg);
            break;

        case 'w':
            {
                struct stat working_dir_stat;
                if (stat (optarg, &working_dir_stat) == 0)
                    working_dir.assign (optarg);
                else
                    ::fprintf(stderr, "warning: working directory doesn't exist: '%s'\n", optarg);
            }
            break;

		case 'h':
		case '?':
		default:
			show_usage = true;
			break;
		}
	}
	argc -= optind;
	argv += optind;

    if (show_usage || argc <= 0 || unix_socket_name.empty())
        usage();

#if defined (DEBUG_LLDB_LAUNCHER)
    printf ("\n%s post options:\n", program_name);
    for (int i=0; i<argc; ++i)
        printf ("argv[%u] = '%s'\n", i, argv[i]);
#endif

    // Open the socket that was passed in as an option
    struct sockaddr_un saddr_un;
    int s = ::socket (AF_UNIX, SOCK_STREAM, 0);
    if (s < 0)
    {
        perror("error: socket (AF_UNIX, SOCK_STREAM, 0)");
        exit(1);
    }

    saddr_un.sun_family = AF_UNIX;
    ::strncpy(saddr_un.sun_path, unix_socket_name.c_str(), sizeof(saddr_un.sun_path) - 1);
    saddr_un.sun_path[sizeof(saddr_un.sun_path) - 1] = '\0';
    saddr_un.sun_len = SUN_LEN (&saddr_un);

    if (::connect (s, (struct sockaddr *)&saddr_un, SUN_LEN (&saddr_un)) < 0) 
    {
        perror("error: connect (socket, &saddr_un, saddr_un_len)");
        exit(1);
    }
    
    // We were able to connect to the socket, now write our PID so whomever
    // launched us will know this process's ID
    char pid_str[64];
    const int pid_str_len = ::snprintf (pid_str, sizeof(pid_str), "%i", ::getpid());
    const int bytes_sent = ::send (s, pid_str, pid_str_len, 0);
    
    if (pid_str_len != bytes_sent)
    {
        perror("error: send (s, pid_str, pid_str_len, 0)");
        exit (1);
    }

    // We are done with the socket
    close (s);

    system("clear");
    printf ("Launching: '%s'\n", argv[0]);
    if (working_dir.empty())
    {
        char cwd[PATH_MAX];
        const char *cwd_ptr = getcwd(cwd, sizeof(cwd));
        printf ("Working directory: '%s'\n", cwd_ptr);
    }
    else
    {
        printf ("Working directory: '%s'\n", working_dir.c_str());
    }
    printf ("%i arguments:\n", argc);

    for (int i=0; i<argc; ++i)
        printf ("argv[%u] = '%s'\n", i, argv[i]);

    // Now we posix spawn to exec this process into the inferior that we want
    // to debug.
    posix_spawn_for_debug (argv,
                           pass_env ? *_NSGetEnviron() : NULL, // Pass current environment as we may have modified it if "--env" options was used, do NOT pass "envp" here
                           working_dir.empty() ? NULL : working_dir.c_str(),
                           cpu_type, 
                           disable_aslr);
    
	return 0;
}

#endif // #if defined (__APPLE__)

