/* %%% */ int sendkeymsg(void) { u_char rbuf[1024 * 32]; /* XXX: Enough ? Should I do MSG_PEEK ? */ int so, len; if ((so = socket(PF_KEY, SOCK_RAW, PF_KEY_V2)) < 0) { perror("socket(PF_KEY)"); goto end; } #if 0 { #include <sys/time.h> struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; if (setsockopt(so, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) { perror("setsockopt"); goto end; } } #endif pfkey_sadump((struct sadb_msg *)m_buf); if ((len = send(so, m_buf, m_len, 0)) < 0) { perror("send"); goto end; } if ((len = recv(so, rbuf, sizeof(rbuf), 0)) < 0) { perror("recv"); goto end; } pfkey_sadump((struct sadb_msg *)rbuf); end: close(so); return(0); }
static int postproc(struct sadb_msg *msg, int len) { #ifdef HAVE_PFKEY_POLICY_PRIORITY static int priority_support_check = 0; #endif if (msg->sadb_msg_errno != 0) { char inf[80]; const char *errmsg = NULL; if (f_mode == MODE_SCRIPT) snprintf(inf, sizeof(inf), "The result of line %d: ", lineno); else inf[0] = '\0'; switch (msg->sadb_msg_errno) { case ENOENT: switch (msg->sadb_msg_type) { case SADB_DELETE: case SADB_GET: case SADB_X_SPDDELETE: errmsg = "No entry"; break; case SADB_DUMP: errmsg = "No SAD entries"; break; case SADB_X_SPDDUMP: errmsg = "No SPD entries"; break; } break; default: errmsg = strerror(msg->sadb_msg_errno); } printf("%s%s.\n", inf, errmsg); return -1; } switch (msg->sadb_msg_type) { case SADB_GET: if (f_withports) pfkey_sadump_withports(msg); else pfkey_sadump(msg); break; case SADB_DUMP: /* filter out DEAD SAs */ if (!f_all) { caddr_t mhp[SADB_EXT_MAX + 1]; struct sadb_sa *sa; pfkey_align(msg, mhp); pfkey_check(mhp); if ((sa = (struct sadb_sa *)mhp[SADB_EXT_SA]) != NULL) { if (sa->sadb_sa_state == SADB_SASTATE_DEAD) break; } } if (f_forever) { /* TODO: f_withports */ shortdump(msg); } else { if (f_withports) pfkey_sadump_withports(msg); else pfkey_sadump(msg); } break; case SADB_X_SPDGET: if (f_withports) pfkey_spdump_withports(msg); else pfkey_spdump(msg); break; case SADB_X_SPDDUMP: if (f_withports) pfkey_spdump_withports(msg); else pfkey_spdump(msg); break; #ifdef HAVE_PFKEY_POLICY_PRIORITY case SADB_X_SPDADD: if (last_msg_type == SADB_X_SPDADD && last_priority != 0 && msg->sadb_msg_pid == getpid() && !priority_support_check) { priority_support_check = 1; if (!verifypriority(msg)) printf("WARNING: Kernel does not support policy priorities\n"); } break; #endif } return 0; }