1 /**
2  * Open an online manual page.
3  *
4  * Copyright: Copyright (C) 1999-2020 by The D Language Foundation, All Rights Reserved
5  * Authors:   Walter Bright, http://www.digitalmars.com
6  * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
7  * Source:    $(LINK2 https://github.com/dlang/dmd/blob/master/src/dmd/root/man.d, root/_man.d)
8  * Documentation:  https://dlang.org/phobos/dmd_root_man.html
9  * Coverage:    https://codecov.io/gh/dlang/dmd/src/master/src/dmd/root/man.d
10  */
11 
12 module dmd.root.man;
13 
14 import core.stdc.stdio;
15 import core.stdc.stdlib;
16 import core.stdc.string;
17 import core.sys.posix.unistd;
18 import core.sys.windows.shellapi;
19 import core.sys.windows.winuser;
20 
21 version (Windows)
22 {
23     extern (C++) void browse(const(char)* url) nothrow @nogc
24     in
25     {
26         assert(strncmp(url, "http://", 7) == 0 || strncmp(url, "https://", 8) == 0);
27     }
28     do
29     {
30         ShellExecuteA(null, "open", url, null, null, SW_SHOWNORMAL);
31     }
32 }
33 else version (OSX)
34 {
35     extern (C++) void browse(const(char)* url) nothrow @nogc
36     in
37     {
38         assert(strncmp(url, "http://", 7) == 0 || strncmp(url, "https://", 8) == 0);
39     }
40     do
41     {
42         pid_t childpid;
43         const(char)*[5] args;
44         char* browser = getenv("BROWSER");
45         if (browser)
46         {
47             browser = strdup(browser);
48             args[0] = browser;
49             args[1] = url;
50             args[2] = null;
51         }
52         else
53         {
54             args[0] = "open";
55             args[1] = url;
56             args[2] = null;
57         }
58         childpid = fork();
59         if (childpid == 0)
60         {
61             execvp(args[0], cast(char**)args);
62             perror(args[0]); // failed to execute
63             return;
64         }
65     }
66 }
67 else version (Posix)
68 {
69     extern (C++) void browse(const(char)* url) nothrow @nogc
70     in
71     {
72         assert(strncmp(url, "http://", 7) == 0 || strncmp(url, "https://", 8) == 0);
73     }
74     do
75     {
76         pid_t childpid;
77         const(char)*[3] args;
78         const(char)* browser = getenv("BROWSER");
79         if (browser)
80             browser = strdup(browser);
81         else
82             browser = "xdg-open";
83         args[0] = browser;
84         args[1] = url;
85         args[2] = null;
86         childpid = fork();
87         if (childpid == 0)
88         {
89             execvp(args[0], cast(char**)args);
90             perror(args[0]); // failed to execute
91             return;
92         }
93     }
94 }