dump.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "unp.h"
  2. #include <net/pfkeyv2.h>
  3. /* include sadb_dump */
  4. void
  5. sadb_dump(int type)
  6. {
  7. int s;
  8. char buf[4096];
  9. struct sadb_msg msg;
  10. int goteof;
  11. s = Socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
  12. /* Build and write SADB_DUMP request */
  13. bzero(&msg, sizeof(msg));
  14. msg.sadb_msg_version = PF_KEY_V2;
  15. msg.sadb_msg_type = SADB_DUMP;
  16. msg.sadb_msg_satype = type;
  17. msg.sadb_msg_len = sizeof(msg) / 8;
  18. msg.sadb_msg_pid = getpid();
  19. printf("Sending dump message:\n");
  20. print_sadb_msg(&msg, sizeof(msg));
  21. Write(s, &msg, sizeof(msg));
  22. printf("\nMessages returned:\n");
  23. /* Read and print SADB_DUMP replies until done */
  24. goteof = 0;
  25. while (goteof == 0) {
  26. int msglen;
  27. struct sadb_msg *msgp;
  28. msglen = Read(s, &buf, sizeof(buf));
  29. msgp = (struct sadb_msg *)&buf;
  30. print_sadb_msg(msgp, msglen);
  31. if (msgp->sadb_msg_seq == 0)
  32. goteof = 1;
  33. }
  34. close(s);
  35. }
  36. int
  37. main(int argc, char **argv)
  38. {
  39. int satype = SADB_SATYPE_UNSPEC;
  40. int c;
  41. opterr = 0; /* don't want getopt() writing to stderr */
  42. while ( (c = getopt(argc, argv, "t:")) != -1) {
  43. switch (c) {
  44. case 't':
  45. if ((satype = getsatypebyname(optarg)) == -1)
  46. err_quit("invalid -t option %s", optarg);
  47. break;
  48. default:
  49. err_quit("unrecognized option: %c", c);
  50. }
  51. }
  52. sadb_dump(satype);
  53. }
  54. /* end sadb_dump */