--- client/dhcpc.c.orig	Fri Jan  1 05:20:08 1999
+++ client/dhcpc.c	Thu Jan 20 13:21:05 2000
@@ -88,6 +88,7 @@
 struct dhcp_reqspec reqspec;
 struct if_info intface;
 struct dhcp_param *param_list;
+int f_resolv, f_hostname;
 char pid_filename[MAXPATHLEN];
 char cache_filename[MAXPATHLEN];
 
@@ -256,6 +257,14 @@
   if (config_if(&intface, &addr, &mask, &brdaddr) == 0) {
     set_route(paramp);
   }
+#ifdef __FreeBSD__
+  if (f_resolv) {
+    set_resolv(param_list);
+  }
+  if (f_hostname) {
+    set_hostname(param_list);
+  }
+#endif
 #endif
 
   return;
@@ -293,7 +302,7 @@
   /*
    * split conditions into pieces for debugging
    */
-#ifndef sun
+#if !defined(sun) && !defined(__FreeBSD__)
   if (ntohs(rcv.ip->ip_len) < MINDHCPLEN + UDPHL + IPHL)
     return(0);
   if (ntohs(rcv.udp->uh_ulen) < MINDHCPLEN + UDPHL)
@@ -350,7 +359,7 @@
   /*
    * split conditions into pieces for debugging
    */
-#ifndef sun
+#if !defined(sun) && !defined(__FreeBSD__)
   if (ntohs(rcv.ip->ip_len) < MINDHCPLEN + UDPHL + IPHL)
     return(0);
   if (ntohs(rcv.udp->uh_ulen) < MINDHCPLEN + UDPHL)
@@ -398,11 +407,14 @@
 
   bzero(&tmp_reqspec, sizeof(tmp_reqspec));
   bzero(errmsg, sizeof(errmsg));
-  bzero(&newsigmask, sizeof(newsigmask));
-  bzero(&oldsigmask, sizeof(oldsigmask));
 
-  newsigmask = sigmask(SIGUSR1) | sigmask(SIGALRM);
-  oldsigmask = sigblock(newsigmask); /* begin critical */
+  sigemptyset(&newsigmask);
+
+  sigprocmask(0, NULL, &oldsigmask);
+  memcpy(&newsigmask, &oldsigmask, sizeof(sigset_t));
+  sigaddset(&newsigmask, SIGUSR1);
+  sigaddset(&newsigmask, SIGALRM);
+  sigprocmask(SIG_SETMASK, &newsigmask, NULL);
 
   switch (curr_state) {
   case BOUND:
@@ -423,7 +435,7 @@
   default:
     break;
   }
-  sigsetmask(oldsigmask); /* end critical */
+  sigprocmask(SIG_SETMASK, &oldsigmask, NULL); /* end critical */
 
   unlink(pid_filename);
 
@@ -1157,8 +1169,8 @@
   struct dhcp_param tmpparam;
 
   bzero(errmsg, sizeof(errmsg));
-  bzero(&newsigmask, sizeof(newsigmask));
-  bzero(&oldsigmask, sizeof(oldsigmask));
+  sigemptyset(&newsigmask);
+  sigemptyset(&oldsigmask);
   bzero(&tmpparam, sizeof(tmpparam));
 
   if (prev_state != RENEWING) {
@@ -1247,12 +1259,15 @@
 		   errmsg);
 	  }
 
-	  newsigmask = sigmask(SIGUSR1) | sigmask(SIGUSR2);
-	  oldsigmask = sigblock(newsigmask); /* begin critical */
+	  sigprocmask(0, NULL, &oldsigmask); /* begin critical */
+	  memcpy(&newsigmask, &oldsigmask, sizeof(sigset_t));
+	  sigaddset(&newsigmask, SIGUSR1);
+	  sigaddset(&newsigmask, SIGUSR2);
+	  sigprocmask(SIG_SETMASK, &newsigmask, NULL);
 	  clean_param(param_list);
 	  free(param_list);
 	  param_list = NULL;
-	  sigsetmask(oldsigmask); /* end critical */
+	  sigprocmask(SIG_SETMASK, &oldsigmask, NULL); /* end critical */
 
 	  return(INIT);               /* Next state is INIT */
 	}
@@ -1260,13 +1275,16 @@
 		 dhcp_msgtoparam(rcv.dhcp, DHCPLEN(rcv.udp),
 				 &tmpparam) == OK) {
 
-	  newsigmask = sigmask(SIGUSR1) | sigmask(SIGUSR2);
-	  oldsigmask = sigblock(newsigmask); /* begin critical */
+	  sigprocmask(0, NULL, &oldsigmask);
+	  memcpy(&newsigmask, &oldsigmask, sizeof(sigset_t));
+	  sigaddset(&newsigmask, SIGUSR1);
+	  sigaddset(&newsigmask, SIGUSR2);
+	  sigprocmask(SIG_SETMASK, &newsigmask, NULL); /* begin critical */
 	  merge_param(param_list, &tmpparam);
 	  *param_list = tmpparam;
 	  param_list->lease_origin = send_epoch;
 	  param_list->next = NULL;
-	  sigsetmask(oldsigmask); /* end critical */
+	  sigprocmask(SIG_SETMASK, &oldsigmask, NULL); /* end critical */
 
 	  syslog(LOG_INFO, "Got DHCPACK (IP = %s, duration = %d secs)",
 		 inet_ntoa(param_list->yiaddr), param_list->lease_duration);
@@ -1316,8 +1334,8 @@
   struct dhcp_param tmpparam;
 
   bzero(errmsg, sizeof(errmsg));
-  bzero(&newsigmask, sizeof(newsigmask));
-  bzero(&oldsigmask, sizeof(oldsigmask));
+  sigemptyset(&newsigmask);
+  sigemptyset(&oldsigmask);
   bzero(&tmpparam, sizeof(tmpparam));
 
   if (time(&curr_epoch) == -1) {
@@ -1386,12 +1404,15 @@
 		   errmsg);
 	  }
 
-	  newsigmask = sigmask(SIGUSR1) | sigmask(SIGUSR2);
-	  oldsigmask = sigblock(newsigmask); /* begin critical */
+	  sigprocmask(0, NULL, &oldsigmask);
+	  memcpy(&newsigmask, &oldsigmask, sizeof(sigset_t));
+	  sigaddset(&newsigmask, SIGUSR1);
+	  sigaddset(&newsigmask, SIGUSR2);
+	  sigprocmask(SIG_SETMASK, &newsigmask, NULL); /* begin critical */
 	  clean_param(param_list);
 	  free(param_list);
 	  param_list = NULL;
-	  sigsetmask(oldsigmask); /* end critical */
+	  sigprocmask(SIG_SETMASK, &oldsigmask, NULL); /* end critical */
 
 	  return(INIT);               /* Next state is INIT */
 	}
@@ -1399,13 +1420,16 @@
 		 dhcp_msgtoparam(rcv.dhcp, DHCPLEN(rcv.udp),
 				 &tmpparam) == OK) {
 
-	  newsigmask = sigmask(SIGUSR1) | sigmask(SIGUSR2);
-	  oldsigmask = sigblock(newsigmask); /* begin critical */
+	  sigprocmask(0, NULL, &oldsigmask);
+	  memcpy(&newsigmask, &oldsigmask, sizeof(sigset_t));
+	  sigaddset(&newsigmask, SIGUSR1);
+	  sigaddset(&newsigmask, SIGUSR2);
+	  sigprocmask(SIG_SETMASK, &newsigmask, NULL); /* begin critical */
 	  merge_param(param_list, &tmpparam);
 	  *param_list = tmpparam;
 	  param_list->lease_origin = send_epoch;
 	  param_list->next = NULL;
-	  sigsetmask(oldsigmask); /* end critical */
+	  sigprocmask(SIG_SETMASK, &oldsigmask, NULL); /* end critical */
 
 	  syslog(LOG_INFO, "Got DHCPACK (IP = %s, duration = %d secs)",
 		 inet_ntoa(param_list->yiaddr), param_list->lease_duration);
@@ -1577,8 +1601,8 @@
   struct dhcp_reqspec tmp_reqspec;
 
   bzero(errmsg, sizeof(errmsg));
-  bzero(&newsigmask, sizeof(newsigmask));
-  bzero(&oldsigmask, sizeof(oldsigmask));
+  sigemptyset(&newsigmask);
+  sigemptyset(&oldsigmask);
   bzero(&tmpparam, sizeof(tmpparam));
   bzero(&tmp_reqspec, sizeof(tmp_reqspec));
 
@@ -1666,12 +1690,15 @@
 		   errmsg);
 	  }
 
-	  newsigmask = sigmask(SIGUSR1) | sigmask(SIGUSR2);
-	  oldsigmask = sigblock(newsigmask); /* begin critical */
+	  sigprocmask(0, NULL, &oldsigmask);
+	  memcpy(&newsigmask, &oldsigmask, sizeof(sigset_t));
+	  sigaddset(&newsigmask, SIGUSR1);
+	  sigaddset(&newsigmask, SIGUSR2);
+	  sigprocmask(SIG_SETMASK, &newsigmask, NULL); /* begin critical */
 	  clean_param(param_list);
 	  free(param_list);
 	  param_list = NULL;
-	  sigsetmask(oldsigmask); /* end critical */
+	  sigprocmask(SIG_SETMASK, &oldsigmask, NULL); /* end critical */
 
 	  return(INIT);               /* Next state is INIT */
 	}
@@ -1679,13 +1706,16 @@
 		 dhcp_msgtoparam(rcv.dhcp, DHCPLEN(rcv.udp),
 				 &tmpparam) == OK) {
 	  if ((arpans = arp_check(&tmpparam.yiaddr, &arpif)) == OK) {
-	    newsigmask = sigmask(SIGUSR1) | sigmask(SIGUSR2);
-	    oldsigmask = sigblock(newsigmask); /* begin critical */
+	    sigprocmask(0, NULL, &oldsigmask);
+	    memcpy(&newsigmask, &oldsigmask, sizeof(sigset_t));
+	    sigaddset(&newsigmask, SIGUSR1);
+	    sigaddset(&newsigmask, SIGUSR2);
+	    sigprocmask(SIG_SETMASK, &newsigmask, NULL); /* begin critical */
 	    merge_param(param_list, &tmpparam);
 	    *param_list = tmpparam;
 	    param_list->lease_origin = init_epoch;
 	    param_list->next = NULL;
-	    sigsetmask(oldsigmask); /* end critical */
+	    sigprocmask(SIG_SETMASK, &oldsigmask, NULL); /* end critical */
 
 	    syslog(LOG_INFO, "Got DHCPACK (IP = %s, duration = %d secs)",
 		   inet_ntoa(param_list->yiaddr), param_list->lease_duration);
@@ -1697,12 +1727,15 @@
 	    set_declinfo(&tmp_reqspec, param_list, errmsg, arpans);
 	    dhcp_decline(&tmp_reqspec);
 
-	    newsigmask = sigmask(SIGUSR1) | sigmask(SIGUSR2);
-	    oldsigmask = sigblock(newsigmask); /* begin critical */
+	    sigprocmask(0, NULL, &oldsigmask);
+	    memcpy(&newsigmask, &oldsigmask, sizeof(sigset_t));
+	    sigaddset(&newsigmask, SIGUSR1);
+	    sigaddset(&newsigmask, SIGUSR2);
+	    sigprocmask(SIG_SETMASK, &newsigmask, NULL); /* begin critical */
 	    clean_param(param_list);
 	    free(param_list);
 	    param_list = NULL;
-	    sigsetmask(oldsigmask); /* end critical */
+	    sigprocmask(SIG_SETMASK, &oldsigmask, NULL); /* end critical */
 
 	    syslog(LOG_NOTICE,
 		   "Got non-preferable DHCPACK, so go into INIT state");
@@ -1789,7 +1822,11 @@
 void
 usage()
 {
-  fprintf(stderr, "Usage: dhcpc [-d] if_name\n");
+#ifdef __FreeBSD__
+  fprintf(stderr, "Usage: dhcpc [-v] [-drn] if_name\n");
+#else
+  fprintf(stderr, "Usage: dhcpc [-v] [-d] if_name\n");
+#endif
   exit(1);
 }
 
@@ -1809,26 +1846,39 @@
 {
   int debug = 0;
   int n = 0;
+  int count;
   struct if_info ifinfo;
 
   bzero(&reqspec, sizeof(reqspec));
   bzero(&ifinfo, sizeof(ifinfo));
 
-  while (*++argv && argv[0][0] == '-') {
-    switch (argv[0][1]) {
-    case 'v':
-      version();
-      break;
-    case 'd':
-      debug = 1;
-      break;
-    default:
-      usage();
-      break;
-    }
-  }
-  if (argv[0] == NULL) usage();
+#ifdef __FreeBSD__
+#define COM_OPTS        "vdrn"
+#else
+#define COM_OPTS        "vd"
+#endif
 
+  while ((count = getopt(argc, argv, COM_OPTS)) != EOF) {
+    switch (count) {
+      case 'v':
+        version();
+      case 'd':
+        debug = 1;
+        break;
+#ifdef __FreeBSD__
+      case 'r':
+        f_resolv = 1;
+        break;
+      case 'n':
+        f_hostname = 1;
+        break;
+#endif
+    }
+   }
+  argc -= optind;
+  argv += optind;
+ 
+  if (argc < 1) usage();
   strcpy(ifinfo.name, argv[0]);
 
   /*
@@ -1859,6 +1909,11 @@
   reqspec.reqlist.list[reqspec.reqlist.len++] = SUBNET_MASK;
   reqspec.reqlist.list[reqspec.reqlist.len++] = ROUTER;
   reqspec.reqlist.list[reqspec.reqlist.len++] = BRDCAST_ADDR;
+#ifdef __FreeBSD__
+  reqspec.reqlist.list[reqspec.reqlist.len++] = DNS_DOMAIN;
+  reqspec.reqlist.list[reqspec.reqlist.len++] = DNS_SERVER;
+  reqspec.reqlist.list[reqspec.reqlist.len++] = HOSTNAME;
+#endif
   
   n = dhcp_client(&ifinfo);
   unlink(pid_filename);
