@@ -72,74 +72,116 @@ int copy_file(const char *src, const char *dst) {
7272int main (int argc , char * argv []) {
7373 if (argc < 8 ) {
7474 fprintf (stderr ,
75- "USAGE: %s <port> <token> <jar_name > <AppID > <user_id > <bgrun(1|0) > <debug(1|0)> [extra_args...]\n" ,
75+ "USAGE: %s <port> <token> <am_jar_name > <main_jar_name > <app_id > <user_id > <debug(1|0)> [extra_args...]\n" ,
7676 argv [0 ]);
7777 return 1 ;
7878 }
7979
8080 const char * port = argv [1 ];
8181 const char * token = argv [2 ];
82- const char * jar_name = argv [3 ];
83- const char * app_id = argv [4 ];
84- const char * user_id = argv [5 ];
85- const char * bgrun = argv [6 ];
82+ const char * am_jar_name = argv [3 ];
83+ const char * main_jar_name = argv [4 ];
84+ const char * app_id = argv [5 ];
85+ const char * user_id = argv [6 ];
8686 const char * debug = argv [7 ];
87+ const char * bgrun = "1" ;
8788
8889 // Validate Paths
89- if (!is_safe_string (jar_name ) || !is_safe_string (app_id ) || !is_safe_string (user_id )) {
90+ if (!is_safe_string (am_jar_name ) || !is_safe_string (main_jar_name ) || !is_safe_string (app_id ) ||
91+ !is_safe_string (user_id )) {
9092 fprintf (stderr , "Error! Invalid characters in arguments.\n" );
9193 return 1 ;
9294 }
9395
9496 // Validate debug and bgrun
95- if ((strcmp (bgrun , "0" ) != 0 && strcmp (bgrun , "1" ) != 0 ) ||
96- (strcmp (debug , "0" ) != 0 && strcmp (debug , "1" ) != 0 )) {
97- fprintf (stderr , "Error! bgrun and debug must be either 0 or 1.\n" );
97+ if ((strcmp (debug , "0" ) != 0 && strcmp (debug , "1" ) != 0 )) {
98+ fprintf (stderr , "Error! debug must be either 0 or 1.\n" );
9899 return 1 ;
99100 }
100101
101102 // /data/local/tmp/am.jar
102103 char exec_jar_path [512 ];
103- if (snprintf (exec_jar_path , sizeof (exec_jar_path ), "%s/%s" , TMP_PATH , jar_name ) >=
104+ if (snprintf (exec_jar_path , sizeof (exec_jar_path ), "%s/%s" , TMP_PATH , am_jar_name ) >=
104105 sizeof (exec_jar_path )) {
105106 fprintf (stderr , "Error! Buffer overflow on exec_jar_path.\n" );
106107 return 1 ;
107108 }
108109
110+ // /data/local/tmp/main.jar
111+ char main_jar_path [512 ];
112+ if (snprintf (main_jar_path , sizeof (main_jar_path ), "%s/%s" , TMP_PATH , main_jar_name ) >=
113+ sizeof (main_jar_path )) {
114+ fprintf (stderr , "Error! Buffer overflow on main_jar_path.\n" );
115+ return 1 ;
116+ }
117+
109118 // Prioritized list of fallback source paths
110- char fallbacks [4 ][512 ];
111- snprintf (fallbacks [0 ], sizeof (fallbacks [0 ]), "/sdcard/Android/data/%s/cache/%s" , app_id ,
112- jar_name );
113- snprintf (fallbacks [1 ], sizeof (fallbacks [1 ]), "/storage/emulated/%s/Android/data/%s/cache/%s" ,
114- user_id , app_id , jar_name );
115- snprintf (fallbacks [2 ], sizeof (fallbacks [2 ]), "/sdcard/AppManager/%s" , jar_name );
116- snprintf (fallbacks [3 ], sizeof (fallbacks [3 ]), "/storage/emulated/%s/AppManager/%s" , user_id ,
117- jar_name );
119+ char am_jar_fallbacks [4 ][512 ];
120+ snprintf (am_jar_fallbacks [0 ], sizeof (am_jar_fallbacks [0 ]), "/sdcard/Android/data/%s/cache/%s" ,
121+ app_id ,
122+ am_jar_name );
123+ snprintf (am_jar_fallbacks [1 ], sizeof (am_jar_fallbacks [1 ]),
124+ "/storage/emulated/%s/Android/data/%s/cache/%s" ,
125+ user_id , app_id , am_jar_name );
126+ snprintf (am_jar_fallbacks [2 ], sizeof (am_jar_fallbacks [2 ]), "/sdcard/AppManager/%s" ,
127+ am_jar_name );
128+ snprintf (am_jar_fallbacks [3 ], sizeof (am_jar_fallbacks [3 ]), "/storage/emulated/%s/AppManager/%s" ,
129+ user_id ,
130+ am_jar_name );
131+
132+ char main_jar_fallbacks [4 ][512 ];
133+ snprintf (main_jar_fallbacks [0 ], sizeof (main_jar_fallbacks [0 ]), "/sdcard/Android/data/%s/cache/%s" ,
134+ app_id ,
135+ main_jar_name );
136+ snprintf (main_jar_fallbacks [1 ], sizeof (main_jar_fallbacks [1 ]),
137+ "/storage/emulated/%s/Android/data/%s/cache/%s" ,
138+ user_id , app_id , main_jar_name );
139+ snprintf (main_jar_fallbacks [2 ], sizeof (main_jar_fallbacks [2 ]), "/sdcard/AppManager/%s" ,
140+ main_jar_name );
141+ snprintf (main_jar_fallbacks [3 ], sizeof (main_jar_fallbacks [3 ]), "/storage/emulated/%s/AppManager/%s" ,
142+ user_id ,
143+ main_jar_name );
118144
119145 uid_t uid = getuid ();
120146 gid_t gid = getgid ();
121147 printf ("Starting %s as %d:%d...\n" , SERVER_NAME , uid , gid );
122148
123149 // Copy am.jar as /data/local/tmp/am.jar
124- const char * resolved_jar_path = NULL ;
150+ const char * resolved_am_jar_path = NULL ;
125151 for (int i = 0 ; i < 4 ; i ++ ) {
126- if (copy_file (fallbacks [i ], exec_jar_path ) == 0 ) {
127- resolved_jar_path = fallbacks [i ];
152+ if (copy_file (am_jar_fallbacks [i ], exec_jar_path ) == 0 ) {
153+ resolved_am_jar_path = am_jar_fallbacks [i ];
128154 break ;
129155 }
130156 }
131-
132- if (resolved_jar_path == NULL ) {
133- fprintf (stderr , "Error! %s could not be found or copied.\n" , jar_name );
157+ if (resolved_am_jar_path == NULL ) {
158+ fprintf (stderr , "Error! %s could not be found or copied.\n" , am_jar_name );
134159 return 1 ;
135160 }
136-
137161 // Fix ownership
138162 if (chown (exec_jar_path , uid , gid ) != 0 ) {
139163 fprintf (stderr , "Warning: chown failed: %s\n" , strerror (errno ));
140164 // Although it failed, still proceed
141165 }
142166
167+ // Copy main.jar as /data/local/tmp/main.jar
168+ const char * resolved_main_jar_path = NULL ;
169+ for (int i = 0 ; i < 4 ; i ++ ) {
170+ if (copy_file (main_jar_fallbacks [i ], main_jar_path ) == 0 ) {
171+ resolved_main_jar_path = main_jar_fallbacks [i ];
172+ break ;
173+ }
174+ }
175+ if (resolved_main_jar_path == NULL ) {
176+ fprintf (stderr , "Error! %s could not be found or copied.\n" , main_jar_name );
177+ return 1 ;
178+ }
179+ // Fix ownership
180+ if (chown (main_jar_path , uid , gid ) != 0 ) {
181+ fprintf (stderr , "Warning: chown failed: %s\n" , strerror (errno ));
182+ // Although it failed, still proceed
183+ }
184+
143185 // Build argument for am.jar
144186 char args_buf [2048 ];
145187 if (snprintf (args_buf , sizeof (args_buf ), "path:%s,token:%s,app:%s,bgrun:%s,debug:%s" ,
@@ -149,7 +191,7 @@ int main(int argc, char *argv[]) {
149191 return 1 ;
150192 }
151193
152- printf ("Resolved Jar path: %s\n" , resolved_jar_path );
194+ printf ("Resolved Jar path: %s\n" , resolved_am_jar_path );
153195 printf ("Args: %s\n" , args_buf );
154196
155197 // Execute app_process
@@ -217,6 +259,7 @@ int main(int argc, char *argv[]) {
217259
218260 // Cleanup
219261 unlink (exec_jar_path );
262+ unlink (main_jar_path );
220263 free (exec_argv );
221264 exit (1 );
222265}
0 commit comments