64 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#include <errno.h>
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								#include <stdbool.h>
							 | 
						||
| 
								 | 
							
								#include <sys/vfs.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "findfs.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* verify that a mountpoint is actually the type we want */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int valid_mountpoint(const char *mount, long magic)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									struct statfs st_fs;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (statfs(mount, &st_fs) < 0)
							 | 
						||
| 
								 | 
							
										return -ENOENT;
							 | 
						||
| 
								 | 
							
									else if ((long)st_fs.f_type != magic)
							 | 
						||
| 
								 | 
							
										return -ENOENT;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* find the path to a mounted file system */
							 | 
						||
| 
								 | 
							
								const char *find_mountpoint(const char *fstype, long magic,
							 | 
						||
| 
								 | 
							
											    char *mountpoint, int len,
							 | 
						||
| 
								 | 
							
											    const char * const *known_mountpoints)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									const char * const *ptr;
							 | 
						||
| 
								 | 
							
									char format[128];
							 | 
						||
| 
								 | 
							
									char type[100];
							 | 
						||
| 
								 | 
							
									FILE *fp;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (known_mountpoints) {
							 | 
						||
| 
								 | 
							
										ptr = known_mountpoints;
							 | 
						||
| 
								 | 
							
										while (*ptr) {
							 | 
						||
| 
								 | 
							
											if (valid_mountpoint(*ptr, magic) == 0) {
							 | 
						||
| 
								 | 
							
												strncpy(mountpoint, *ptr, len - 1);
							 | 
						||
| 
								 | 
							
												mountpoint[len-1] = 0;
							 | 
						||
| 
								 | 
							
												return mountpoint;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											ptr++;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* give up and parse /proc/mounts */
							 | 
						||
| 
								 | 
							
									fp = fopen("/proc/mounts", "r");
							 | 
						||
| 
								 | 
							
									if (fp == NULL)
							 | 
						||
| 
								 | 
							
										return NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									snprintf(format, 128, "%%*s %%%ds %%99s %%*s %%*d %%*d\n", len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									while (fscanf(fp, format, mountpoint, type) == 2) {
							 | 
						||
| 
								 | 
							
										if (strcmp(type, fstype) == 0)
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									fclose(fp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (strcmp(type, fstype) != 0)
							 | 
						||
| 
								 | 
							
										return NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return mountpoint;
							 | 
						||
| 
								 | 
							
								}
							 |