int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname, const void *buf, const unsigned int buflen) { struct ft_atom atom; void *node; char *p, *next; int nextra, depth; node = ft_node_ph2node(cxt, phandle); if (node == NULL) return -1; depth = 0; p = node; while ((next = ft_next(cxt, p, &atom)) != NULL) { switch (atom.tag) { case OF_DT_BEGIN_NODE: ++depth; break; case OF_DT_END_NODE: if (--depth > 0) break; /* haven't found the property, insert here */ cxt->p = p; return ft_prop(cxt, propname, buf, buflen); case OF_DT_PROP: if ((depth != 1) || strcmp(atom.name, propname)) break; /* found an existing property, overwrite it */ nextra = _ALIGN(buflen, 4) - _ALIGN(atom.size, 4); cxt->p = atom.data; if (nextra && !ft_make_space(cxt, &cxt->p, FT_STRUCT, nextra)) return -1; *(u32 *) (cxt->p - 8) = cpu_to_be32(buflen); ft_put_bin(cxt, buf, buflen); return 0; } p = next; } return -1; }
int ft_prop_int(struct ft_cxt *cxt, const char *name, unsigned int val) { u32 v = cpu_to_be32((u32) val); return ft_prop(cxt, name, &v, 4); }
int ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str) { return ft_prop(cxt, name, str, strlen(str) + 1); }