udev-search.c 3.86 KB
Newer Older
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
 * @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-2018 Jolla. All rights reserved.
 *
 * @author: Philippe De Swert <philippe.deswert@jollamobile.com>
 * @author: Simo Piiroinen <simo.piiroinen@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
 */
30 31 32

#include <stdio.h>
#include <stdlib.h>
33
#include <string.h>
34 35 36

#include <libudev.h>

37 38 39 40 41 42 43 44 45 46 47 48
/* ========================================================================= *
 * Protorypes
 * ========================================================================= */

/* -- check -- */

static int check_device_is_usb_power_supply(const char *syspath);

/* ========================================================================= *
 * Functions
 * ========================================================================= */

49 50
static int check_device_is_usb_power_supply(const char *syspath)
{
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
    struct udev *udev;
    struct udev_device *dev = 0;
    const char *udev_name;
    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");
    }

86
    return score;
87
}
88

89
int main (int argc, char **argv)
90
{
91 92 93 94 95 96 97 98 99
    (void)argc;
    (void)argv;

    struct udev *udev;
    struct udev_enumerate *list;
    struct udev_list_entry *list_entry, *first_entry;
    const char *udev_name;
    int ret = 0, score = 0;

100
    typedef struct power_device_t {
101
        const char *syspath;
102
        int score;
103
    } power_device_t;
104

105
    power_device_t power_dev;
106 107 108 109 110 111 112 113 114 115 116 117 118 119

    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)
120
    {
121 122 123 124 125 126 127 128 129 130
        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;
            }
131 132 133
        }
    }

134
    printf("most likely power supply device = %s\n", power_dev.syspath);
135

136
    exit(0);
137
}