Ah, if the third parameter really is a char **, that's a different story - I don't know anything about OpenGL and its APIs, so I assumed the double pointer was by accident.
In that case, first of all you should set the argtypes appropriately, it will make calling the function much cleaner:
c.glShaderSource.restype = None
c.glShaderSource.argtypes = [GLuint, GLsizei, POINTER(c_char_p), POINTER(GLint)]
Now you can call the function like this:
c.glShaderSource(shader, 1, byref(cast(source, c_char_p)), None)
Since the argtypes are set, the integer arguments don't need to be manually wrapped in the required types.
byref behaves like the & operator in C, it returns the address of the given object (which in this case creates a char **). The cast to c_char_p is necessary because byref doesn't perform any automatic conversions on its argument.
The length argument is None (C NULL), which according to the documentation means that all source strings are zero-terminated (which is the case for all C strings created by ctypes).