blob: b44905724711d33844c7d336a964d9c190019484 [file] [log] [blame]
/* open-deauth.c - deauthorize the device while the SDK is in use. This
* simulates what happens across a suspend/resume cycle where the device was in
* use just before suspend. This test causes the SDK to spawn thousands of
* threads and consume nearly all the machine's CPU for about 30 seconds.
*/
#include <fcntl.h>
#include <linux/limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
typedef unsigned char u8;
static void die(char *prefix) {
perror(prefix);
exit(1);
}
struct device {
char name[256];
char key[16];
};
#define NDEV 16
extern int QCWWANEnumerateDevices(u8 *size, struct device *devices);
static struct device *finddev(void) {
int res;
u8 size = NDEV;
static struct device devices[NDEV];
struct device *dev = &devices[0];
res = QCWWANEnumerateDevices(&size, devices);
if (res)
die("QCWWANEnumerateDevices");
if (size == 0)
die("finddev: no devices");
return dev;
}
extern int QCWWANConnect(const char *name, const char *key);
static void connect(const char *name, const char *key) {
int res = QCWWANConnect(name, key);
if (res)
die("QCWWANConnect");
}
static void deauth(const char *dev) {
char path[PATH_MAX];
snprintf(path, sizeof(path), "/sys/bus/usb/devices/%s/authorized", dev);
int f = open(path, O_WRONLY);
if (f == -1)
die("open");
int bytes = write(f, "0", 1);
if (bytes != 1)
die("write");
close(f);
}
extern int GetSerialNumbers(size_t esnsz, char *esn, size_t imeisz, char *imei,
size_t meidsz, char *meid);
static void getserials(void) {
int res;
char esn[1024];
char imei[1024];
char meid[1024];
res = GetSerialNumbers(sizeof(esn), esn, sizeof(imei), imei,
sizeof(meid), meid);
if (res)
die("GetSerialNumbers");
}
int main(int argc, char *argv[]) {
struct device *dev;
if (argc < 2) {
printf("Usage: %s <usb device>\n", argv[0]);
return 0;
}
dev = finddev();
connect(dev->name, dev->key);
deauth(argv[1]);
getserials();
printf("ok\n");
return 0;
}