[Libvir] [PATCH 1/6] Inactive domain support: new virConf APIs

Daniel P. Berrange berrange at redhat.com
Wed Nov 15 02:15:07 UTC 2006


The attached patch adds two new APIs to the virConf object needed for
creating new inactive domains:

  virConfNew
  virConfSetValue

Docs for these methods are inline with the patch. The semantics of the
virConfSetValue method are changed based on previous feedback - the
'value' object passed in is now always owned by the vifConf object upon
return - even upon failure. This actually simplified the calling code
quite alot too.

Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 
-------------- next part --------------
Index: src/conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/conf.c,v
retrieving revision 1.4
diff -c -r1.4 conf.c
*** src/conf.c	21 Sep 2006 15:24:37 -0000	1.4
--- src/conf.c	15 Nov 2006 02:33:59 -0000
***************
*** 144,159 ****
      free(val);
  }
  
! /**
!  * virConfCreate:
!  * @filename: the name to report errors
!  *
!  * Create a configuration internal structure
!  *
!  * Returns a pointer or NULL in case of error.
!  */
! static virConfPtr
! virConfCreate(const char *filename)
  {
      virConfPtr ret;
  
--- 144,150 ----
      free(val);
  }
  
! virConfPtr virConfNew(void)
  {
      virConfPtr ret;
  
***************
*** 164,175 ****
      }
      memset(ret, 0, sizeof(virConf));
  
!     ret->filename = filename;
  
      return(ret);
  }
  
  /**
   * virConfAddEntry:
   * @conf: the conf structure
   * @name: name of the entry or NULL for comment
--- 155,183 ----
      }
      memset(ret, 0, sizeof(virConf));
  
!     ret->filename = NULL;
  
      return(ret);
  }
  
  /**
+  * virConfCreate:
+  * @filename: the name to report errors
+  *
+  * Create a configuration internal structure
+  *
+  * Returns a pointer or NULL in case of error.
+  */
+ static virConfPtr
+ virConfCreate(const char *filename)
+ {
+     virConfPtr ret = virConfNew();
+     if (ret)
+         ret->filename = filename;
+     return(ret);
+ }
+ 
+ /**
   * virConfAddEntry:
   * @conf: the conf structure
   * @name: name of the entry or NULL for comment
***************
*** 785,790 ****
--- 793,852 ----
  }
  
  /**
+  * virConfGetValue:
+  * @conf: a configuration file handle
+  * @entry: the name of the entry
+  * @value: the new configuration value
+  *
+  * Set (or replace) the value associated to this entry in the configuration
+  * file. The passed in 'value' will be owned by the conf object upon return
+  * of this method, even in case of error. It should not be referenced again
+  * by the caller.
+  *
+  * Returns 0 on success, or -1 on failure.
+  */
+ int             virConfSetValue         (virConfPtr conf,
+                                          const char *setting,
+                                          virConfValuePtr value) {
+     virConfEntryPtr cur, prev = NULL;
+ 
+     cur = conf->entries;
+     while (cur != NULL) {
+         if ((cur->name != NULL) && (!strcmp(cur->name, setting))) {
+             break;
+         }
+         prev = cur;
+         cur = cur->next;
+     }
+     if (!cur) {
+         if (!(cur = malloc(sizeof(virConfEntry)))) {
+             virConfFreeValue(value);
+             return (-1);
+         }
+         cur->next = NULL;
+         cur->comment = NULL;
+         if (!(cur->name = strdup(setting))) {
+             virConfFreeValue(value);
+             free(cur);
+             return (-1);
+         }
+         cur->value = value;
+         if (prev) {
+             prev->next = cur;
+         } else {
+             conf->entries = cur;
+         }
+     } else {
+         if (cur->value) {
+             virConfFreeValue(cur->value);
+         }
+         cur->value = value;
+     }
+     return (0);
+ }
+ 
+ 
+ /**
   * virConfWriteFile:
   * @filename: the path to the configuration file.
   * @conf: the conf
***************
*** 878,880 ****
--- 940,952 ----
      virBufferFree(buf);
      return(ret);
  }
+ 
+ 
+ /*
+  * Local variables:
+  *  indent-tabs-mode: nil
+  *  c-indent-level: 4
+  *  c-basic-offset: 4
+  *  tab-width: 4
+  * End:
+  */
Index: src/conf.h
===================================================================
RCS file: /data/cvs/libvirt/src/conf.h,v
retrieving revision 1.1
diff -c -r1.1 conf.h
*** src/conf.h	29 Aug 2006 22:27:07 -0000	1.1
--- src/conf.h	15 Nov 2006 02:33:59 -0000
***************
*** 50,55 ****
--- 50,56 ----
  typedef struct _virConf virConf;
  typedef virConf *virConfPtr;
  
+ virConfPtr      virConfNew              (void);
  virConfPtr	virConfReadFile		(const char *filename);
  virConfPtr	virConfReadMem		(const char *memory,
  					 int len);
***************
*** 57,62 ****
--- 58,66 ----
  
  virConfValuePtr	virConfGetValue		(virConfPtr conf,
  					 const char *setting);
+ int             virConfSetValue         (virConfPtr conf,
+ 					 const char *setting,
+ 					 virConfValuePtr value);
  int		virConfWriteFile	(const char *filename,
  					 virConfPtr conf);
  int		virConfWriteMem		(char *memory,


More information about the libvir-list mailing list