You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							164 lines
						
					
					
						
							3.6 KiB
						
					
					
				
			
		
		
	
	
							164 lines
						
					
					
						
							3.6 KiB
						
					
					
				#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <stdbool.h>
 | 
						|
#include <math.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <assert.h>
 | 
						|
#include <pthread.h>
 | 
						|
 | 
						|
#include <sys/wait.h>
 | 
						|
#include <sys/stat.h>
 | 
						|
 | 
						|
#include <GLES3/gl3.h>
 | 
						|
#include <EGL/egl.h>
 | 
						|
#include <EGL/eglext.h>
 | 
						|
 | 
						|
#include "common/util.h"
 | 
						|
#include "common/mat.h"
 | 
						|
#include "common/glutil.h"
 | 
						|
#include "common/framebuffer.h"
 | 
						|
#include "common/spinner.h"
 | 
						|
 | 
						|
#ifndef BRAND
 | 
						|
#define BRAND openpilot
 | 
						|
#endif
 | 
						|
 | 
						|
#define STR(X) #X
 | 
						|
#define STR2(X) STR(X)
 | 
						|
#define PASTE(A, B) A ## B
 | 
						|
#define PASTE2(A, B) PASTE(A, B)
 | 
						|
#define BRAND_S STR2(BRAND)
 | 
						|
#define BRANCH_S STR2(BRANCH)
 | 
						|
 | 
						|
#define PRE_CHECKOUT_FOLDER "/system/comma/openpilot"
 | 
						|
#define GIT_CLONE_COMMAND "git clone https://github.com/commaai/openpilot.git "
 | 
						|
 | 
						|
 | 
						|
extern const uint8_t str_continue[] asm("_binary_continue_" BRAND_S "_sh_start");
 | 
						|
extern const uint8_t str_continue_end[] asm("_binary_continue_" BRAND_S "_sh_end");
 | 
						|
 | 
						|
static bool time_valid() {
 | 
						|
  time_t rawtime;
 | 
						|
  time(&rawtime);
 | 
						|
 | 
						|
  struct tm * sys_time = gmtime(&rawtime);
 | 
						|
  return (1900 + sys_time->tm_year) >= 2019;
 | 
						|
}
 | 
						|
 | 
						|
static int use_pre_checkout() {
 | 
						|
  int err;
 | 
						|
 | 
						|
  // Cleanup
 | 
						|
  err = system("rm -rf /tmp/openpilot");
 | 
						|
  if(err) return 1;
 | 
						|
  err = system("rm -rf /data/openpilot");
 | 
						|
  if(err) return 1;
 | 
						|
 | 
						|
  // Copy pre checkout into tmp so we can work on it
 | 
						|
  err = system("cp -rp " PRE_CHECKOUT_FOLDER " /tmp");
 | 
						|
  if(err) return 1;
 | 
						|
 | 
						|
  err = chdir("/tmp/openpilot");
 | 
						|
  if(err) return 1;
 | 
						|
 | 
						|
  // Checkout correct branch
 | 
						|
  err = system("git remote set-branches --add origin " BRANCH_S);
 | 
						|
  if(err) return 1;
 | 
						|
  err = system("git fetch origin " BRANCH_S);
 | 
						|
  if(err) return 1;
 | 
						|
  err = system("git checkout " BRANCH_S);
 | 
						|
  if(err) return 1;
 | 
						|
  err = system("git reset --hard origin/" BRANCH_S);
 | 
						|
  if(err) return 1;
 | 
						|
 | 
						|
  // Move to final location
 | 
						|
  err = system("mv /tmp/openpilot /data");
 | 
						|
  if(err) return 1;
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
static int fresh_clone() {
 | 
						|
  int err;
 | 
						|
 | 
						|
  // Cleanup
 | 
						|
  err = chdir("/tmp");
 | 
						|
  if(err) return 1;
 | 
						|
  err = system("rm -rf /tmp/openpilot");
 | 
						|
  if(err) return 1;
 | 
						|
 | 
						|
  err = system(GIT_CLONE_COMMAND " -b " BRANCH_S " --depth=1 openpilot");
 | 
						|
  if(err) return 1;
 | 
						|
 | 
						|
  // Cleanup old folder in /data
 | 
						|
  err = system("rm -rf /data/openpilot");
 | 
						|
  if(err) return 1;
 | 
						|
 | 
						|
  // this won't move if /data/openpilot exists
 | 
						|
  err = system("mv /tmp/openpilot /data");
 | 
						|
  if(err) return 1;
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
static int do_install() {
 | 
						|
  int err;
 | 
						|
 | 
						|
 | 
						|
  // Wait for valid time
 | 
						|
  while (!time_valid()){
 | 
						|
    usleep(500 * 1000);
 | 
						|
    printf("Waiting for valid time\n");
 | 
						|
  }
 | 
						|
 | 
						|
  struct stat sb;
 | 
						|
  if (stat(PRE_CHECKOUT_FOLDER, &sb) == 0 && S_ISDIR(sb.st_mode)) {
 | 
						|
    printf("Pre-checkout found\n");
 | 
						|
    err = use_pre_checkout();
 | 
						|
  } else {
 | 
						|
    printf("Doing fresh clone\n");
 | 
						|
    err = fresh_clone();
 | 
						|
  }
 | 
						|
  if(err) return 1;
 | 
						|
 | 
						|
 | 
						|
  // Write continue.sh
 | 
						|
  FILE *of = fopen("/data/data/com.termux/files/continue.sh.new", "wb");
 | 
						|
  if(of == NULL) return 1;
 | 
						|
 | 
						|
  size_t num = str_continue_end - str_continue;
 | 
						|
  size_t num_written = fwrite(str_continue, 1, num, of);
 | 
						|
  if (num != num_written) return 1;
 | 
						|
 | 
						|
  fclose(of);
 | 
						|
 | 
						|
  err = system("chmod +x /data/data/com.termux/files/continue.sh.new");
 | 
						|
  if(err) return 1;
 | 
						|
 | 
						|
  err = rename("/data/data/com.termux/files/continue.sh.new", "/data/data/com.termux/files/continue.sh");
 | 
						|
  if(err == -1) return 1;
 | 
						|
 | 
						|
  // Disable SSH
 | 
						|
  err = system("setprop persist.neos.ssh 0");
 | 
						|
  if(err) return 1;
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void * run_spinner(void * args) {
 | 
						|
  char *loading_msg = "Installing " BRAND_S;
 | 
						|
  char *argv[2] = {NULL, loading_msg};
 | 
						|
  spin(2, argv);
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int main() {
 | 
						|
  pthread_t spinner_thread;
 | 
						|
  assert(pthread_create(&spinner_thread, NULL, run_spinner, NULL) == 0);
 | 
						|
 | 
						|
  int status = do_install();
 | 
						|
 | 
						|
  return status;
 | 
						|
}
 | 
						|
 |