/
udev-search.c
126 lines (105 loc) · 3.14 KB
/
udev-search.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/**
@file udev-search.c
This is a basic utility to check for potential
viable paths to use for usb_moded.
This is in case usb_moded can not figure it out for itself.
compile with gcc -o udev-search udev-search.c -ludev
Copyright (C) 2014 Jolla. All rights reserved.
@author: Philippe De Swert <philippe.deswert@jollamobile.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the Lesser GNU General Public License
version 2 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the Lesser GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <unistd.h>
#include <string.h>
#include <poll.h>
#include <libudev.h>
static int check_device_is_usb_power_supply(const char *syspath)
{
struct udev *udev;
struct udev_device *dev = 0;
const char *udev_name, *property;
int score = 0;
udev = udev_new();
dev = udev_device_new_from_syspath(udev, syspath);
if(!dev)
return 0;
udev_name = udev_device_get_sysname(dev);
printf("device name = %s\n", udev_name);
/* check it is no battery */
if(strstr(udev_name, "battery") ||
strstr(udev_name, "BAT"))
return 0;
if(strstr(udev_name, "usb"))
score = score + 10;
if(strstr(udev_name, "charger"))
score = score + 5;
if(udev_device_get_property_value(dev, "POWER_SUPPLY_PRESENT"))
{
score = score + 5;
printf("present property found\n");
}
if(udev_device_get_property_value(dev, "POWER_SUPPLY_ONLINE"))
{
score = score + 10;
printf("online property found\n");
}
if(udev_device_get_property_value(dev, "POWER_SUPPLY_TYPE"))
{
score = score + 10;
printf("type property found\n");
}
return(score);
}
void main (void)
{
struct udev *udev;
struct udev_device *dev;
struct udev_enumerate *list;
struct udev_list_entry *list_entry, *first_entry;
const char *udev_name;
int ret = 0, score = 0;
typedef struct power_device {
const char *syspath;
int score;
} power_device;
struct power_device power_dev;
power_dev.score = 0;
udev = udev_new();
list = udev_enumerate_new(udev);
ret = udev_enumerate_add_match_subsystem(list, "power_supply");
ret = udev_enumerate_scan_devices(list);
if(ret < 0)
{
printf("List empty\n");
exit(1);
}
first_entry = udev_enumerate_get_list_entry(list);
udev_list_entry_foreach(list_entry, first_entry)
{
udev_name = udev_list_entry_get_name(list_entry);
score = check_device_is_usb_power_supply(udev_name);
printf("power_supply device name = %s score = %d\n", udev_name, score);
if(score)
{
if(score > power_dev.score)
{
power_dev.score = score;
power_dev.syspath = udev_name;
}
}
}
printf("most likely power supply device = %s\n", power_dev.syspath);
exit(0);
}