void *update_casts(void *casts) { int i; int res; GtkListStore *store; GtkTreeIter iter; feed** feeds = NULL; feeds = get_feeds(FEED_FILE); assert(feeds != NULL); store = gtk_list_store_new(COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); for(i = 0; feeds[i] != NULL; i++) { #ifdef DEBUG printf("Fetching: %s\n", feeds[i]->address); printf("Basename: %s\n", basename(feeds[i]->address)); #endif res = http_download(feeds[i]->address, "/tmp/podfetcher_feed"); if(res != 0) continue; parse_feed("/tmp/podfetcher_feed", feeds[i]); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, FEED_TITLE, (gchar *)feeds[i]->title, FEED_AUTHOR, (gchar *)feeds[i]->image, -1); } gtk_tree_view_set_model(GTK_TREE_VIEW(casts), GTK_TREE_MODEL(store)); g_object_unref(store); pthread_exit(0); }
/** * GETURL ARexx command * * @param rxmsg the message defining the ARexx context * @param args the command's arguments */ static void arexx_geturl(struct RexxMsg *rxmsg, STRPTR args) { APTR arg_handle; struct { STRPTR url; STRPTR filename; } geturl_arg; memset(&geturl_arg,0,sizeof(geturl_arg)); if ((arg_handle = ParseTemplate("URL/A,FILENAME/A",args,&geturl_arg))) { void *buf; int buf_len; if (http_download(geturl_arg.url, &buf, &buf_len)) { FILE *fh; if ((fh = fopen(geturl_arg.filename,"wb"))) { fwrite(buf,1,buf_len,fh); fclose(fh); } } else rxmsg->rm_Result1 = 10; FreeTemplate(arg_handle); } }
gboolean website_update_games_database(HttpHelper* hh, const gchar* localfile, const gchar* fileurl, MudError** error) { gchar* tmpfile_templ = "mmXXXXXX"; gchar* tmpfile_name = NULL; int tmpfile = 0; int gmfile = 0; int ret = TRUE; GError* gerror = NULL; tmpfile = g_file_open_tmp (tmpfile_templ, &tmpfile_name, &gerror); if (tmpfile == -1) { g_free (tmpfile_name); *error = mud_cnv (gerror); return FALSE; } mdebug (DBG_GAMELIST, 0, "Using temp file: %s\n", tmpfile_name); ret = http_download (fileurl, tmpfile, hh); if( ret != CONNECT_OK ) { *error = mud_error_new (MUD_NETWORK_ERROR, ret, network_errmsg (ret)); ret = FALSE; } else { gmfile = open (localfile, O_WRONLY | O_CREAT | O_TRUNC, MUD_NEW_FILE_MODE); if (gmfile == -1) { *error = mud_error_new (MUD_NETWORK_ERROR, errno, strerror (errno)); close (tmpfile); ret = FALSE; } else { lseek (tmpfile, (off_t) 0, SEEK_SET); mdebug (DBG_GAMELIST, 0, "Uncompressing to %s...\n", localfile); ret = uncompress_file (tmpfile, gmfile, error); } } g_remove (tmpfile_name); // close (tmpfile); // closed in uncompress_file close (gmfile); g_free (tmpfile_name); return ret; }
int main() { Result ret=0; httpcContext context; // Initialize services srvInit(); aptInit(); hidInit(NULL); gfxInit(); //gfxSet3D(true); // uncomment if using stereoscopic 3D httpcInit(); ret = httpcOpenContext(&context, "http://10.0.0.3/httpexample_rawimg.bin", 0);//Change this to your own URL. if(ret==0) { ret=http_download(&context); httpcCloseContext(&context); } // Main loop while (aptMainLoop()) { gspWaitForVBlank(); hidScanInput(); // Your code goes here u32 kDown = hidKeysDown(); if (kDown & KEY_START) break; // break in order to return to hbmenu // Flush and swap framebuffers gfxFlushBuffers(); gfxSwapBuffers(); } // Exit services httpcExit(); gfxExit(); hidExit(); aptExit(); srvExit(); return 0; }
static void *http_request(void* arg) { WEBBLK *webblk; int authok = !http_serv.httpauth; char line[HTTP_PATH_LENGTH]; char *url = NULL; char *pointer; char *strtok_str = NULL; CGITAB *cgient; int content_length = 0; int sock = (int) (uintptr_t) arg; if(!(webblk = malloc(sizeof(WEBBLK)))) http_exit(webblk); memset(webblk,0,sizeof(WEBBLK)); webblk->sock = sock; while (hgets(line, sizeof(line), webblk->sock)) { if (*line == '\r' || *line == '\n') break; if((pointer = strtok_r(line," \t\r\n",&strtok_str))) { if(!strcasecmp(pointer,"GET")) { if((pointer = strtok_r(NULL," \t\r\n",&strtok_str))) { webblk->request_type = REQTYPE_GET; url = strdup(pointer); } } else if(!strcasecmp(pointer,"POST")) { if((pointer = strtok_r(NULL," \t\r\n",&strtok_str))) { webblk->request_type = REQTYPE_POST; url = strdup(pointer); } } else if(!strcasecmp(pointer,"PUT")) { http_error(webblk,"400 Bad Request", "", "This server does not accept PUT requests"); } else if(!strcasecmp(pointer,"Authorization:")) { if((pointer = strtok_r(NULL," \t\r\n",&strtok_str))) authok = http_authenticate(webblk,pointer, strtok_r(NULL," \t\r\n",&strtok_str)); } else if(!strcasecmp(pointer,"Cookie:")) { if((pointer = strtok_r(NULL,"\r\n",&strtok_str))) http_interpret_variable_string(webblk, pointer, VARTYPE_COOKIE); } else if(!strcasecmp(pointer,"Content-Length:")) { if((pointer = strtok_r(NULL," \t\r\n",&strtok_str))) content_length = atoi(pointer); } } } webblk->request = url; if(webblk->request_type == REQTYPE_POST && content_length != 0) { char *post_arg; if((pointer = post_arg = malloc(content_length + 1))) { int i; for(i = 0; i < content_length; i++) { *pointer = hgetc(webblk->sock); if(*pointer != '\n' && *pointer != '\r') pointer++; } *pointer = '\0'; http_interpret_variable_string(webblk, post_arg, VARTYPE_POST); free(post_arg); } } if (!authok) { http_error(webblk, "401 Authorization Required", "WWW-Authenticate: Basic realm=\"HERCULES\"\n", "You must be authenticated to use this service"); } if (!url) { http_error(webblk,"400 Bad Request", "", "You must specify a GET or POST request"); } /* anything following a ? in the URL is part of the get arguments */ if ((pointer=strchr(url,'?'))) { *pointer++ = 0; http_interpret_variable_string(webblk, pointer, VARTYPE_GET); } while(url[0] == '/' && url[1] == '/') url++; webblk->baseurl = url; if(!strcasecmp("/",url)) url = HTTP_WELCOME; if(strncasecmp("/cgi-bin/",url,9)) http_download(webblk,url); else url += 9; while(*url == '/') url++; #if 0 http_dump_cgi_variables(webblk); #endif for(cgient = cgidir; cgient->path; cgient++) { if(!strcmp(cgient->path, url)) { char tbuf[80]; hprintf(webblk->sock,"HTTP/1.0 200 OK\nConnection: close\n"); hprintf(webblk->sock,"Date: %s\n", http_timestring(tbuf,sizeof(tbuf),time(NULL))); (cgient->cgibin) (webblk); http_exit(webblk); } } #if defined(OPTION_DYNAMIC_LOAD) { zz_cgibin dyncgi; if( (dyncgi = HDL_FINDSYM(webblk->baseurl)) ) { char tbuf[80]; hprintf(webblk->sock,"HTTP/1.0 200 OK\nConnection: close\n"); hprintf(webblk->sock,"Date: %s\n", http_timestring(tbuf,sizeof(tbuf),time(NULL))); dyncgi(webblk); http_exit(webblk); } } #endif /*defined(OPTION_DYNAMIC_LOAD)*/ http_error(webblk, "404 File Not Found","", "The requested file was not found"); return NULL; }
static void task_populate_titledb_thread(void* arg) { populate_titledb_data* data = (populate_titledb_data*) arg; Result res = 0; linked_list titles; linked_list_init(&titles); json_t* root = NULL; if(R_SUCCEEDED(res = http_download_json("https://api.titledb.com/v1/entry?nested=true" "&only=id&only=name&only=author&only=headline&only=category" "&only=cia.id&only=cia.mtime&only=cia.version&only=cia.size&only=cia.titleid" "&only=tdsx.id&only=tdsx.mtime&only=tdsx.version&only=tdsx.size&only=tdsx.smdh.id", &root, 1024 * 1024))) { if(json_is_array(root)) { for(u32 i = 0; i < json_array_size(root) && R_SUCCEEDED(res); i++) { svcWaitSynchronization(task_get_pause_event(), U64_MAX); if(task_is_quit_all() || svcWaitSynchronization(data->cancelEvent, 0) == 0) { break; } json_t* entry = json_array_get(root, i); if(json_is_object(entry)) { list_item* item = (list_item*) calloc(1, sizeof(list_item)); if(item != NULL) { titledb_info* titledbInfo = (titledb_info*) calloc(1, sizeof(titledb_info)); if(titledbInfo != NULL) { titledbInfo->id = (u32) json_object_get_integer(entry, "id", 0); string_copy(titledbInfo->category, json_object_get_string(entry, "category", "Unknown"), sizeof(titledbInfo->category)); string_copy(titledbInfo->meta.shortDescription, json_object_get_string(entry, "name", ""), sizeof(titledbInfo->meta.shortDescription)); string_copy(titledbInfo->meta.publisher, json_object_get_string(entry, "author", ""), sizeof(titledbInfo->meta.publisher)); json_t* headline = json_object_get(entry, "headline"); if(json_is_string(headline)) { const char* val = json_string_value(headline); if(json_string_length(headline) > sizeof(titledbInfo->headline) - 1) { snprintf(titledbInfo->headline, sizeof(titledbInfo->headline), "%.508s...", val); } else { string_copy(titledbInfo->headline, val, sizeof(titledbInfo->headline)); } } else { titledbInfo->headline[0] = '\0'; } json_t* cias = json_object_get(entry, "cia"); if(json_is_array(cias)) { for(u32 j = 0; j < json_array_size(cias); j++) { json_t* cia = json_array_get(cias, j); if(json_is_object(cia)) { const char* mtime = json_object_get_string(cia, "mtime", "Unknown"); if(!titledbInfo->cia.exists || task_populate_titledb_compare_dates(mtime, titledbInfo->cia.mtime, sizeof(titledbInfo->cia.mtime)) >= 0) { titledbInfo->cia.exists = true; titledbInfo->cia.id = (u32) json_object_get_integer(cia, "id", 0); string_copy(titledbInfo->cia.mtime, mtime, sizeof(titledbInfo->cia.mtime)); string_copy(titledbInfo->cia.version, json_object_get_string(cia, "version", "Unknown"), sizeof(titledbInfo->cia.version)); titledbInfo->cia.size = (u32) json_object_get_integer(cia, "size", 0); titledbInfo->cia.titleId = strtoull(json_object_get_string(cia, "titleid", "0"), NULL, 16); } } } } json_t* tdsxs = json_object_get(entry, "tdsx"); if(json_is_array(tdsxs)) { for(u32 j = 0; j < json_array_size(tdsxs); j++) { json_t* tdsx = json_array_get(tdsxs, j); if(json_is_object(tdsx)) { const char* mtime = json_object_get_string(tdsx, "mtime", "Unknown"); if(!titledbInfo->tdsx.exists || task_populate_titledb_compare_dates(mtime, titledbInfo->tdsx.mtime, sizeof(titledbInfo->tdsx.mtime)) >= 0) { titledbInfo->tdsx.exists = true; titledbInfo->tdsx.id = (u32) json_object_get_integer(tdsx, "id", 0); string_copy(titledbInfo->tdsx.mtime, mtime, sizeof(titledbInfo->tdsx.mtime)); string_copy(titledbInfo->tdsx.version, json_object_get_string(tdsx, "version", "Unknown"), sizeof(titledbInfo->tdsx.version)); titledbInfo->tdsx.size = (u32) json_object_get_integer(tdsx, "size", 0); json_t* smdh = json_object_get(tdsx, "smdh"); if(json_is_object(smdh)) { titledbInfo->tdsx.smdh.exists = true; titledbInfo->tdsx.smdh.id = (u32) json_object_get_integer(smdh, "id", 0); } } } } } char* latestTime = "Unknown"; if(titledbInfo->cia.exists && titledbInfo->tdsx.exists) { if(task_populate_titledb_compare_dates(titledbInfo->cia.mtime, titledbInfo->tdsx.mtime, sizeof(titledbInfo->cia.mtime)) >= 0) { latestTime = titledbInfo->cia.mtime; } else { latestTime = titledbInfo->tdsx.mtime; } } else if(titledbInfo->cia.exists) { latestTime = titledbInfo->cia.mtime; } else if(titledbInfo->tdsx.exists) { latestTime = titledbInfo->tdsx.mtime; } string_copy(titledbInfo->mtime, latestTime, sizeof(titledbInfo->mtime)); if((titledbInfo->cia.exists || titledbInfo->tdsx.exists) && (data->filter == NULL || data->filter(data->userData, titledbInfo))) { string_copy(item->name, titledbInfo->meta.shortDescription, LIST_ITEM_NAME_MAX); item->data = titledbInfo; task_populate_titledb_update_status(item); linked_list_add_sorted(&titles, item, data->userData, data->compare); } else { free(titledbInfo); free(item); } } else { free(item); res = R_APP_OUT_OF_MEMORY; } } else { res = R_APP_OUT_OF_MEMORY; } } } linked_list_iter iter; linked_list_iterate(&titles, &iter); while(linked_list_iter_has_next(&iter)) { list_item* item = linked_list_iter_next(&iter); if(R_SUCCEEDED(res)) { linked_list_add(data->items, item); } else { task_free_titledb(item); linked_list_iter_remove(&iter); } } } else { res = R_APP_BAD_DATA; } json_decref(root); } data->itemsListed = true; if(R_SUCCEEDED(res)) { linked_list_iter iter; linked_list_iterate(&titles, &iter); while(linked_list_iter_has_next(&iter)) { svcWaitSynchronization(task_get_pause_event(), U64_MAX); Handle events[2] = {data->resumeEvent, data->cancelEvent}; s32 index = 0; svcWaitSynchronizationN(&index, events, 2, false, U64_MAX); if(task_is_quit_all() || svcWaitSynchronization(data->cancelEvent, 0) == 0) { break; } list_item* item = (list_item*) linked_list_iter_next(&iter); titledb_info* titledbInfo = (titledb_info*) item->data; char url[128]; if(titledbInfo->cia.exists) { snprintf(url, sizeof(url), "https://3ds.titledb.com/v1/cia/%lu/icon_l.bin", titledbInfo->cia.id); } else if(titledbInfo->tdsx.exists && titledbInfo->tdsx.smdh.exists) { snprintf(url, sizeof(url), "https://3ds.titledb.com/v1/smdh/%lu/icon_l.bin", titledbInfo->tdsx.smdh.id); } else { continue; } u8 icon[0x1200]; u32 iconSize = 0; if(R_SUCCEEDED(http_download(url, &iconSize, &icon, sizeof(icon))) && iconSize == sizeof(icon)) { titledbInfo->meta.texture = screen_allocate_free_texture(); screen_load_texture_tiled(titledbInfo->meta.texture, icon, sizeof(icon), 48, 48, GPU_RGB565, false); } } } linked_list_destroy(&titles); svcCloseHandle(data->resumeEvent); svcCloseHandle(data->cancelEvent); data->result = res; data->finished = true; }
int main() { const char build_time[] = __DATE__ " " __TIME__; dlCounter = 0; ret = 0; gfxInitDefault(); consoleInit(GFX_TOP, &topScreen); consoleInit(GFX_BOTTOM, &bottomScreen); consoleSelect(&topScreen); /*printf("%s by %s\n", APPTITLE, APPAUTHOR);*/ printf("Koopa Cruiser by jsa\n"); printf("Version: %s\n", VERSION); //printf("--dev build--\n"); printf("Modified: %s\n", __TIMESTAMP__); printf("Built: %s\n\n", build_time); printf("Press X to save the page\n"); printf("Press START to exit.\n"); printf("Press B to start the swkbd applet\n\n"); gfxFlushBuffers(); httpcInit(); //Change this to your own URL. url = "http://mabel.nonm.co.uk/woop/view.php"; printf("Loading %s\n\n",url); gfxFlushBuffers(); ret = httpcOpenContext(&context, url , 0); //printf("return from httpcOpenContext: %"PRId32"\n",ret); gfxFlushBuffers(); if(ret==0) { ret=http_download(&context); //printf("return from http_download: %"PRId32"\n",ret); gfxFlushBuffers(); httpcCloseContext(&context); } // Main loop while (aptMainLoop()) { gspWaitForVBlank(); hidScanInput(); // Your code goes here u32 kDown = hidKeysDown(); if (kDown & KEY_START) break; // break in order to return to hbmenu if (kDown & KEY_X) { downloadfile(); } /*if (kDown & KEY_B) { printf("Launching swkbd.\n"); if(APT_PrepareToStartLibraryApplet(APPID_MIIVERSE_POSTING)) printf("Preparing to launch applet\n"); Result rc = APT_LaunchLibraryApplet(APPID_MIIVERSE_POSTING, 0, NULL, 0); if (rc) printf("APT_LaunchLibraryApplet: %08lX\n", rc); printf("this is probably broken!\n"); }*/ if(kDown & KEY_B) { printf("woah!\n"); swkbd_Init(); char buf[256]; strcpy(buf,"Hello world!"); } if(kDown & KEY_SELECT) { swkbd_GetStr(buf, 256); printf(buf); printf("\n"); } // Flush and swap framebuffers gfxFlushBuffers(); gfxSwapBuffers(); } // Exit services httpcExit(); gfxExit(); return 0; }
int cardpeek_update_perform(void) { const char* cardpeek_update_file = path_config_get_string(PATH_CONFIG_FILE_CARDPEEK_UPDATE); a_string_t *contents; update_t *update; int remove; update_item_t *item; time_t now = time(NULL); int updated = 0; char *url = NULL; char *local_file; char *local_dnld; unsigned char digest[SHA256_DIGEST_LENGTH]; a_string_t *url_request; unsigned first_update; first_update = (unsigned)luax_variable_get_integer("cardpeek.updates.first_update"); /* STEP 1: get cardpeek.update file */ url=luax_variable_get_strdup("cardpeek.updates.url"); if (url==NULL) url = g_strdup(DEFAULT_UPDATE_URL); log_printf(LOG_INFO,"Fetching '%s'",url); url_request = a_strnew(NULL); a_sprintf(url_request,"%s?u=%x&v=%s",url,first_update,VERSION); if (http_download(a_strval(url_request),cardpeek_update_file)==0) { g_free(url); return 0; } g_free(url); a_strfree(url_request); /* STEP 2: parse file */ if ((contents=file_get_contents(cardpeek_update_file))==NULL) { log_printf(LOG_ERROR,"failed to read update file information."); unlink(cardpeek_update_file); return 0; } update = update_new(); if ((update_load(update,a_strval(contents),a_strlen(contents)))==0) { unlink(cardpeek_update_file); a_strfree(contents); update_free(update); return 0; } a_strfree(contents); /* log_printf(LOG_DEBUG,"Updates correctly loaded from '%s'",cardpeek_update_file); */ if ((remove = update_filter_version(update,VERSION))>0) log_printf(LOG_WARNING,"%d updates will not be installed because they require a newer version of Cardpeek."); remove = update_filter_files(update); if (update->item_count) log_printf(LOG_INFO,"A total of %d files will be updated, %d files are kept unchanged.",update->item_count,remove); else log_printf(LOG_INFO,"No files will be updated, %d files are kept unchanged.",remove); item = update->items; while (item) { local_dnld = new_path(PATH_CONFIG_FOLDER_CARDPEEK,item->file,".download"); local_file = new_path(PATH_CONFIG_FOLDER_CARDPEEK,item->file,NULL); if (http_download(item->url,local_dnld)!=0) { if (sha256sum(local_dnld,digest)) { if (memcmp(digest,bytestring_get_data(&item->digest),SHA256_DIGEST_LENGTH)==0) { unlink(local_file); if (rename(local_dnld,local_file)==0) { log_printf(LOG_INFO,"Successfuly updated %s", local_file); updated++; } else { log_printf(LOG_ERROR,"Failed to copy %s to %s: %s", local_dnld, local_file, strerror(errno)); } } else { log_printf(LOG_WARNING,"File %s was not updated: authentication failed.",local_file); } } unlink(local_dnld); } g_free(local_dnld); g_free(local_file); item = item->next; } if (updated == update->item_count) { luax_variable_set_integer("cardpeek.updates.next_update",(int)(now+7*(24*3600))); luax_config_table_save(); } unlink(cardpeek_update_file); update_free(update); /* STEP 3: finish */ return 1; }
int main(int argc, char *argv[]) { http_download(argv[1], argv[2], NULL, NULL); }
int main() { httpcInit(); gfxInitDefault(); gfxSet3D(false); Result ret = filesystemInit(); PrintConsole topConsole, bttmConsole; consoleInit(GFX_TOP, &topConsole); consoleInit(GFX_BOTTOM, &bttmConsole); consoleSelect(&topConsole); consoleClear(); state_t current_state = STATE_NONE; state_t next_state = STATE_INITIAL; static char top_text[2048]; top_text[0] = '\0'; int selected_slot = 0; int firmware_version[firmware_length] = {0, 0, 9, 0, 0}; int firmware_selected_value = 0; static char payload_name[256]; u8* payload_buf = NULL; u32 payload_size = 0; while (aptMainLoop()) { hidScanInput(); if(hidKeysDown() & KEY_START)break; // transition function if(next_state != current_state) { switch(next_state) { case STATE_INITIAL: strcat(top_text, " Welcome to the oot3dhax installer! Please proceedwith caution, as you might lose data if you don't.You may press START at any time to return to menu.\n Press A to continue.\n\n"); break; case STATE_SELECT_SLOT: strcat(top_text, " Please select the savegame slot oot3dhax will be\ninstalled to. D-Pad to select, A to continue.\n"); break; case STATE_SELECT_FIRMWARE: strcat(top_text, "\n\n\n Please select your console's firmware version.\nOnly select NEW 3DS if you own a New 3DS (XL).\nD-Pad to select, A to continue.\n"); break; case STATE_DOWNLOAD_PAYLOAD: getPayloadName(firmware_version, payload_name); sprintf(top_text, "%s\n\n\n Downloading payload... %s\n", top_text, payload_name); break; case STATE_INSTALL_PAYLOAD: strcat(top_text, " Installing payload...\n"); break; case STATE_INSTALLED_PAYLOAD: strcat(top_text, " Done! oot3dhax was successfully installed."); break; case STATE_ERROR: strcat(top_text, " Looks like something went wrong. :(\n"); break; default: break; } current_state = next_state; } consoleSelect(&topConsole); printf("\x1b[0;%dHoot3dhax installer", (50 - 17) / 2); printf("\x1b[1;%dHby smea, yellows8, phase, and meladroit\n\n\n", (50 - 38) / 2); printf(top_text); // state function switch(current_state) { case STATE_INITIAL: if(hidKeysDown() & KEY_A)next_state = STATE_SELECT_SLOT; break; case STATE_SELECT_SLOT: { if(hidKeysDown() & KEY_UP)selected_slot++; if(hidKeysDown() & KEY_DOWN)selected_slot--; if(hidKeysDown() & KEY_A)next_state = STATE_SELECT_FIRMWARE; if(selected_slot < 0) selected_slot = 0; if(selected_slot > 2) selected_slot = 2; printf((selected_slot >= 2) ? " \n" : " ^\n"); printf(" Selected slot: %d \n", selected_slot + 1); printf((!selected_slot) ? " \n" : " v\n"); } break; case STATE_SELECT_FIRMWARE: { if(hidKeysDown() & KEY_LEFT)firmware_selected_value--; if(hidKeysDown() & KEY_RIGHT)firmware_selected_value++; if(firmware_selected_value < 0) firmware_selected_value = 0; if(firmware_selected_value >= firmware_length) firmware_selected_value = firmware_length - 1; if(hidKeysDown() & KEY_UP)firmware_version[firmware_selected_value]++; if(hidKeysDown() & KEY_DOWN)firmware_version[firmware_selected_value]--; if(firmware_version[firmware_selected_value] < 0) firmware_version[firmware_selected_value] = 0; if(firmware_version[firmware_selected_value] >= firmware_num_values[firmware_selected_value]) firmware_version[firmware_selected_value] = firmware_num_values[firmware_selected_value] - 1; if(hidKeysDown() & KEY_A)next_state = STATE_DOWNLOAD_PAYLOAD; int offset = 28 + firmware_format_offsets[firmware_selected_value]; printf((firmware_version[firmware_selected_value] < firmware_num_values[firmware_selected_value] - 1) ? "%*s^%*s" : "%*s-%*s", offset, " ", 50 - offset - 1, " "); printf(" Selected firmware: " "%s %s-%s-%s %s" "\n", firmware_labels[0][firmware_version[0]], firmware_labels[1][firmware_version[1]], firmware_labels[2][firmware_version[2]], firmware_labels[3][firmware_version[3]], firmware_labels[4][firmware_version[4]]); printf((firmware_version[firmware_selected_value] > 0) ? "%*sv%*s" : "%*s-%*s", offset, " ", 50 - offset - 1, " "); } break; case STATE_DOWNLOAD_PAYLOAD: { httpcContext context; static char url[512]; sprintf(url, "http://smealum.github.io/ninjhax2/Pvl9iD2Im5/otherapp/%s.bin", payload_name); Result ret = httpcOpenContext(&context, url, 0); if(ret) { sprintf(status, "Failed to open http context\n Error code: %08X", (unsigned int)ret); next_state = STATE_ERROR; break; } ret = http_download(&context, &payload_buf, &payload_size); if(ret) { sprintf(status, "Failed to download payload\n Error code: %08X", (unsigned int)ret); next_state = STATE_ERROR; break; } next_state = STATE_INSTALL_PAYLOAD; } break; case STATE_INSTALL_PAYLOAD: { static char filename[128]; sprintf(filename, "save0x.bin.%s", firmware_labels[4][firmware_version[4]]); read_payload(filename, save_buffer); sprintf(filename, "/save0%d.bin", selected_slot); Result ret = write_savedata(filename, save_buffer, save_size); if(ret) { sprintf(status, "Failed to install %s.\n Error code: %08X", filename, (unsigned int)ret); next_state = STATE_ERROR; break; } } { Result ret = write_savedata("/payload.bin", payload_buf, payload_size); if(ret) { sprintf(status, "Failed to install payload\n Error code : %08X", (unsigned int)ret); next_state = STATE_ERROR; break; } next_state = STATE_INSTALLED_PAYLOAD; } break; case STATE_INSTALLED_PAYLOAD: next_state = STATE_NONE; break; default: break; } consoleSelect(&bttmConsole); printf("\x1b[0;0H \n Found a bug? Go to\n https://github.com/meladroit/oot3dhax_installer/ \n\n Current status:\n %s\n", status); gspWaitForVBlank(); } filesystemExit(); gfxExit(); httpcExit(); return 0; }