Give android its own main, like ios, so we can deadstrip some things.

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4530 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
Cory McWilliams 2023-10-17 22:43:13 +00:00
parent 0bb45a7fa8
commit 1b2b0970fb

View File

@ -66,7 +66,7 @@ const char* k_db_path_default = "db.sqlite";
break; \ break; \
} while (false) } while (false)
#if !TARGET_OS_IPHONE #if !TARGET_OS_IPHONE && !defined(__ANDROID__)
static int _tf_command_test(const char* file, int argc, char* argv[]); static int _tf_command_test(const char* file, int argc, char* argv[]);
static int _tf_command_import(const char* file, int argc, char* argv[]); static int _tf_command_import(const char* file, int argc, char* argv[]);
static int _tf_command_export(const char* file, int argc, char* argv[]); static int _tf_command_export(const char* file, int argc, char* argv[]);
@ -90,54 +90,6 @@ const command_t k_commands[] = {
{ "check", _tf_command_check, "Validate messages in the SSB database." }, { "check", _tf_command_check, "Validate messages in the SSB database." },
}; };
void shedPrivileges()
{
#if !defined(_WIN32)
struct rlimit zeroLimit;
zeroLimit.rlim_cur = 0;
zeroLimit.rlim_max = 0;
// RLIMIT_AS
// RLIMIT_CORE
// RLIMIT_CPU
// RLIMIT_DATA
// RLIMIT_FSIZE
// RLIMIT_RSS
// RLIMIT_RTPRIO
// RLIMIT_RTTIME
// RLIMIT_SIGPENDING
// RLIMIT_STACK
if (setrlimit(RLIMIT_FSIZE, &zeroLimit) != 0)
{
perror("setrlimit(RLIMIT_FSIZE, {0, 0})");
exit(-1);
}
if (setrlimit(RLIMIT_NOFILE, &zeroLimit) != 0)
{
perror("setrlimit(RLIMIT_NOFILE, {0, 0})");
exit(-1);
}
if (setrlimit(RLIMIT_NPROC, &zeroLimit) != 0)
{
perror("setrlimit(RLIMIT_NPROC, {0, 0})");
exit(-1);
}
#if !defined(__MACH__)
if (setrlimit(RLIMIT_LOCKS, &zeroLimit) != 0)
{
perror("setrlimit(RLIMIT_LOCKS, {0, 0})");
exit(-1);
}
if (setrlimit(RLIMIT_MSGQUEUE, &zeroLimit) != 0)
{
perror("setrlimit(RLIMIT_MSGQUEUE, {0, 0})");
exit(-1);
}
#endif
#endif
}
static int _tf_command_test(const char* file, int argc, char* argv[]) static int _tf_command_test(const char* file, int argc, char* argv[])
{ {
#if !defined(__ANDROID__) #if !defined(__ANDROID__)
@ -377,6 +329,54 @@ static void _tf_run_task_thread(void* data)
} }
#if !TARGET_OS_IPHONE #if !TARGET_OS_IPHONE
static void _shed_privileges()
{
#if !defined(_WIN32)
struct rlimit zeroLimit;
zeroLimit.rlim_cur = 0;
zeroLimit.rlim_max = 0;
// RLIMIT_AS
// RLIMIT_CORE
// RLIMIT_CPU
// RLIMIT_DATA
// RLIMIT_FSIZE
// RLIMIT_RSS
// RLIMIT_RTPRIO
// RLIMIT_RTTIME
// RLIMIT_SIGPENDING
// RLIMIT_STACK
if (setrlimit(RLIMIT_FSIZE, &zeroLimit) != 0)
{
perror("setrlimit(RLIMIT_FSIZE, {0, 0})");
exit(-1);
}
if (setrlimit(RLIMIT_NOFILE, &zeroLimit) != 0)
{
perror("setrlimit(RLIMIT_NOFILE, {0, 0})");
exit(-1);
}
if (setrlimit(RLIMIT_NPROC, &zeroLimit) != 0)
{
perror("setrlimit(RLIMIT_NPROC, {0, 0})");
exit(-1);
}
#if !defined(__MACH__)
if (setrlimit(RLIMIT_LOCKS, &zeroLimit) != 0)
{
perror("setrlimit(RLIMIT_LOCKS, {0, 0})");
exit(-1);
}
if (setrlimit(RLIMIT_MSGQUEUE, &zeroLimit) != 0)
{
perror("setrlimit(RLIMIT_MSGQUEUE, {0, 0})");
exit(-1);
}
#endif
#endif
}
static int _tf_command_run(const char* file, int argc, char* argv[]) static int _tf_command_run(const char* file, int argc, char* argv[])
{ {
xoptOption options[] = { xoptOption options[] = {
@ -489,7 +489,7 @@ static int _tf_command_sandbox(const char* file, int argc, char* argv[])
#endif #endif
tf_task_t* task = tf_task_create(); tf_task_t* task = tf_task_create();
tf_task_configure_from_fd(task, STDIN_FILENO); tf_task_configure_from_fd(task, STDIN_FILENO);
shedPrivileges(); _shed_privileges();
/* The caller will trigger tf_task_activate with a message. */ /* The caller will trigger tf_task_activate with a message. */
tf_task_run(task); tf_task_run(task);
tf_task_destroy(task); tf_task_destroy(task);
@ -507,6 +507,7 @@ xopt_help:
return 1; return 1;
} }
#if !defined(__ANDROID__)
static int _tf_command_check(const char* file, int argc, char* argv[]) static int _tf_command_check(const char* file, int argc, char* argv[])
{ {
typedef struct args_t { typedef struct args_t {
@ -569,6 +570,7 @@ static int _tf_command_usage(const char* file, int argc, char* argv[])
return 0; return 0;
} }
#endif #endif
#endif
static void _backtrace_error(void* data, const char* message, int errnum) static void _backtrace_error(void* data, const char* message, int errnum)
{ {
@ -638,36 +640,26 @@ static void _startup(int argc, char* argv[])
} }
} }
#if !TARGET_OS_IPHONE #if defined(__ANDROID__)
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
_startup(argc, argv); _startup(argc, argv);
int result = -1;
int result = 0; if (argc > 1)
if (argc >= 2)
{ {
for (int i = 0; i < (int)_countof(k_commands); i++) if (strcmp(argv[1], "run") == 0)
{ {
const command_t* command = &k_commands[i]; result = _tf_command_run(argv[0], argc - 2, argv + 2);
if (strcmp(argv[1], command->name) == 0) }
else if (strcmp(argv[1], "sandbox") == 0)
{ {
result = command->callback(argv[0], argc - 2, argv + 2); result = _tf_command_sandbox(argv[0], argc - 2, argv + 2);
goto done;
} }
} }
result = _tf_command_usage(argv[0], argc, argv);
}
else
{
result = _tf_command_run(argv[0], argc - 1, argv + 1);
}
done:
tf_mem_shutdown(); tf_mem_shutdown();
return result; return result;
} }
#endif #elif TARGET_OS_IPHONE && !defined(__ANDROID__)
#if TARGET_OS_IPHONE
void tf_run_thread_start(const char* zip_path) void tf_run_thread_start(const char* zip_path)
{ {
_startup(0, NULL); _startup(0, NULL);
@ -699,4 +691,31 @@ void tf_run_thread_start(const char* zip_path)
tf_free(threads); tf_free(threads);
#endif #endif
} }
#else
int main(int argc, char* argv[])
{
_startup(argc, argv);
int result = 0;
if (argc >= 2)
{
for (int i = 0; i < (int)_countof(k_commands); i++)
{
const command_t* command = &k_commands[i];
if (strcmp(argv[1], command->name) == 0)
{
result = command->callback(argv[0], argc - 2, argv + 2);
goto done;
}
}
result = _tf_command_usage(argv[0], argc, argv);
}
else
{
result = _tf_command_run(argv[0], argc - 1, argv + 1);
}
done:
tf_mem_shutdown();
return result;
}
#endif #endif