register.c 1.4 KB

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