35 lines
		
	
	
		
			600 B
		
	
	
	
		
			C
		
	
	
		
		
			
		
	
	
			35 lines
		
	
	
		
			600 B
		
	
	
	
		
			C
		
	
	
| 
								 | 
							
								#include "master.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* From SBCL */
							 | 
						||
| 
								 | 
							
								const char *vm_executable_path(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									char path[PATH_MAX + 1];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (getosreldate() >= 600024)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										/* KERN_PROC_PATHNAME is available */
							 | 
						||
| 
								 | 
							
										size_t len = PATH_MAX + 1;
							 | 
						||
| 
								 | 
							
										int mib[4];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										mib[0] = CTL_KERN;
							 | 
						||
| 
								 | 
							
										mib[1] = KERN_PROC;
							 | 
						||
| 
								 | 
							
										mib[2] = KERN_PROC_PATHNAME;
							 | 
						||
| 
								 | 
							
										mib[3] = -1;
							 | 
						||
| 
								 | 
							
										if (sysctl(mib, 4, &path, &len, NULL, 0) != 0)
							 | 
						||
| 
								 | 
							
											return NULL;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										int size;
							 | 
						||
| 
								 | 
							
										size = readlink("/proc/curproc/file", path, sizeof(path) - 1);
							 | 
						||
| 
								 | 
							
										if (size < 0)
							 | 
						||
| 
								 | 
							
											return NULL;
							 | 
						||
| 
								 | 
							
										path[size] = '\0';
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if(strcmp(path, "unknown") == 0)
							 | 
						||
| 
								 | 
							
										return NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return safe_strdup(path);
							 | 
						||
| 
								 | 
							
								}
							 |