Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions application/modem_scan/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
include $(TOPDIR)/rules.mk

# Include unified version
include ../../version.mk

PKG_NAME:=modem_scan
PKG_RELEASE:=$(QMODEM_RELEASE)
PKG_VERSION:=$(QMODEM_VERSION)

include $(INCLUDE_DIR)/package.mk

define Package/$(PKG_NAME)
SECTION:=utils
CATEGORY:=Utilities
TITLE:=QModem scan daemon and client
DEPENDS:=+libjson-c +tom_modem +sms-tool_q +ubus-at-daemon
endef

define Package/$(PKG_NAME)/description
C daemon and client for QModem device scan event scheduling.
endef

define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) src/* $(PKG_BUILD_DIR)/
endef

define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) \
$(TARGET_CONFIGURE_OPTS) \
CFLAGS="$(TARGET_CFLAGS) -Wall -Wextra -std=c99 -D_GNU_SOURCE -I$(STAGING_DIR)/usr/include -I$(STAGING_DIR)/usr/include/json-c" \
LDFLAGS="$(TARGET_LDFLAGS) -ljson-c -lpthread"
endef

define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/modem_scand $(1)/usr/bin/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/modem_scanc $(1)/usr/bin/
endef

$(eval $(call BuildPackage,$(PKG_NAME)))
29 changes: 29 additions & 0 deletions application/modem_scan/src/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
CFLAGS ?= -Wall -Wextra -std=c99 -D_GNU_SOURCE
CFLAGS += -I$(STAGING_DIR)/usr/include
CFLAGS += -I$(STAGING_DIR)/usr/include/json-c
LDFLAGS ?=
LDFLAGS += -ljson-c -lpthread

TARGETS = modem_scand modem_scanc

.PHONY: all clean install

all: $(TARGETS)

modem_scand: modem_scand.o
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
$(STRIP) $@

modem_scanc: modem_scanc.o
$(CC) $(CFLAGS) $^ -o $@
$(STRIP) $@

%.o: %.c modem_scan_common.h
$(CC) $(CFLAGS) -c $< -o $@

clean:
rm -f *.o $(TARGETS)

install: all
install -D modem_scand $(DESTDIR)/usr/bin/modem_scand
install -D modem_scanc $(DESTDIR)/usr/bin/modem_scanc
12 changes: 12 additions & 0 deletions application/modem_scan/src/modem_scan_common.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef QMODEM_MODEM_SCAN_COMMON_H
#define QMODEM_MODEM_SCAN_COMMON_H

#define QMODEM_SCAND_SOCKET "/var/run/qmodem/modem_scand.sock"
#define QMODEM_RUN_DIR "/var/run/qmodem"
#define QMODEM_SUPPORT_JSON "/usr/share/qmodem/modem_support.json"
#define QMODEM_PORT_RULE_JSON "/usr/share/qmodem/modem_port_rule.json"

#define QMODEM_MAX_LINE 512
#define QMODEM_MAX_REPLY 4096

#endif
111 changes: 111 additions & 0 deletions application/modem_scan/src/modem_scanc.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#include "modem_scan_common.h"

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>

static void usage(FILE *out)
{
fprintf(out,
"Usage:\n"
" modem_scanc add <slot> <usb|pcie> [delay_seconds]\n"
" modem_scanc remove <section> [delay_seconds]\n"
" modem_scanc disable <slot> [delay_seconds]\n"
" modem_scanc scan [usb|pcie|all] [delay_seconds]\n"
" modem_scanc set-log-level <debug|info|notice|warn|err>\n"
" modem_scanc status\n");
}

static int send_request(const char *line)
{
int fd;
struct sockaddr_un addr;
char reply[QMODEM_MAX_REPLY];
ssize_t n;

fd = socket(AF_UNIX, SOCK_STREAM, 0);
if (fd < 0) {
perror("socket");
return 1;
}

memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", QMODEM_SCAND_SOCKET);

for (int i = 0; i < 20; i++) {
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == 0)
break;
if (i == 19) {
fprintf(stderr, "modem_scand unavailable: %s\n", strerror(errno));
close(fd);
return 2;
}
usleep(100000);
}

if (write(fd, line, strlen(line)) < 0 || write(fd, "\n", 1) < 0) {
perror("write");
close(fd);
return 1;
}

while ((n = read(fd, reply, sizeof(reply) - 1)) > 0) {
reply[n] = '\0';
fputs(reply, stdout);
}

close(fd);
return 0;
}

int main(int argc, char **argv)
{
char line[QMODEM_MAX_LINE];

if (argc < 2) {
usage(stderr);
return 1;
}

if (!strcmp(argv[1], "add")) {
if (argc != 4 && argc != 5) {
usage(stderr);
return 1;
}
snprintf(line, sizeof(line), "add %s %s %s", argv[2], argv[3], argc == 5 ? argv[4] : "0");
} else if (!strcmp(argv[1], "remove")) {
if (argc != 3 && argc != 4) {
usage(stderr);
return 1;
}
snprintf(line, sizeof(line), "remove %s %s", argv[2], argc == 4 ? argv[3] : "0");
} else if (!strcmp(argv[1], "disable")) {
if (argc != 3 && argc != 4) {
usage(stderr);
return 1;
}
snprintf(line, sizeof(line), "disable %s %s", argv[2], argc == 4 ? argv[3] : "0");
} else if (!strcmp(argv[1], "scan")) {
const char *type = argc >= 3 ? argv[2] : "all";
const char *delay = argc >= 4 ? argv[3] : "0";
snprintf(line, sizeof(line), "scan %s %s", type, delay);
} else if (!strcmp(argv[1], "set-log-level")) {
if (argc != 3) {
usage(stderr);
return 1;
}
snprintf(line, sizeof(line), "set-log-level %s", argv[2]);
} else if (!strcmp(argv[1], "status")) {
snprintf(line, sizeof(line), "status");
} else {
usage(stderr);
return 1;
}

return send_request(line);
}
Loading
Loading