static int do_connecting(void) { struct key csession_secret; struct key csession_public; struct key tmpkey; unsigned backoff = 1; saw_seq_gap = 0; buffer->rewind(); key_generate(&csession_secret, &csession_public, keyex); make_ini(&csession_public, buffer->peek()); keylist_exchange_list_key(&tmpkey, &server_publics, &csession_secret); auth_start(&cid_authenticator, &tmpkey); while (!exitasap) { send_packet("INI1", cid_timeout * backoff); while (!exitasap) { if (poll_both() == 0) return STATE_DISCONNECTED; if (stdin_ready) read_lines(); if (sock_ready) { if (receive_cid(&csession_secret)) return STATE_SENDING; backoff = 0; } } if (backoff < retransmits) ++backoff; } return STATE_EXITING; }
/* * Reads an INI file and returns it as a ini_file object. * If filename is NULL, an empty ini_file object is created and returned. */ struct ini_file *ini_read(const char *filename, int *err, int *line) { if(line) *line = 0; if(!filename) { if(err) *err = FILE_CREATED; return make_ini(); } else { char *text = my_readfile(filename); if(!text) { if(err) *err = NO_SUCH_FILE; return NULL; } struct ini_file * ini = ini_parse(text, err, line); free(text); return ini; } }
struct ini_file *ini_parse(const char *text, int *err, int *line) { jmp_buf on_error; int e_code; struct ini_file *ini = NULL; ini_section *cur_sec = NULL; const char *tstart, *tend; int t; if(err) *err = SUCCESS; if(line) *line = 1; ini = make_ini(); if((e_code = setjmp(on_error)) != 0) { if(err) *err = e_code; ini_free(ini); return NULL; } while((t = get_token(&text, &tstart, &tend, line, on_error)) != T_END) { if(t == '[') { char *section_name; if(get_token(&text, &tstart, &tend, line, on_error) != T_VALUE) { longjmp(on_error, EMPTY_SECTION); } section_name = get_string(tstart, tend, on_error); cur_sec = add_section(&ini->sections, section_name); if(!cur_sec) longjmp(on_error, OUT_OF_MEMORY); if(get_token(&text, &tstart, &tend, line, on_error) != ']') { longjmp(on_error, MISSING_END_BRACE); } } else if (t == T_VALUE ) { char *par, *val; par = get_string(tstart, tend, on_error); t = get_token(&text, &tstart, &tend, line, on_error); if(t != '=' && t != ':') { longjmp(on_error, EXPECTED_EQUALS); } if(get_token(&text, &tstart, &tend, line, on_error) != T_VALUE) { longjmp(on_error, EXPECTED_VALUE); } val = get_string(tstart, tend, on_error); if(cur_sec) add_pair(cur_sec, par, val); else { /* Add the parameter and value to the INI file's globals */ ini_pair *pair; if(!(pair = malloc(sizeof *pair))) longjmp(on_error, OUT_OF_MEMORY); pair->param = par; pair->value = val; pair->left = pair->right = NULL; if(!ini->globals) ini->globals = pair; else insert_pair(ini->globals, pair); } } else longjmp(on_error, EXPECTED_PARAMETER); } return ini; }