- u8 *p = buf;
- p = put_u16(p, 0); /* Substitute name offset */
- p = put_u16(p, utf16_len); /* Substitute name length */
- p = put_u16(p, utf16_len); /* Print name offset */
- p = put_u16(p, utf16_len); /* Print name length */
- p = put_u32(p, (symlink_target[0] == '/') ? 0 : 1);
- p = put_bytes(p, utf16_len, name_utf16);
- p = put_bytes(p, utf16_len, name_utf16);
- /*DEBUG("utf16_len = %zu, len = %zu", utf16_len, len);*/
- *len_ret = len;
-out:
- FREE(name_utf16);
- return buf;
+ ret = tstr_to_utf16le(symlink_target, strlen(symlink_target),
+ &name_utf16le, &name_utf16le_nbytes);
+ if (ret != 0)
+ return ret;
+
+ for (size_t i = 0; i < name_utf16le_nbytes / 2; i++)
+ if (name_utf16le[i] == cpu_to_le16('/'))
+ name_utf16le[i] = cpu_to_le16('\\');
+
+ size_t len = 12 + name_utf16le_nbytes * 2;
+ void *buf = MALLOC(len);
+ if (buf) {
+ void *p = buf;
+ p = put_u16(p, name_utf16le_nbytes); /* Substitute name offset */
+ p = put_u16(p, name_utf16le_nbytes); /* Substitute name length */
+ p = put_u16(p, 0); /* Print name offset */
+ p = put_u16(p, name_utf16le_nbytes); /* Print name length */
+ p = put_u32(p, 1); /* flags: 0 iff *full* target, including drive letter??? */
+ p = put_bytes(p, name_utf16le_nbytes, name_utf16le);
+ p = put_bytes(p, name_utf16le_nbytes, name_utf16le);
+ *len_ret = len;
+ *buf_ret = buf;
+ ret = 0;
+ } else {
+ ret = WIMLIB_ERR_NOMEM;
+ }
+ FREE(name_utf16le);
+ return ret;