int http_download(const char *src_url, const char *dst_filename) { CURL *curl; CURLcode res; void *progress; a_string_t *user_agent; a_string_t *progress_title; FILE *temp_fd; curl = curl_easy_init(); if (!curl) return 0; progress_title = a_strnew(NULL); a_sprintf(progress_title,"Updating %s",dst_filename); user_agent = a_strnew(NULL); a_sprintf(user_agent,"cardpeek/%s",VERSION); progress = ui_inprogress_new(a_strval(progress_title),"Please wait..."); temp_fd = fopen(dst_filename,"wb"); curl_easy_setopt(curl,CURLOPT_URL,src_url); curl_easy_setopt(curl,CURLOPT_WRITEDATA, temp_fd); curl_easy_setopt(curl,CURLOPT_USERAGENT, a_strval(user_agent)); curl_easy_setopt(curl,CURLOPT_FAILONERROR, 1L); curl_easy_setopt(curl,CURLOPT_NOPROGRESS, 0L); curl_easy_setopt(curl,CURLOPT_PROGRESSFUNCTION, progress_download); curl_easy_setopt(curl,CURLOPT_PROGRESSDATA, progress); res = curl_easy_perform(curl); fclose(temp_fd); if (res!=CURLE_OK) { log_printf(LOG_ERROR,"Failed to fetch %s: %s", src_url, curl_easy_strerror(res)); unlink(dst_filename); } curl_easy_cleanup(curl); ui_inprogress_free(progress); a_strfree(user_agent); a_strfree(progress_title); return (res==CURLE_OK); }
static int pcsc_connect(cardreader_t *cr, unsigned prefered_protocol) { DWORD attr_maxinput = 0; DWORD attr_maxinput_len = sizeof(unsigned int); SCARD_READERSTATE reader_state; pcsc_data_t* pcsc = cr->extra_data; int counter = 0; void *progress; memset(&reader_state,0,sizeof(reader_state)); reader_state.szReader = cr->name+7; reader_state.dwCurrentState = SCARD_STATE_UNAWARE; pcsc->status = SCardGetStatusChange(pcsc->hcontext,INFINITE,&reader_state,1); if (pcsc->status != SCARD_S_SUCCESS) { log_printf(LOG_ERROR,"Failed to query reader status before connecting: %s (error 0x%08x).", pcsc_stringify_error(pcsc->status), pcsc->status ); return 0; } progress = ui_inprogress_new("Connection","Waiting for the reader to connect to a card."); while ((reader_state.dwEventState & SCARD_STATE_PRESENT)==0) { reader_state.dwCurrentState = reader_state.dwEventState; if (((counter++)%30)==0) { log_printf(LOG_INFO,"Waiting for card to be present (current state: %s)...", pcsc_stringify_state(reader_state.dwEventState)); } if (!ui_inprogress_pulse(progress)) { log_printf(LOG_ERROR,"Connection aborted by user"); ui_inprogress_free(progress); pcsc->status = 0x6FFF; return 0; } pcsc->status = SCardGetStatusChange(pcsc->hcontext,100,&reader_state,1); if ((pcsc->status!=(LONG)SCARD_S_SUCCESS) && (pcsc->status!=(LONG)SCARD_E_TIMEOUT)) { log_printf(LOG_ERROR,"Failed to query reader status change before connecting: %s (error 0x%08x/%08x).", pcsc_stringify_error(pcsc->status), pcsc->status, SCARD_E_TIMEOUT ); return 0; } } ui_inprogress_free(progress); log_printf(LOG_DEBUG,"Attempting to connect to '%s'",cr->name); pcsc->status = SCardConnect(pcsc->hcontext, cr->name+7, /* SCARD_SHARE_EXCLUSIVE, */ SCARD_SHARE_SHARED, prefered_protocol, &(pcsc->hcard), &(cr->protocol)); if (pcsc->status!=SCARD_S_SUCCESS) { log_printf(LOG_ERROR,"Connection failed: %s (error 0x%08x).", pcsc_stringify_error(pcsc->status), pcsc->status ); return 0; } if (SCardGetAttrib(pcsc->hcard,SCARD_ATTR_MAXINPUT,(LPBYTE)&attr_maxinput,(LPDWORD)&attr_maxinput_len)==SCARD_S_SUCCESS) log_printf(LOG_INFO,"Reader maximum input length is %u bytes",attr_maxinput); else log_printf(LOG_DEBUG,"Could not determinate reader maximum input length"); log_printf(LOG_INFO,"Connection successful, protocol is %s",pcsc_stringify_protocol(cr->protocol)); cr->connected=1; return 1; }