udev-search.c 3.92 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 33 34

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <unistd.h>
35
#include <string.h>
36 37 38 39 40

#include <poll.h>

#include <libudev.h>

41 42 43 44 45 46 47 48 49 50 51 52
/* ========================================================================= *
 * Protorypes
 * ========================================================================= */

/* -- check -- */

static int check_device_is_usb_power_supply(const char *syspath);

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

53 54
static int check_device_is_usb_power_supply(const char *syspath)
{
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
    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");
    }

    return(score);
91
}
92

93
int main (int argc, char **argv)
94
{
95 96 97 98 99 100 101 102 103 104 105
    (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;

    typedef struct power_device {
        const char *syspath;
106
        int score;
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
    } 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)
124
    {
125 126 127 128 129 130 131 132 133 134
        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;
            }
135 136 137
        }
    }

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

140
    exit(0);
141
}