我正在尝试在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的软件,并且可能很高兴有一个解决方法。

最佳答案

asprintfprintf系列功能的一种变体,该系列分配了一个缓冲区来保存格式化字符串的内存并返回它。这是一个带有可变数量参数的函数(因此声明中的...是有效的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;
}

09-08 05:44