int main (int argc, char **argv) { ARGPARSE_ARGS pargs; int cmd = 0; const char *keygrip = NULL; set_strusage (my_strusage); log_set_prefix ("gpg-preset-passphrase", 1); /* Make sure that our subsystems are ready. */ i18n_init (); init_common_subsystems (&argc, &argv); opt_homedir = default_homedir (); pargs.argc = &argc; pargs.argv = &argv; pargs.flags= 1; /* (do not remove the args) */ while (arg_parse (&pargs, opts) ) { switch (pargs.r_opt) { case oVerbose: opt.verbose++; break; case oHomedir: opt_homedir = pargs.r.ret_str; break; case oPreset: cmd = oPreset; break; case oForget: cmd = oForget; break; case oPassphrase: opt_passphrase = pargs.r.ret_str; break; default : pargs.err = 2; break; } } if (log_get_errorcount(0)) exit(2); if (argc == 1) keygrip = *argv; else usage (1); /* Tell simple-pwquery about the the standard socket name. */ { char *tmp = make_filename (opt_homedir, GPG_AGENT_SOCK_NAME, NULL); simple_pw_set_socket (tmp); xfree (tmp); } if (cmd == oPreset) preset_passphrase (keygrip); else if (cmd == oForget) forget_passphrase (keygrip); else log_error ("one of the options --preset or --forget must be given\n"); agent_exit (0); return 8; /*NOTREACHED*/ }
/** This thread keeps the HIP daemon connection alive. */ void *connhipd_thread(void *data) { /* Variables. */ int err = 0, n, len, ret, max_fd; struct sockaddr_in6 agent_addr; struct hip_common *msg = (struct hip_common *)data; socklen_t alen; fd_set read_fdset; struct timeval tv; HIP_DEBUG("Waiting messages...\n"); /* Start handling. */ hip_agent_thread_started = 1; while (hip_agent_thread_started) { FD_ZERO(&read_fdset); FD_SET(hip_agent_sock, &read_fdset); max_fd = hip_agent_sock; tv.tv_sec = 1; tv.tv_usec = 0; if (hip_agent_connected < 1) { /* Test connection. */ //HIP_IFEL(hip_agent_connected < -60, -1, "Could not connect to daemon.\n"); //HIP_DEBUG("Pinging daemon...\n"); hip_build_user_hdr(msg, SO_HIP_AGENT_PING, 0); n = hip_send_recv_daemon_info((char *)msg, 1, hip_agent_sock); //if (n < 0) HIP_DEBUG("Could not send ping to daemon, waiting.\n"); hip_agent_connected--; } /* Wait for incoming packets. */ if (select(max_fd + 1, &read_fdset, NULL,NULL, &tv) == -1) { HIP_ERROR("select() error: %s.\n", strerror(errno)); err = -1; goto out_err; } if (!hip_agent_thread_started) continue; if (!FD_ISSET(hip_agent_sock, &read_fdset)) continue; memset(&agent_addr, 0, sizeof(agent_addr)); alen = sizeof(agent_addr); n = recvfrom(hip_agent_sock, msg, sizeof(struct hip_common), MSG_PEEK, (struct sockaddr *)&agent_addr, &alen); if (n < 0) { HIP_ERROR("Error receiving message header from daemon.\n"); err = -1; goto out_err; } // HIP_DEBUG("Header received successfully\n"); alen = sizeof(agent_addr); len = hip_get_msg_total_len(msg); n = recvfrom(hip_agent_sock, msg, len, 0, (struct sockaddr *)&agent_addr, &alen); if (n < 0) { HIP_ERROR("Error receiving message parameters from daemon.\n"); err = -1; goto out_err; } //HIP_DEBUG("Received message from daemon (%d bytes)\n", n); //HIP_ASSERT(n == len); if (n != len) { HIP_ERROR("Received packet length and HIP msg len dont match %d != %d!!!\n", n, len); continue; } if (agent_addr.sin6_port != ntohs(HIP_DAEMON_LOCAL_PORT)) { HIP_DEBUG("Drop, message not from hipd"); continue; } connhipd_handle_msg(msg, &agent_addr); } out_err: /* Send quit message to daemon. */ hip_build_user_hdr(msg, SO_HIP_AGENT_QUIT, 0); n = hip_send_recv_daemon_info((char *)msg, 1, hip_agent_sock); if (n < 0) HIP_ERROR("Could not send quit message to daemon.\n"); if (hip_agent_sock) close(hip_agent_sock); if (msg != NULL) HIP_FREE(msg); hip_agent_thread_started = 0; agent_exit(); HIP_DEBUG("Connection thread exit.\n"); /* This function cannot have a returning value */ /*return (err);*/ }