mirror of
https://github.com/systemd/systemd.git
synced 2025-03-22 06:50:18 +03:00
delete mobile-action-modeswitch which has moved to usb_modeswitch
This commit is contained in:
parent
f59e9fbb18
commit
6297c2d4e4
2
INSTALL
2
INSTALL
@ -43,8 +43,6 @@ All options:
|
||||
Enable legacy floppy support.
|
||||
--enable-edd
|
||||
Enable disk edd support.
|
||||
--enable-action_modeswitch
|
||||
Enable action modeswitch support.
|
||||
|
||||
The options used in a RPM spec file usually look like:
|
||||
%configure \
|
||||
|
17
Makefile.am
17
Makefile.am
@ -636,23 +636,6 @@ libexec_PROGRAMS += extras/edd_id/edd_id
|
||||
dist_udevrules_DATA += extras/edd_id/61-persistent-storage-edd.rules
|
||||
endif
|
||||
|
||||
if ENABLE_ACTION_MODESWITCH
|
||||
# ------------------------------------------------------------------------------
|
||||
# mobile-action-modeswitch - switch Mobile Action cables into serial mode
|
||||
# ------------------------------------------------------------------------------
|
||||
extras_mobile_action_modeswitch_mobile_action_modeswitch_SOURCES =\
|
||||
extras/mobile-action-modeswitch/mobile-action-modeswitch.c \
|
||||
extras/mobile-action-modeswitch/utils.c \
|
||||
extras/mobile-action-modeswitch/utils.h \
|
||||
extras/mobile-action-modeswitch/ma8280p_us.c \
|
||||
extras/mobile-action-modeswitch/ma8280p_us.h
|
||||
extras_mobile_action_modeswitch_mobile_action_modeswitch_CPPFLAGS = $(AM_CPPFLAGS) $(LIBUSB_CFLAGS)
|
||||
extras_mobile_action_modeswitch_mobile_action_modeswitch_LDADD = libudev/libudev-private.la $(LIBUSB_LIBS)
|
||||
dist_udevrules_DATA += \
|
||||
extras/mobile-action-modeswitch/61-mobile-action.rules
|
||||
libexec_PROGRAMS += extras/mobile-action-modeswitch/mobile-action-modeswitch
|
||||
endif
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# install, uninstall, clean hooks
|
||||
# ------------------------------------------------------------------------------
|
||||
|
3
TODO
3
TODO
@ -17,9 +17,6 @@
|
||||
udevd -> --libexecdir
|
||||
udevadm -> --bindir
|
||||
|
||||
- delete mobile-action-modeswitch
|
||||
(moved to usb_modeswitch)
|
||||
|
||||
- /run/udev/control socket
|
||||
(add ConditionVirtualization=!pidns)
|
||||
|
||||
|
12
configure.ac
12
configure.ac
@ -199,17 +199,6 @@ AC_ARG_ENABLE([edd],
|
||||
[], [enable_edd=no])
|
||||
AM_CONDITIONAL([ENABLE_EDD], [test "x$enable_edd" = xyes])
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# mobile-action-modeswitch - switch Mobile Action cables into serial mode
|
||||
# ------------------------------------------------------------------------------
|
||||
AC_ARG_ENABLE([action_modeswitch],
|
||||
AS_HELP_STRING([--enable-action_modeswitch], [enable action modeswitch support]),
|
||||
[], [enable_action_modeswitch=no])
|
||||
if test "x$enable_action_modeswitch" = xyes; then
|
||||
PKG_CHECK_MODULES(LIBUSB, libusb >= 0.1.12)
|
||||
fi
|
||||
AM_CONDITIONAL([ENABLE_ACTION_MODESWITCH], [test "x$enable_action_modeswitch" = xyes])
|
||||
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
@ -261,7 +250,6 @@ AC_MSG_RESULT([
|
||||
keymap: ${enable_keymap}
|
||||
floppy: ${enable_floppy}
|
||||
edd: ${enable_edd}
|
||||
action_modeswitch: ${enable_action_modeswitch}
|
||||
|
||||
usb.ids: ${USB_DATABASE}
|
||||
pci.ids: ${PCI_DATABASE}
|
||||
|
1
extras/mobile-action-modeswitch/.gitignore
vendored
1
extras/mobile-action-modeswitch/.gitignore
vendored
@ -1 +0,0 @@
|
||||
mobile-action-modeswitch
|
@ -1,15 +0,0 @@
|
||||
ACTION!="add", GOTO="mobile_action_end"
|
||||
|
||||
# ATTENTION: DO NOT USE THIS FILE FOR ANYTHING EXCEPT
|
||||
# MOBILE ACTION CABLES. DO NOT USE IT FOR 3G DEVICES!
|
||||
|
||||
SUBSYSTEM=="usb", ATTR{bDeviceClass}=="00|ff", ATTR{bDeviceSubClass}=="00|ff", ENV{DEVTYPE}=="usb_device", GOTO="mobile_action_switch"
|
||||
GOTO="mobile_action_end"
|
||||
|
||||
LABEL="mobile_action_switch"
|
||||
|
||||
# Mobile Action cables like the 8280p and 8230p
|
||||
ATTRS{idVendor}=="0df7", ATTRS{idProduct}=="0800", RUN+="mobile-action-modeswitch -v 0x%s{idVendor} -p 0x%s{idProduct} -t mobile-action-8280p"
|
||||
|
||||
LABEL="mobile_action_end"
|
||||
|
@ -1,462 +0,0 @@
|
||||
/* http://www.natox.be/ma8280p/
|
||||
* http://www.leopold.dk/~martin/ma-8230p.html
|
||||
* http://figvam.blogspot.com/2007/01/mobile-action-8730p-usb-cable-and-linux.html
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Code by davy hollevoet. This is simply an adaptation of code
|
||||
* generated by usbsnoop2libusb. (http://iki.fi/lindi/usb/usbsnoop2libusb.pl)
|
||||
*
|
||||
* This code is released under both the GPL version 2 and BSD licenses.
|
||||
* Either license may be used.
|
||||
*
|
||||
* GPLv2
|
||||
* ********
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* In addition:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* BSD
|
||||
* ******
|
||||
* Copyright (c) 1998, Regents of the University of California
|
||||
* All rights reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the University of California, Berkeley nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
/* This file is (mostly) generated with usbsnoop2libusb.pl from a usbsnoop log file. */
|
||||
/* Latest version of the script should be in http://iki.fi/lindi/usb/usbsnoop2libusb.pl */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <signal.h>
|
||||
#include <ctype.h>
|
||||
#include <time.h>
|
||||
#include <usb.h>
|
||||
|
||||
#include "utils.h"
|
||||
#include "ma8280p_us.h"
|
||||
|
||||
static void msleep(long msec)
|
||||
{
|
||||
struct timespec duration = { 0, msec * 1000 * 1000 };
|
||||
|
||||
nanosleep(&duration, NULL);
|
||||
}
|
||||
|
||||
int ma8280p_switch (struct usb_dev_handle *devh, struct usb_device *dev)
|
||||
{
|
||||
int ret = 1;
|
||||
char *buf = NULL;
|
||||
|
||||
buf = malloc (65535);
|
||||
if (!buf) {
|
||||
error ("%s: not enough memory", dev->filename, ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
usb_get_descriptor(devh, 0x0000001, 0x0000000, buf, 0x0000012);
|
||||
msleep(6);
|
||||
usb_get_descriptor(devh, 0x0000001, 0x0000000, buf, 0x0000012);
|
||||
msleep(6);
|
||||
usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000400);
|
||||
msleep(10);
|
||||
ret = usb_release_interface(devh, 0);
|
||||
if (ret != 0)
|
||||
debug ("%s: failed to release interface before set_configuration: %d", dev->filename, ret);
|
||||
usb_set_configuration(devh, 0x0000001);
|
||||
ret = usb_claim_interface(devh, 0);
|
||||
if (ret != 0)
|
||||
debug ("%s: claim after set_configuration failed with error %d", dev->filename, ret);
|
||||
//usb_set_altinterface(devh, 0);
|
||||
//msleep(33);
|
||||
usb_control_msg(devh, USB_TYPE_CLASS + USB_RECIP_INTERFACE + USB_ENDPOINT_IN, 0x0000001, 0x0000300, 0x0000000, buf, 0x0000008, 1000);
|
||||
msleep(5);
|
||||
memcpy(buf, "\xb0\x04\x00\x00\x02\x90\x26\x86", 0x0000008);
|
||||
usb_control_msg(devh, USB_TYPE_CLASS + USB_RECIP_INTERFACE, 0x0000009, 0x0000300, 0x0000000, buf, 0x0000008, 1000);
|
||||
msleep(4);
|
||||
memcpy(buf, "\xb0\x04\x00\x00\x02\x90\x26\x86", 0x0000008);
|
||||
usb_control_msg(devh, USB_TYPE_CLASS + USB_RECIP_INTERFACE, 0x0000009, 0x0000300, 0x0000000, buf, 0x0000008, 1000);
|
||||
msleep(4);
|
||||
|
||||
msleep(4);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(6);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(1);
|
||||
//URB_FUNCTION_GET_STATUS_FROM_ENDPOINT skipped
|
||||
msleep(4);
|
||||
memcpy(buf, "\x37\x01\xfe\xdb\xc1\x33\x1f\x83", 0x0000008);
|
||||
usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
|
||||
msleep(3);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(1);
|
||||
memcpy(buf, "\x37\x0e\xb5\x9d\x3b\x8a\x91\x51", 0x0000008);
|
||||
usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
|
||||
msleep(7);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(1);
|
||||
memcpy(buf, "\x34\x87\xba\x0d\xfc\x8a\x91\x51", 0x0000008);
|
||||
usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
|
||||
msleep(7);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(2);
|
||||
//URB_FUNCTION_GET_STATUS_FROM_ENDPOINT skipped
|
||||
msleep(4);
|
||||
memcpy(buf, "\x37\x01\xfe\xdb\xc1\x33\x1f\x83", 0x0000008);
|
||||
usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
|
||||
msleep(2);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(1);
|
||||
memcpy(buf, "\x37\x0e\xb5\x9d\x3b\x8a\x91\x51", 0x0000008);
|
||||
usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
|
||||
msleep(7);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(1);
|
||||
memcpy(buf, "\x34\x87\xba\x0d\xfc\x8a\x91\x51", 0x0000008);
|
||||
usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
|
||||
msleep(7);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(8);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(1);
|
||||
//URB_FUNCTION_GET_STATUS_FROM_ENDPOINT skipped
|
||||
msleep(4);
|
||||
memcpy(buf, "\x33\x04\xfe\x00\xf4\x6c\x1f\xf0", 0x0000008);
|
||||
usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
|
||||
msleep(3);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
msleep(1);
|
||||
//URB_FUNCTION_GET_STATUS_FROM_ENDPOINT skipped
|
||||
msleep(4);
|
||||
memcpy(buf, "\x32\x07\xfe\xf0\x29\xb9\x3a\xf0", 0x0000008);
|
||||
usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
|
||||
msleep(3);
|
||||
usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
|
||||
|
||||
if (buf)
|
||||
free (buf);
|
||||
return 0;
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
/*
|
||||
* Modem mode switcher
|
||||
*
|
||||
* Copyright (C) 2009 Dan Williams <dcbw@redhat.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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:
|
||||
*/
|
||||
|
||||
#ifndef __MA8280P_H__
|
||||
#define __MA8280P_H__
|
||||
|
||||
#include <usb.h>
|
||||
|
||||
int ma8280p_switch (struct usb_dev_handle *devh, struct usb_device *dev);
|
||||
|
||||
#endif /* __MA8280P_H__ */
|
@ -1,262 +0,0 @@
|
||||
/*
|
||||
* Mobile action cable mode switcher
|
||||
*
|
||||
* Copyright (C) 2008 - 2010 Dan Williams <dcbw@redhat.com>
|
||||
* Copyright (C) 2008 Peter Henn <support@option.com>
|
||||
*
|
||||
* Heavily based on the 'ozerocdoff' tool by Peter Henn.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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:
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <stdarg.h>
|
||||
#include <getopt.h>
|
||||
|
||||
#include <usb.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
#include "ma8280p_us.h"
|
||||
|
||||
struct usb_dev_handle *handle = NULL;
|
||||
|
||||
typedef struct usb_device * (*FindFunc) (int vid, int pid);
|
||||
typedef int (*SwitchFunc) (struct usb_dev_handle *dh, struct usb_device *dev);
|
||||
|
||||
typedef enum {
|
||||
ST_UNKNOWN = 0,
|
||||
ST_MA8280P
|
||||
} SwitchType;
|
||||
|
||||
typedef struct SwitchEntry {
|
||||
SwitchType st;
|
||||
const char *clopt;
|
||||
FindFunc find_func;
|
||||
SwitchFunc switch_func;
|
||||
} SwitchEntry;
|
||||
|
||||
static SwitchEntry switch_types[] = {
|
||||
{ ST_MA8280P, "mobile-action-8280p", NULL, ma8280p_switch },
|
||||
{ ST_UNKNOWN, NULL, NULL }
|
||||
};
|
||||
|
||||
static struct usb_device *
|
||||
generic_find (int vid, int pid)
|
||||
{
|
||||
struct usb_bus *bus;
|
||||
struct usb_device *dev;
|
||||
|
||||
for (bus = usb_get_busses(); bus; bus = bus->next) {
|
||||
for (dev = bus->devices; dev; dev = dev->next) {
|
||||
if (dev->descriptor.idVendor == vid && dev->descriptor.idProduct == pid) {
|
||||
debug ("Found device '%s'", dev->filename);
|
||||
return dev;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
release_usb_device (int param)
|
||||
{
|
||||
usb_release_interface (handle, 0);
|
||||
usb_close (handle);
|
||||
}
|
||||
|
||||
static void
|
||||
print_usage (void)
|
||||
{
|
||||
printf ("Usage: mobile-action-modeswitch [-hdq] [-l <file>] -v <vendor-id> -p <product-id> -t <type>\n"
|
||||
" -h, --help show this help message\n"
|
||||
" -v, --vendor <n> target USB vendor ID\n"
|
||||
" -p, --product <n> target USB product ID\n"
|
||||
" -t, --type <type> type of switch to attempt, varies by device:\n"
|
||||
" mobile-action-8280p - For Mobile Action 8xxxP USB cables\n"
|
||||
" -l, --log <file> log output to a file\n"
|
||||
" -q, --quiet don't print anything to stdout\n"
|
||||
" -d, --debug display debugging messages\n\n"
|
||||
"Examples:\n"
|
||||
" mobile-action-modeswitch -v 0x0df7 -p 0x8000 -t mobile-action-8280p\n");
|
||||
}
|
||||
|
||||
static SwitchEntry *
|
||||
parse_type (const char *s)
|
||||
{
|
||||
SwitchEntry *entry = &switch_types[0];
|
||||
|
||||
while (entry->clopt) {
|
||||
if (!strcmp (entry->clopt, s))
|
||||
return entry;
|
||||
entry++;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
do_exit (int val)
|
||||
{
|
||||
log_shutdown ();
|
||||
exit (val);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
static struct option options[] = {
|
||||
{ "help", no_argument, NULL, 'h' },
|
||||
{ "vendor", required_argument, NULL, 'v' },
|
||||
{ "product", required_argument, NULL, 'p' },
|
||||
{ "type", required_argument, NULL, 't' },
|
||||
{ "log", required_argument, NULL, 'l' },
|
||||
{ "debug", no_argument, NULL, 'd' },
|
||||
{ "quiet", no_argument, NULL, 'q' },
|
||||
{ NULL, 0, NULL, 0}
|
||||
};
|
||||
|
||||
struct usb_device *dev;
|
||||
int vid = 0, pid = 0;
|
||||
const char *logpath = NULL;
|
||||
char buffer[256];
|
||||
int ret, quiet = 0, debug = 0;
|
||||
SwitchEntry *sentry = NULL;
|
||||
|
||||
while (1) {
|
||||
int option;
|
||||
|
||||
option = getopt_long(argc, argv, "hv:p:l:t:dq", options, NULL);
|
||||
if (option == -1)
|
||||
break;
|
||||
|
||||
switch (option) {
|
||||
case 'v':
|
||||
vid = strtol (optarg, NULL, 0);
|
||||
break;
|
||||
case 'p':
|
||||
pid = strtol (optarg, NULL, 0);
|
||||
break;
|
||||
case 't':
|
||||
sentry = parse_type (optarg);
|
||||
if (!sentry) {
|
||||
error ("unknown switch type '%s'", optarg);
|
||||
print_usage ();
|
||||
exit (1);
|
||||
}
|
||||
break;
|
||||
case 'l':
|
||||
logpath = optarg;
|
||||
break;
|
||||
case 'q':
|
||||
quiet = 1;
|
||||
break;
|
||||
case 'd':
|
||||
debug = 1;
|
||||
break;
|
||||
case 'h':
|
||||
default:
|
||||
print_usage ();
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
if (log_startup (logpath, debug, quiet)) {
|
||||
fprintf (stderr, "Couldn't open/create logfile %s", logpath);
|
||||
exit (2);
|
||||
}
|
||||
|
||||
if (!sentry) {
|
||||
if (!quiet)
|
||||
print_usage ();
|
||||
else
|
||||
error ("missing device switch type.");
|
||||
do_exit (3);
|
||||
}
|
||||
|
||||
if (!vid || !pid) {
|
||||
if (!quiet)
|
||||
print_usage ();
|
||||
else
|
||||
error ("missing vendor and device IDs.");
|
||||
do_exit (3);
|
||||
}
|
||||
|
||||
usb_init();
|
||||
|
||||
if (usb_find_busses() < 0) {
|
||||
error ("no USB busses found.");
|
||||
do_exit (4);
|
||||
}
|
||||
|
||||
if (usb_find_devices() < 0) {
|
||||
error ("no USB devices found.");
|
||||
do_exit (4);
|
||||
}
|
||||
|
||||
if (sentry->find_func)
|
||||
dev = (*sentry->find_func) (vid, pid);
|
||||
else
|
||||
dev = generic_find (vid, pid);
|
||||
if (dev == NULL) {
|
||||
error ("no device found.");
|
||||
do_exit (5);
|
||||
}
|
||||
|
||||
handle = usb_open (dev);
|
||||
if (handle == NULL) {
|
||||
error ("%s: could not access the device.",
|
||||
dev->filename);
|
||||
do_exit (6);
|
||||
}
|
||||
|
||||
/* detach running default driver */
|
||||
signal (SIGTERM, release_usb_device);
|
||||
ret = usb_get_driver_np (handle, 0, buffer, sizeof (buffer));
|
||||
if (ret == 0) {
|
||||
debug ("%s: found already attached driver '%s'", dev->filename, buffer);
|
||||
|
||||
ret = usb_detach_kernel_driver_np (handle, 0);
|
||||
if (ret != 0) {
|
||||
debug ("%s: error: unable to detach current driver.", dev->filename);
|
||||
usb_close (handle);
|
||||
do_exit (7);
|
||||
}
|
||||
}
|
||||
|
||||
ret = usb_claim_interface (handle, 0);
|
||||
if (ret != 0) {
|
||||
debug ("%s: couldn't claim device's USB interface: %d.",
|
||||
dev->filename, ret);
|
||||
usb_close (handle);
|
||||
do_exit (8);
|
||||
}
|
||||
|
||||
ret = (*sentry->switch_func) (handle, dev);
|
||||
if (ret < 0) {
|
||||
debug ("%s: failed to switch device to serial mode.", dev->filename);
|
||||
usb_release_interface (handle, 0);
|
||||
usb_close (handle);
|
||||
do_exit(9);
|
||||
}
|
||||
|
||||
usb_release_interface (handle, 0);
|
||||
|
||||
ret = usb_close (handle);
|
||||
if (ret < 0)
|
||||
debug ("%s: failed to close the device.", dev->filename);
|
||||
|
||||
do_exit (0);
|
||||
return 0;
|
||||
}
|
@ -1,83 +0,0 @@
|
||||
/*
|
||||
* Modem mode switcher
|
||||
*
|
||||
* Copyright (C) 2009 Dan Williams <dcbw@redhat.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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:
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
static int debug_on = 0;
|
||||
static int quiet = 0;
|
||||
FILE *logfile = NULL;
|
||||
|
||||
void
|
||||
do_log (int level, const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
char buffer[1024];
|
||||
char tag = 'L';
|
||||
|
||||
if (level >= LOG_DBG && !debug_on)
|
||||
return;
|
||||
|
||||
va_start (args, fmt);
|
||||
vsnprintf (buffer, sizeof (buffer), fmt, args);
|
||||
va_end (args);
|
||||
|
||||
if (level == LOG_ERR)
|
||||
tag = 'E';
|
||||
else if (level == LOG_MSG)
|
||||
tag = 'L';
|
||||
else if (level == LOG_DBG)
|
||||
tag = 'D';
|
||||
|
||||
if (logfile)
|
||||
fprintf (logfile, "%c: %s\n", tag, buffer);
|
||||
if (!quiet)
|
||||
fprintf ((level == LOG_ERR) ? stderr : stdout, "%c: %s\n", tag, buffer);
|
||||
}
|
||||
|
||||
int
|
||||
log_startup (const char *path, int do_debug, int be_quiet)
|
||||
{
|
||||
time_t t;
|
||||
|
||||
quiet = be_quiet;
|
||||
debug_on = do_debug;
|
||||
|
||||
if (!path)
|
||||
return 0;
|
||||
|
||||
logfile = fopen (path, "a+");
|
||||
if (!logfile)
|
||||
return 1;
|
||||
|
||||
t = time (NULL);
|
||||
message ("\n**** Started: %s\n", ctime (&t));
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
log_shutdown (void)
|
||||
{
|
||||
if (logfile)
|
||||
fclose (logfile);
|
||||
}
|
||||
|
@ -1,32 +0,0 @@
|
||||
/*
|
||||
* Modem mode switcher
|
||||
*
|
||||
* Copyright (C) 2009 Dan Williams <dcbw@redhat.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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:
|
||||
*/
|
||||
|
||||
#ifndef __UTILS_H__
|
||||
#define __UTILS_H__
|
||||
|
||||
#define LOG_ERR 0
|
||||
#define LOG_MSG 1
|
||||
#define LOG_DBG 2
|
||||
|
||||
#define message(fmt, args...) do_log (LOG_MSG, fmt, ##args);
|
||||
#define error(fmt, args...) do_log (LOG_ERR, fmt, ##args);
|
||||
#define debug(fmt, args...) do_log (LOG_DBG, fmt, ##args);
|
||||
|
||||
void do_log (int level, const char *fmt, ...);
|
||||
int log_startup (const char *path, int do_debug, int be_quiet);
|
||||
void log_shutdown (void);
|
||||
|
||||
#endif /* __UTILS_H__ */
|
Loading…
x
Reference in New Issue
Block a user