mirror of
https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
synced 2025-11-01 00:28:51 +01:00
Fixed MTP to work with TWRP
This commit is contained in:
commit
f6dfaef42e
50820 changed files with 20846062 additions and 0 deletions
100
tools/lib/api/fs/debugfs.c
Normal file
100
tools/lib/api/fs/debugfs.c
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <sys/vfs.h>
|
||||
#include <sys/mount.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include "debugfs.h"
|
||||
|
||||
char debugfs_mountpoint[PATH_MAX + 1] = "/sys/kernel/debug";
|
||||
|
||||
static const char * const debugfs_known_mountpoints[] = {
|
||||
"/sys/kernel/debug",
|
||||
"/debug",
|
||||
0,
|
||||
};
|
||||
|
||||
static bool debugfs_found;
|
||||
|
||||
/* find the path to the mounted debugfs */
|
||||
const char *debugfs_find_mountpoint(void)
|
||||
{
|
||||
const char * const *ptr;
|
||||
char type[100];
|
||||
FILE *fp;
|
||||
|
||||
if (debugfs_found)
|
||||
return (const char *)debugfs_mountpoint;
|
||||
|
||||
ptr = debugfs_known_mountpoints;
|
||||
while (*ptr) {
|
||||
if (debugfs_valid_mountpoint(*ptr) == 0) {
|
||||
debugfs_found = true;
|
||||
strcpy(debugfs_mountpoint, *ptr);
|
||||
return debugfs_mountpoint;
|
||||
}
|
||||
ptr++;
|
||||
}
|
||||
|
||||
/* give up and parse /proc/mounts */
|
||||
fp = fopen("/proc/mounts", "r");
|
||||
if (fp == NULL)
|
||||
return NULL;
|
||||
|
||||
while (fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n",
|
||||
debugfs_mountpoint, type) == 2) {
|
||||
if (strcmp(type, "debugfs") == 0)
|
||||
break;
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
if (strcmp(type, "debugfs") != 0)
|
||||
return NULL;
|
||||
|
||||
debugfs_found = true;
|
||||
|
||||
return debugfs_mountpoint;
|
||||
}
|
||||
|
||||
/* verify that a mountpoint is actually a debugfs instance */
|
||||
|
||||
int debugfs_valid_mountpoint(const char *debugfs)
|
||||
{
|
||||
struct statfs st_fs;
|
||||
|
||||
if (statfs(debugfs, &st_fs) < 0)
|
||||
return -ENOENT;
|
||||
else if (st_fs.f_type != (long) DEBUGFS_MAGIC)
|
||||
return -ENOENT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* mount the debugfs somewhere if it's not mounted */
|
||||
char *debugfs_mount(const char *mountpoint)
|
||||
{
|
||||
/* see if it's already mounted */
|
||||
if (debugfs_find_mountpoint())
|
||||
goto out;
|
||||
|
||||
/* if not mounted and no argument */
|
||||
if (mountpoint == NULL) {
|
||||
/* see if environment variable set */
|
||||
mountpoint = getenv(PERF_DEBUGFS_ENVIRONMENT);
|
||||
/* if no environment variable, use default */
|
||||
if (mountpoint == NULL)
|
||||
mountpoint = "/sys/kernel/debug";
|
||||
}
|
||||
|
||||
if (mount(NULL, mountpoint, "debugfs", 0, NULL) < 0)
|
||||
return NULL;
|
||||
|
||||
/* save the mountpoint */
|
||||
debugfs_found = true;
|
||||
strncpy(debugfs_mountpoint, mountpoint, sizeof(debugfs_mountpoint));
|
||||
out:
|
||||
return debugfs_mountpoint;
|
||||
}
|
||||
29
tools/lib/api/fs/debugfs.h
Normal file
29
tools/lib/api/fs/debugfs.h
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
#ifndef __API_DEBUGFS_H__
|
||||
#define __API_DEBUGFS_H__
|
||||
|
||||
#define _STR(x) #x
|
||||
#define STR(x) _STR(x)
|
||||
|
||||
/*
|
||||
* On most systems <limits.h> would have given us this, but not on some systems
|
||||
* (e.g. GNU/Hurd).
|
||||
*/
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX 4096
|
||||
#endif
|
||||
|
||||
#ifndef DEBUGFS_MAGIC
|
||||
#define DEBUGFS_MAGIC 0x64626720
|
||||
#endif
|
||||
|
||||
#ifndef PERF_DEBUGFS_ENVIRONMENT
|
||||
#define PERF_DEBUGFS_ENVIRONMENT "PERF_DEBUGFS_DIR"
|
||||
#endif
|
||||
|
||||
const char *debugfs_find_mountpoint(void);
|
||||
int debugfs_valid_mountpoint(const char *debugfs);
|
||||
char *debugfs_mount(const char *mountpoint);
|
||||
|
||||
extern char debugfs_mountpoint[];
|
||||
|
||||
#endif /* __API_DEBUGFS_H__ */
|
||||
165
tools/lib/api/fs/fs.c
Normal file
165
tools/lib/api/fs/fs.c
Normal file
|
|
@ -0,0 +1,165 @@
|
|||
/* TODO merge/factor in debugfs.c here */
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/vfs.h>
|
||||
|
||||
#include "debugfs.h"
|
||||
#include "fs.h"
|
||||
|
||||
static const char * const sysfs__fs_known_mountpoints[] = {
|
||||
"/sys",
|
||||
0,
|
||||
};
|
||||
|
||||
static const char * const procfs__known_mountpoints[] = {
|
||||
"/proc",
|
||||
0,
|
||||
};
|
||||
|
||||
struct fs {
|
||||
const char *name;
|
||||
const char * const *mounts;
|
||||
char path[PATH_MAX + 1];
|
||||
bool found;
|
||||
long magic;
|
||||
};
|
||||
|
||||
enum {
|
||||
FS__SYSFS = 0,
|
||||
FS__PROCFS = 1,
|
||||
};
|
||||
|
||||
static struct fs fs__entries[] = {
|
||||
[FS__SYSFS] = {
|
||||
.name = "sysfs",
|
||||
.mounts = sysfs__fs_known_mountpoints,
|
||||
.magic = SYSFS_MAGIC,
|
||||
},
|
||||
[FS__PROCFS] = {
|
||||
.name = "proc",
|
||||
.mounts = procfs__known_mountpoints,
|
||||
.magic = PROC_SUPER_MAGIC,
|
||||
},
|
||||
};
|
||||
|
||||
static bool fs__read_mounts(struct fs *fs)
|
||||
{
|
||||
bool found = false;
|
||||
char type[100];
|
||||
FILE *fp;
|
||||
|
||||
fp = fopen("/proc/mounts", "r");
|
||||
if (fp == NULL)
|
||||
return NULL;
|
||||
|
||||
while (!found &&
|
||||
fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n",
|
||||
fs->path, type) == 2) {
|
||||
|
||||
if (strcmp(type, fs->name) == 0)
|
||||
found = true;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
return fs->found = found;
|
||||
}
|
||||
|
||||
static int fs__valid_mount(const char *fs, long magic)
|
||||
{
|
||||
struct statfs st_fs;
|
||||
|
||||
if (statfs(fs, &st_fs) < 0)
|
||||
return -ENOENT;
|
||||
else if (st_fs.f_type != magic)
|
||||
return -ENOENT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool fs__check_mounts(struct fs *fs)
|
||||
{
|
||||
const char * const *ptr;
|
||||
|
||||
ptr = fs->mounts;
|
||||
while (*ptr) {
|
||||
if (fs__valid_mount(*ptr, fs->magic) == 0) {
|
||||
fs->found = true;
|
||||
strcpy(fs->path, *ptr);
|
||||
return true;
|
||||
}
|
||||
ptr++;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void mem_toupper(char *f, size_t len)
|
||||
{
|
||||
while (len) {
|
||||
*f = toupper(*f);
|
||||
f++;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for "NAME_PATH" environment variable to override fs location (for
|
||||
* testing). This matches the recommendation in Documentation/sysfs-rules.txt
|
||||
* for SYSFS_PATH.
|
||||
*/
|
||||
static bool fs__env_override(struct fs *fs)
|
||||
{
|
||||
char *override_path;
|
||||
size_t name_len = strlen(fs->name);
|
||||
/* name + "_PATH" + '\0' */
|
||||
char upper_name[name_len + 5 + 1];
|
||||
memcpy(upper_name, fs->name, name_len);
|
||||
mem_toupper(upper_name, name_len);
|
||||
strcpy(&upper_name[name_len], "_PATH");
|
||||
|
||||
override_path = getenv(upper_name);
|
||||
if (!override_path)
|
||||
return false;
|
||||
|
||||
fs->found = true;
|
||||
strncpy(fs->path, override_path, sizeof(fs->path));
|
||||
return true;
|
||||
}
|
||||
|
||||
static const char *fs__get_mountpoint(struct fs *fs)
|
||||
{
|
||||
if (fs__env_override(fs))
|
||||
return fs->path;
|
||||
|
||||
if (fs__check_mounts(fs))
|
||||
return fs->path;
|
||||
|
||||
if (fs__read_mounts(fs))
|
||||
return fs->path;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const char *fs__mountpoint(int idx)
|
||||
{
|
||||
struct fs *fs = &fs__entries[idx];
|
||||
|
||||
if (fs->found)
|
||||
return (const char *)fs->path;
|
||||
|
||||
return fs__get_mountpoint(fs);
|
||||
}
|
||||
|
||||
#define FS__MOUNTPOINT(name, idx) \
|
||||
const char *name##__mountpoint(void) \
|
||||
{ \
|
||||
return fs__mountpoint(idx); \
|
||||
}
|
||||
|
||||
FS__MOUNTPOINT(sysfs, FS__SYSFS);
|
||||
FS__MOUNTPOINT(procfs, FS__PROCFS);
|
||||
14
tools/lib/api/fs/fs.h
Normal file
14
tools/lib/api/fs/fs.h
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
#ifndef __API_FS__
|
||||
#define __API_FS__
|
||||
|
||||
#ifndef SYSFS_MAGIC
|
||||
#define SYSFS_MAGIC 0x62656572
|
||||
#endif
|
||||
|
||||
#ifndef PROC_SUPER_MAGIC
|
||||
#define PROC_SUPER_MAGIC 0x9fa0
|
||||
#endif
|
||||
|
||||
const char *sysfs__mountpoint(void);
|
||||
const char *procfs__mountpoint(void);
|
||||
#endif /* __API_FS__ */
|
||||
Loading…
Add table
Add a link
Reference in a new issue