libfdt: Add fdt_set_name() function
authorDavid Gibson <david@gibson.dropbear.id.au>
Fri, 11 Jan 2008 03:55:05 +0000 (14:55 +1100)
committerGerald Van Baren <vanbaren@cideas.com>
Wed, 19 Mar 2008 01:03:45 +0000 (21:03 -0400)
This patch adds an fdt_set_name() function to libfdt, mirroring
fdt_get_name().  This is a r/w function which alters the name of a
given device tree node.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
include/libfdt.h
libfdt/fdt_rw.c

index 6c0523685817646a260c951eb772e647c3868c13..f634a9c8df66a83f8fff8ca3c47096ffe1675e45 100644 (file)
@@ -845,6 +845,32 @@ int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size);
  */
 int fdt_del_mem_rsv(void *fdt, int n);
 
+/**
+ * fdt_set_name - change the name of a given node
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: structure block offset of a node
+ * @name: name to give the node
+ *
+ * fdt_set_name() replaces the name (including unit address, if any)
+ * of the given node with the given string.  NOTE: this function can't
+ * efficiently check if the new name is unique amongst the given
+ * node's siblings; results are undefined if this function is invoked
+ * with a name equal to one of the given node's siblings.
+ *
+ * This function may insert or delete data from the blob, and will
+ * therefore change the offsets of some existing nodes.
+ *
+ * returns:
+ *     0, on success
+ *     -FDT_ERR_NOSPACE, there is insufficient free space in the blob
+ *             to contain the new name
+ *     -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *     -FDT_ERR_BADMAGIC,
+ *     -FDT_ERR_BADVERSION,
+ *     -FDT_ERR_BADSTATE, standard meanings
+ */
+int fdt_set_name(void *fdt, int nodeoffset, const char *name);
+
 /**
  * fdt_setprop - create or change a property
  * @fdt: pointer to the device tree blob
index 6673f8ec962ad39510e25a36a56a3fd5cd5650d8..a1c70ff154e3dce4866036e407c3757eb766928c 100644 (file)
@@ -252,6 +252,30 @@ static int _add_property(void *fdt, int nodeoffset, const char *name, int len,
        return 0;
 }
 
+int fdt_set_name(void *fdt, int nodeoffset, const char *name)
+{
+       char *namep;
+       int oldlen, newlen;
+       int err;
+
+       if ((err = rw_check_header(fdt)))
+               return err;
+
+       namep = (char *)fdt_get_name(fdt, nodeoffset, &oldlen);
+       if (!namep)
+               return oldlen;
+
+       newlen = strlen(name);
+
+       err = _blob_splice_struct(fdt, namep, ALIGN(oldlen+1, FDT_TAGSIZE),
+                                 ALIGN(newlen+1, FDT_TAGSIZE));
+       if (err)
+               return err;
+
+       memcpy(namep, name, newlen+1);
+       return 0;
+}
+
 int fdt_setprop(void *fdt, int nodeoffset, const char *name,
                const void *val, int len)
 {