ctypes devuelve una cadena desde la función c

Soy un veterano de Python, pero no he incursionado mucho en C. Después de medio día de no encontrar nada en internet que me funcione, pensé que pediría aquí y obtendría la ayuda que necesito.

Lo que quiero hacer es escribir una función C simple que acepte una cadena y devuelva una cadena diferente. Planeo vincular esta función en varios idiomas (Java, Obj-C, Python, etc.), así que creo que tiene que ser C pura.

Esto es lo que tengo hasta ahora. Tenga en cuenta que obtengo un error de seguridad al intentar recuperar el valor en Python.

Hola 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

He leído que la falta de seguridad se debe a que C libera la memoria que se asignó inicialmente para la cadena devuelta. Tal vez solo estoy ladrando el árbol equivocado?

¿Cuál es la forma correcta de lograr lo que quiero?

Respuestas a la pregunta(3)

Su respuesta a la pregunta