00001 #include "common.h"
00002 #include <unistd.h>
00003 #include <stdlib.h>
00004 #include <stdio.h>
00005 #include <string.h>
00006
00007 static void usage(void)
00008 {
00009 fprintf(stderr, "usage: hotplug [-h -u -a\"ACTION\"]\n");
00010 fprintf(stderr, " -u: use udev syntax\n");
00011 fprintf(stderr, " -a\"ACTION\": perform udev action ACTION on attachment\n");
00012 exit(1);
00013 }
00014
00015 int main (int argc, char **argv)
00016 {
00017 LIBMTP_device_entry_t *entries;
00018 int numentries;
00019 int i;
00020 int ret;
00021 int udev_style = 0;
00022 int opt;
00023 extern int optind;
00024 extern char *optarg;
00025 char *udev_action = NULL;
00026 char default_udev_action[] = "SYMLINK+=\"libmtp-%k\", MODE=\"666\"";
00027
00028 while ( (opt = getopt(argc, argv, "ua:")) != -1 ) {
00029 switch (opt) {
00030 case 'a':
00031 udev_action = strdup(optarg);
00032 case 'u':
00033 udev_style = 1;
00034 break;
00035 default:
00036 usage();
00037 }
00038 }
00039
00040 LIBMTP_Init();
00041 ret = LIBMTP_Get_Supported_Devices_List(&entries, &numentries);
00042 if (ret == 0) {
00043 if (udev_style) {
00044 printf("# UDEV-style hotplug map for libmtp\n");
00045 printf("# Put this file in /etc/udev/rules.d\n\n");
00046 printf("SUBSYSTEM!=\"usb_device\", ACTION!=\"add\", GOTO=\"libmtp_rules_end\"\n\n");
00047 } else {
00048 printf("# This usermap will call the script \"libmtp.sh\" whenever a known MTP device is attached.\n\n");
00049 }
00050
00051 for (i = 0; i < numentries; i++) {
00052 LIBMTP_device_entry_t * entry = &entries[i];
00053
00054 printf("# %s\n", entry->name);
00055 if (udev_style) {
00056 char *action;
00057
00058 if (udev_action != NULL) {
00059 action = udev_action;
00060 } else {
00061 action = default_udev_action;
00062 }
00063 printf("SYSFS{idVendor}==\"%04x\", SYSFS{idProduct}==\"%04x\", %s\n", entry->vendor_id, entry->product_id, action);
00064 } else {
00065 printf("libmtp.sh 0x0003 0x%04x 0x%04x 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000\n", entry->vendor_id, entry->product_id);
00066 }
00067 }
00068 } else {
00069 printf("Error.\n");
00070 exit(1);
00071 }
00072
00073 if (udev_style) {
00074 printf("\nLABEL=\"libmtp_rules_end\"\n");
00075 }
00076
00077 exit (0);
00078 }