The signature of iconv
is
size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);
But you call it with a first argument of pointer to iconv_t
:
iconv(&converter, &pIn, &inLeft, (char**)&pOut, &outLeft);
Which should be
iconv(converter, &pIn, &inLeft, (char**)&pOut, &outLeft);
An interesting question is why a warning is not generated. For that, let's look at the definition in iconv.h
:
/* Identifier for conversion method from one codeset to another. */
typedef void *iconv_t;
That's an... unfortunate choice.
I would program this a bit differently:
#define _XOPEN_SOURCE 500
#include <stdio.h>
#include <unistd.h>
#include <locale.h>
#include <langinfo.h>
#include <wchar.h>
#include <iconv.h>
#include <stdlib.h>
#include <err.h>
int main(void)
{
iconv_t converter;
char input[8]; /* enough space for a multibyte char */
wchar_t output[8];
char *pinput = input;
char *poutput = (char *)&output[0];
ssize_t bytes_read;
size_t error;
size_t input_bytes_left, output_bytes_left;
setlocale(LC_ALL, "");
converter = iconv_open("WCHAR_T", nl_langinfo(CODESET));
if (converter == (iconv_t)-1)
err(2, "failed to alloc conv_t");
bytes_read = read(STDIN_FILENO, input, sizeof input);
if (bytes_read <= 0)
err(2, "bad read");
input_bytes_left = bytes_read;
output_bytes_left = sizeof output;
error = iconv(converter,
&pinput, &input_bytes_left,
&poutput, &output_bytes_left);
if (error == (size_t)-1)
err(2, "failed conversion");
printf("%lc\n", output[0]);
iconv_close(converter);
return EXIT_SUCCESS;
}