]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3-libnetapi: add netapi_save_file_ucs2() to example code
authorGünther Deschner <gd@samba.org>
Thu, 18 Feb 2021 15:10:01 +0000 (16:10 +0100)
committerGünther Deschner <gd@samba.org>
Wed, 14 Jul 2021 16:49:30 +0000 (16:49 +0000)
Guenther

Signed-off-by: Guenther Deschner <gd@samba.org>
Reviewed-by: Alexander Bokovoy <ab@samba.org>
source3/lib/netapi/examples/common.c
source3/lib/netapi/examples/common.h

index c7f59684363e92212c96680c1dd87d92067c6507..a1a491e60c2b9580a82d29bb4ba1f87753bbf4fe 100644 (file)
@@ -10,6 +10,8 @@
 #include <fcntl.h>
 #include <unistd.h>
 
+#include <iconv.h>
+
 #ifndef MIN
 #define MIN(a,b) ((a)<(b)?(a):(b))
 #endif
@@ -182,3 +184,59 @@ int netapi_save_file(const char *fname, void *ppacket, size_t length)
        close(fd);
        return 0;
 }
+
+int netapi_save_file_ucs2(const char *fname, const char *str)
+{
+       char *str_p = NULL;
+       char *ucs2_str = NULL;
+       size_t str_len = 0;
+       size_t ucs2_str_len = 0;
+       iconv_t cd;
+       int ret;
+       char *start;
+       size_t start_len;
+       char *p;
+
+       str_len = strlen(str) + 1;
+       ucs2_str_len = 2 * str_len; /* room for ucs2 */
+       ucs2_str_len += 2;
+
+       ucs2_str = calloc(ucs2_str_len, sizeof(char));
+       if (ucs2_str == NULL) {
+               return -1;
+       }
+       p = ucs2_str; /* store for free */
+
+       ucs2_str[0] = 0xff;
+       ucs2_str[1] = 0xfe;
+
+       start = ucs2_str;
+       start_len = ucs2_str_len;
+
+       ucs2_str += 2;
+       ucs2_str_len -= 2;
+
+       cd = iconv_open("UTF-16LE", "ASCII");
+       if (cd == (iconv_t)-1) {
+               free(p);
+               return -1;
+       }
+
+       str_p = (void *)((uintptr_t)str);
+
+       ret = iconv(cd,
+                   &str_p,
+                   &str_len,
+                   &ucs2_str,
+                   &ucs2_str_len);
+       if (ret == -1) {
+               free(p);
+               return -1;
+       }
+       iconv_close(cd);
+
+       ret = netapi_save_file(fname, start, start_len);
+       free(p);
+
+       return ret;
+}
index e852e817f7ccc6ce532459b2be5b7023429e8523..df7f1768bf8d0a4f283f0ecc748706be17ccf942 100644 (file)
@@ -15,3 +15,4 @@ extern struct poptOption popt_common_netapi_examples[];
 
 char *netapi_read_file(const char *filename, uint32_t *psize);
 int netapi_save_file(const char *fname, void *ppacket, size_t length);
+int netapi_save_file_ucs2(const char *fname, const char *str);