Re: RFC 7217: installer support [8/8]

2017-07-15 Thread Robert Peichaer
On Sat, Jul 15, 2017 at 05:16:04PM +, Florian Obser wrote:
> OK?
> 
> diff --git distrib/miniroot/install.sub distrib/miniroot/install.sub
> index 26cecd81cbc..52360686b38 100644
> --- distrib/miniroot/install.sub
> +++ distrib/miniroot/install.sub
> @@ -2988,6 +2988,9 @@ do_upgrade() {
>   hostname $(stripcom /tmp/i/myname)
>   THESETS="$THESETS site$VERSION-$(hostname -s).tgz"
>  
> + _f=/mnt/etc/soii.key
> + [[ -f $_f ]] && sysctl net.inet6.ip6.soiikey=$(<$_f)
> +
>   # Configure the network.
>   enable_network

Still OK for the install.sub part ;-)



RFC 7217: installer support [8/8]

2017-07-15 Thread Florian Obser
OK?

diff --git distrib/miniroot/install.sub distrib/miniroot/install.sub
index 26cecd81cbc..52360686b38 100644
--- distrib/miniroot/install.sub
+++ distrib/miniroot/install.sub
@@ -2988,6 +2988,9 @@ do_upgrade() {
hostname $(stripcom /tmp/i/myname)
THESETS="$THESETS site$VERSION-$(hostname -s).tgz"
 
+   _f=/mnt/etc/soii.key
+   [[ -f $_f ]] && sysctl net.inet6.ip6.soiikey=$(<$_f)
+
# Configure the network.
enable_network
 
diff --git distrib/special/sysctl/sysctl.c distrib/special/sysctl/sysctl.c
index 6f3e333ac21..8c2ac6e69f4 100644
--- distrib/special/sysctl/sysctl.c
+++ distrib/special/sysctl/sysctl.c
@@ -18,14 +18,19 @@
  */
 
 #include 
+#include 
 #include 
 #include 
 
+#include 
+
 #include 
 #include 
 #include 
 #include 
 
+#define SOIIKEY_LEN 16
+
 struct var {
char *name;
int (*print)(struct var *);
@@ -87,6 +92,39 @@ pstring(struct var *v)
 }
 
 int
+parse_hex_char(char ch)
+{
+   if (ch >= '0' && ch <= '9')
+   return (ch - '0');
+   if (ch >= 'a' && ch <= 'f')
+   return (ch - 'a' + 10);
+   if (ch >= 'A' && ch <= 'F')
+   return (ch - 'A' + 10);
+
+   return (-1);
+}
+
+int
+set_soii_key(char *src)
+{
+   uint8_t key[SOIIKEY_LEN];
+   int mib[4] = {CTL_NET, PF_INET6, IPPROTO_IPV6, IPV6CTL_SOIIKEY};
+   int i, c;
+
+   for(i = 0; i < SOIIKEY_LEN; i++) {
+   if ((c = parse_hex_char(src[2 * i])) == -1)
+   return (-1);
+   key[i] = c << 4;
+   if ((c = parse_hex_char(src[2 * i + 1])) == -1)
+   return (-1);
+   key[i] |= c;
+   }
+   
+   return sysctl(mib, sizeof(mib) / sizeof(mib[0]), NULL, NULL, key,
+   SOIIKEY_LEN);
+}
+
+int
 main(int argc, char *argv[])
 {
int ch, i;
@@ -113,6 +151,16 @@ main(int argc, char *argv[])
 
while (argc--) {
name = *argv++;
+   /* 
+* strlen("net.inet6.ip6.soiikey="
+* "") == 54
+* strlen("net.inet6.ip6.soiikey=") == 22
+*/
+   if (strlen(name) == 54 && strncmp(name,
+   "net.inet6.ip6.soiikey=", 22) == 0) {
+   set_soii_key(name + 22);
+   continue;
+   }
 
for (i = 0; i < sizeof(vars)/sizeof(vars[0]); i++) {
if (strcmp(name, vars[i].name) == 0) {
-- 
2.13.0


-- 
I'm not entirely sure you are real.