You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							79 lines
						
					
					
						
							2.2 KiB
						
					
					
				
			
		
		
	
	
							79 lines
						
					
					
						
							2.2 KiB
						
					
					
				| __attribute__((constructor))
 | |
| void preload_init() {
 | |
|   Py_Initialize();
 | |
|   PyRun_SimpleString("print('hello from c'); import extra.dsp.hook");
 | |
| }
 | |
| 
 | |
| #define _GNU_SOURCE  // Must be defined before any includes for RTLD_NEXT
 | |
| #include <stdio.h>
 | |
| #include <dlfcn.h>
 | |
| #include <Python.h>  // Include Python header
 | |
| //#include <sys/ioctl.h>
 | |
| 
 | |
| // Define the original ioctl function pointer
 | |
| static int (*real_ioctl)(int fd, unsigned long request, void *arg) = NULL;
 | |
| 
 | |
| // Our custom ioctl hook
 | |
| int ioctl(int fd, unsigned long request, void *arg) {
 | |
| 	// Initialize the real ioctl function pointer on first call
 | |
| 	if (!real_ioctl) {
 | |
| 		real_ioctl = dlsym(RTLD_NEXT, "ioctl");
 | |
| 		if (!real_ioctl) {
 | |
| 			fprintf(stderr, "Error: Could not find real ioctl\n");
 | |
| 			return -1;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// Log the call
 | |
| 	//printf("Hooked ioctl: tid=%d fd=%d, request=0x%lx, arg=%p\n", gettid(), fd, request, arg);
 | |
| 
 | |
| 	// Call a Python function from extra.dsp.hook
 | |
| 	PyObject *pName, *pModule, *pFunc, *pArgs, *pValue;
 | |
| 	PyGILState_STATE gstate;
 | |
| 
 | |
| 	// Ensure the GIL is held (required for Python calls in multi-threaded apps)
 | |
| 	//gstate = PyGILState_Ensure();
 | |
| 
 | |
| 	// Import the module
 | |
| 	pName = PyUnicode_FromString("extra.dsp.hook");
 | |
| 	pModule = PyImport_Import(pName);
 | |
| 	Py_DECREF(pName);
 | |
| 
 | |
| 	// Call the original ioctl
 | |
| 	int ret = real_ioctl(fd, request, arg);
 | |
| 
 | |
| 	if (pModule != NULL) {
 | |
| 		// Get the function (assume it’s called "handle_ioctl")
 | |
| 		pFunc = PyObject_GetAttrString(pModule, "handle_ioctl");
 | |
| 
 | |
| 		if (pFunc && PyCallable_Check(pFunc)) {
 | |
| 			// Create arguments tuple (fd, request, arg, ret)
 | |
| 			pArgs = PyTuple_Pack(4,
 | |
| 													 PyLong_FromLong(fd),
 | |
| 													 PyLong_FromUnsignedLong(request),
 | |
| 													 PyLong_FromVoidPtr(arg),
 | |
| 													 PyLong_FromLong(ret));
 | |
| 			pValue = PyObject_CallObject(pFunc, pArgs);
 | |
| 			Py_DECREF(pArgs);
 | |
| 
 | |
| 			if (pValue != NULL) {
 | |
| 				Py_DECREF(pValue);
 | |
| 			} else {
 | |
| 				PyErr_Print();  // Print Python error if call fails
 | |
| 			}
 | |
| 			Py_DECREF(pFunc);
 | |
| 		} else {
 | |
| 			if (PyErr_Occurred()) PyErr_Print();
 | |
| 			fprintf(stderr, "Cannot find function 'handle_ioctl'\n");
 | |
| 		}
 | |
| 		Py_DECREF(pModule);
 | |
| 	} else {
 | |
| 			PyErr_Print();
 | |
| 		fprintf(stderr, "Failed to load 'extra.dsp.hook'\n");
 | |
| 	}
 | |
| 
 | |
| 	// Release the GIL
 | |
| 	//PyGILState_Release(gstate);
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| 
 |