blob: 322fcc0669347972b5904d3cee5cbf8abb3f5ebe [file] [log] [blame]
Steve Kondik95027ea2017-06-14 17:22:58 -07001//
2// vncflinger - Copyright (C) 2017 Steve Kondik
3//
4// This program is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program. If not, see <http://www.gnu.org/licenses/>.
16//
Steve Kondik5c8655c2017-06-19 00:28:47 -070017#include <getopt.h>
Steve Kondik95027ea2017-06-14 17:22:58 -070018
Steve Kondik46798992017-06-15 23:58:54 -070019#include <csignal>
Steve Kondik5c8655c2017-06-19 00:28:47 -070020#include <iostream>
Steve Kondik46798992017-06-15 23:58:54 -070021
Steve Kondik3db07472017-06-19 22:13:45 -070022#include <binder/IServiceManager.h>
23
Steve Kondik55db0532017-06-12 11:27:18 -070024#include "VNCFlinger.h"
Steve Kondik3db07472017-06-19 22:13:45 -070025#include "VNCService.h"
Steve Kondik55db0532017-06-12 11:27:18 -070026
27using namespace android;
28
Steve Kondik5c8655c2017-06-19 00:28:47 -070029static sp<VNCFlinger> gVNC;
30
Steve Kondik59104ea2017-06-20 08:30:07 -070031static const char* const shortOpts = "4:6:p:s:l:vh";
Steve Kondik5c8655c2017-06-19 00:28:47 -070032static const option longOpts[] = {
33 {"listen", 1, nullptr, '4'},
34 {"listen6", 1, nullptr, '6'},
35 {"port", 1, nullptr, 'p'},
36 {"password", 1, nullptr, 's'},
Steve Kondik59104ea2017-06-20 08:30:07 -070037 {"scale", 1, nullptr, 'l'},
Steve Kondik5c8655c2017-06-19 00:28:47 -070038 {"version", 0, nullptr, 'v'},
39 {"help", 0, nullptr, 'h'},
40};
Steve Kondik46798992017-06-15 23:58:54 -070041
Steve Kondik59104ea2017-06-20 08:30:07 -070042static void onSignal(int signal) {
43 ALOGV("Shutting down on signal %d", signal);
Steve Kondik5c8655c2017-06-19 00:28:47 -070044 gVNC->stop();
45}
46
47static void printVersion() {
48 std::cout << "VNCFlinger-" << VNCFLINGER_VERSION << std::endl;
49 exit(0);
50}
51
52static void printHelp() {
53 std::cout << "Usage: vncflinger [OPTIONS]\n\n"
54 << " -4 <addr> IPv4 address to listen (default: localhost)\n"
55 << " -6 <addr> IPv6 address to listen (default: localhost)\n"
56 << " -p <num> Port to listen on (default: 5900)\n"
57 << " -s <pass> Store server password\n"
58 << " -c Clear server password\n"
Steve Kondik59104ea2017-06-20 08:30:07 -070059 << " -l <scale> Scaling value (default: 1.0)\n"
Steve Kondik5c8655c2017-06-19 00:28:47 -070060 << " -v Show server version\n"
61 << " -h Show help\n\n";
62 exit(1);
63}
64
65static void parseArgs(int argc, char** argv) {
66 String8 arg;
67
68 while (true) {
69 const auto opt = getopt_long(argc, argv, shortOpts, longOpts, nullptr);
70
71 if (opt < 0) {
72 break;
73 }
74
75 switch (opt) {
76 case 's':
77 arg = optarg;
78 if (gVNC->setPassword(arg) != OK) {
79 std::cerr << "Failed to set password\n";
80 exit(1);
81 }
82 exit(0);
83
84 case 'c':
85 if (gVNC->clearPassword() != OK) {
86 std::cerr << "Failed to clear password\n";
87 exit(1);
88 }
89 exit(0);
90
91 case '4':
92 arg = optarg;
Steve Kondik3db07472017-06-19 22:13:45 -070093 if (gVNC->setV4Address(arg) != OK) {
Steve Kondik5c8655c2017-06-19 00:28:47 -070094 std::cerr << "Failed to set IPv4 address\n";
95 exit(1);
96 }
97 break;
98
99 case '6':
100 arg = optarg;
Steve Kondik3db07472017-06-19 22:13:45 -0700101 if (gVNC->setV6Address(arg) != OK) {
Steve Kondik5c8655c2017-06-19 00:28:47 -0700102 std::cerr << "Failed to set IPv6 address\n";
103 exit(1);
104 }
105 break;
106
107 case 'p':
Steve Kondik5c8655c2017-06-19 00:28:47 -0700108 if (gVNC->setPort(std::stoi(optarg)) != OK) {
109 std::cerr << "Failed to set port\n";
110 exit(1);
111 }
112 break;
113
Steve Kondik59104ea2017-06-20 08:30:07 -0700114 case 'l':
115 if (gVNC->setScale(std::stof(optarg)) != OK) {
116 std::cerr << "Invalid scaling value (must be between 0.0 and 2.0)\n";
117 exit(1);
118 }
119 break;
120
Steve Kondik5c8655c2017-06-19 00:28:47 -0700121 case 'v':
122 printVersion();
123 break;
124
125 case 'h':
126 case '?':
127 default:
128 printHelp();
129 break;
130 }
131 }
Steve Kondik46798992017-06-15 23:58:54 -0700132}
133
Steve Kondik2c9d0cf2017-06-15 23:39:29 -0700134int main(int argc, char** argv) {
Steve Kondik46798992017-06-15 23:58:54 -0700135 std::signal(SIGINT, onSignal);
136 std::signal(SIGHUP, onSignal);
137
Steve Kondik5c8655c2017-06-19 00:28:47 -0700138 gVNC = new VNCFlinger();
139
140 parseArgs(argc, argv);
141
Steve Kondik3db07472017-06-19 22:13:45 -0700142 // binder interface
143 defaultServiceManager()->addService(String16("vnc"), new VNCService(gVNC));
144
Steve Kondik5c8655c2017-06-19 00:28:47 -0700145 gVNC->start();
Steve Kondik59104ea2017-06-20 08:30:07 -0700146 gVNC.clear();
Steve Kondik55db0532017-06-12 11:27:18 -0700147}