Optimize the 0.0.0.0 case, and get it working on 2.3 kernels.
authorDaniel Hokka Zakrisson <dhokka@cs.princeton.edu>
Sat, 26 Jan 2008 02:04:34 +0000 (02:04 +0000)
committerDaniel Hokka Zakrisson <dhokka@cs.princeton.edu>
Sat, 26 Jan 2008 02:04:34 +0000 (02:04 +0000)
python/vserverimpl.c

index 9d4a503..a568fb2 100644 (file)
@@ -450,24 +450,35 @@ get_mask(struct vc_net_addr *addr)
 static PyObject *
 vserver_net_add(PyObject *self, PyObject *args)
 {
-  struct vc_net_addr addr;
+  struct vc_net_addr addr = { .vna_type = 0 };
   nid_t nid;
   const char *ip;
 
   if (!PyArg_ParseTuple(args, "Is", &nid, &ip))
     return NULL;
 
-  if (convert_address(ip, &addr) == -1)
-    return PyErr_Format(PyExc_ValueError, "%s is not a valid IP address", ip);
+  /* Optimize standard case, which also needs to be handled differently */
+  if (strcmp(ip, "0.0.0.0") == 0) {
+    addr.vna_type = VC_NXA_TYPE_MASK | VC_NXA_TYPE_IPV4;
+    addr.vna_flags = 0;
+    addr.vna_prefix = 0;
+    addr.vna_parent = 0;
+    addr.vna_v4_mask.s_addr = 0;
+    addr.vna_v4_ip.s_addr = 0;
+  }
+  else {
+    if (convert_address(ip, &addr) == -1)
+      return PyErr_Format(PyExc_ValueError, "%s is not a valid IP address", ip);
 
-  switch (get_mask(&addr)) {
-  case -1:
-    return PyErr_SetFromErrno(PyExc_OSError);
-  case 0:
-    /* XXX error here? */
-    break;
+    switch (get_mask(&addr)) {
+    case -1:
+      return PyErr_SetFromErrno(PyExc_OSError);
+    case 0:
+      /* XXX error here? */
+      break;
+    }
+    addr.vna_type |= VC_NXA_TYPE_ADDR;
   }
-  addr.vna_type |= VC_NXA_TYPE_ADDR;
 
   if (vc_net_add(nid, &addr) == -1 && errno != ESRCH)
     return PyErr_SetFromErrno(PyExc_OSError);