ctypes retornam uma string da função c

Sou um veterano do Python, mas não me interessei muito em C. Depois de meio dia sem encontrar nada na internet que funcione para mim, pensei em perguntar aqui e obter a ajuda de que preciso.

O que eu quero fazer é escrever uma função C simples que aceita uma string e retorna uma string diferente. Eu pretendo ligar esta função em várias linguagens (Java, Obj-C, Python, etc), então eu acho que tem que ser puro C?

Aqui está o que eu tenho até agora. Observe que recebo um segfault ao tentar recuperar o valor em Python.

ola.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

const char* hello(char* name) {
    static char greeting[100] = "Hello, ";
    strcat(greeting, name);
    strcat(greeting, "!\n");
    printf("%s\n", greeting);
    return greeting;
}
main.py
import ctypes
hello = ctypes.cdll.LoadLibrary('./hello.so')
name = "Frank"
c_name = ctypes.c_char_p(name)
foo = hello.hello(c_name)
print c_name.value # this comes back fine
print ctypes.c_char_p(foo).value # segfault

Eu li que o segfault é causado por C liberando a memória que foi inicialmente alocada para a string retornada. Talvez eu esteja apenas latindo na árvore errada?

Qual é a maneira correta de realizar o que eu quero?

questionAnswers(3)

yourAnswerToTheQuestion