Author: vlendec
Date: 2006-08-10 11:33:42 +0000 (Thu, 10 Aug 2006)
New Revision: 17477

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17477

Log:
Add talloc_asprintf_len and make use of it.

Volker
Modified:
   branches/SAMBA_3_0/source/lib/talloc.c
   branches/SAMBA_3_0/source/lib/tdb_multikey.c


Changeset:
Modified: branches/SAMBA_3_0/source/lib/talloc.c
===================================================================
--- branches/SAMBA_3_0/source/lib/talloc.c      2006-08-10 10:31:27 UTC (rev 
17476)
+++ branches/SAMBA_3_0/source/lib/talloc.c      2006-08-10 11:33:42 UTC (rev 
17477)
@@ -1136,7 +1136,47 @@
        return ret;
 }
 
+int talloc_vasprintf_len(const void *t, char **res, const char *fmt,
+                        va_list ap)
+{      
+       int len;
+       va_list ap2;
+       char c;
+       
+       VA_COPY(ap2, ap);
 
+       /* this call looks strange, but it makes it work on older solaris boxes 
*/
+       if ((len = vsnprintf(&c, 1, fmt, ap2)) < 0) {
+               return len;
+       }
+
+       *res = (char *)_talloc(t, len+1);
+       if (*res) {
+               VA_COPY(ap2, ap);
+               vsnprintf(*res, len+1, fmt, ap2);
+               talloc_set_name_const(*res, *res);
+       }
+
+       return len;
+}
+
+
+/*
+  Perform string formatting, and return a pointer to newly allocated
+  memory holding the result, inside a memory pool.
+ */
+int talloc_asprintf_len(const void *t, char **res, const char *fmt, ...)
+{
+       va_list ap;
+       int len;
+
+       va_start(ap, fmt);
+       len = talloc_vasprintf_len(t, res, fmt, ap);
+       va_end(ap);
+       return len;
+}
+
+
 /**
  * Realloc @p s to append the formatted result of @p fmt and @p ap,
  * and return @p s, which may have moved.  Good for gradually

Modified: branches/SAMBA_3_0/source/lib/tdb_multikey.c
===================================================================
--- branches/SAMBA_3_0/source/lib/tdb_multikey.c        2006-08-10 10:31:27 UTC 
(rev 17476)
+++ branches/SAMBA_3_0/source/lib/tdb_multikey.c        2006-08-10 11:33:42 UTC 
(rev 17477)
@@ -140,13 +140,14 @@
 
        prim.dptr = data.dptr = NULL;
 
-       key.dptr = talloc_asprintf(ctx, "KEY/%d/%s", keynumber, value);
+       key.dsize = talloc_asprintf_len(ctx, &key.dptr, "KEY/%d/%s", keynumber,
+                                       value);
        if (key.dptr == NULL) {
                DEBUG(0, ("talloc_asprintf failed\n"));
                status = NT_STATUS_NO_MEMORY;
                goto fail;
        }
-       key.dsize = strlen(key.dptr)+1;
+       key.dsize += 1;
 
        prim = tdb_fetch(tdb, key);
        if (prim.dptr == NULL) {
@@ -214,13 +215,14 @@
                NTSTATUS status;
                TDB_DATA key;
 
-               key.dptr = talloc_asprintf(keys, "KEY/%d/%s", i, keys[i]);
+               key.dsize = talloc_asprintf_len(keys, &key.dptr, "KEY/%d/%s",
+                                               i, keys[i]);
                if (key.dptr == NULL) {
                        DEBUG(0, ("talloc_asprintf failed\n"));
                        TALLOC_FREE(keys);
                        return NT_STATUS_NO_MEMORY;
                }
-               key.dsize = strlen(key.dptr)+1;
+               key.dsize += 1;
 
                if (tdb_store(tdb, key, primary_key, TDB_INSERT) < 0) {
                        status = map_ntstatus_from_tdb(tdb);
@@ -273,13 +275,14 @@
                NTSTATUS status;
                TDB_DATA key;
 
-               key.dptr = talloc_asprintf(keys, "KEY/%d/%s", i, keys[i]);
+               key.dsize = talloc_asprintf_len(keys, &key.dptr, "KEY/%d/%s",
+                                               i, keys[i]);
                if (key.dptr == NULL) {
                        DEBUG(0, ("talloc_asprintf failed\n"));
                        TALLOC_FREE(keys);
                        return NT_STATUS_NO_MEMORY;
                }
-               key.dsize = strlen(key.dptr)+1;
+               key.dsize += 1;
 
                if (tdb_delete(tdb, key) < 0) {
                        status = map_ntstatus_from_tdb(tdb);

Reply via email to