我正在尝试在AIX上构建python-kerberos。 kerberospw.c使用了对asprintf的调用,但是从Google告诉我的信息来看,asprintf在AIX上不存在。
我看到了http://www.koders.com/c/fidAA9B130D588302673A28B568430A83131B7734C0.aspx?s=windows.h,看起来好像我可以创建一个替代asprintf,但是我不知道它将去哪里或如何将其包含在kerberospw.c中。
有没有一种方法可以使用koders.com示例或其他代码“伪造” asprintf?我可以只包含kerberospw.c中显示的asprintf函数吗?我不是C程序员,但是
在我看来,最后一个点是一个无效的签名。来自kerberospw.c的相关行如下
我意识到我可以与python-kerberos的作者联系,但是a)我认为,如果有的话,拥有一个潜在的补丁会有所帮助,并且b)我可能还会运行其他使用asprintf的软件,并且可能很高兴有一个解决方法。
最佳答案
asprintf
是printf
系列功能的一种变体,该系列分配了一个缓冲区来保存格式化字符串的内存并返回它。这是一个带有可变数量参数的函数(因此声明中的...
是有效的C代码)。您可以找到描述here。
如果vsnprintf
正常运行,则可以相对容易地重新实现它(即,如果缓冲区太小而无法容纳格式化的字符串,则返回错误)。
这是一个这样的实现:
#include <stdarg.h>
int asprintf(char **ret, const char *format, ...)
{
va_list ap;
*ret = NULL; /* Ensure value can be passed to free() */
va_start(ap, format);
int count = vsnprintf(NULL, 0, format, ap);
va_end(ap);
if (count >= 0)
{
char* buffer = malloc(count + 1);
if (buffer == NULL)
return -1;
va_start(ap, format);
count = vsnprintf(buffer, count + 1, format, ap);
va_end(ap);
if (count < 0)
{
free(buffer);
return count;
}
*ret = buffer;
}
return count;
}