亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gsmd.c.svn-base

?? Linux下gsm/gprs modem的看守程序。支持短信發送與接受。
?? SVN-BASE
字號:
/* gsmd core * * (C) 2006-2007 by OpenMoko, Inc. * Written by Harald Welte <laforge@openmoko.org> * All Rights Reserved * * 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. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * */ #include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <errno.h>#include <fcntl.h>#include <termios.h>#include <signal.h>#define _GNU_SOURCE#include <getopt.h>#include <sys/types.h>#include <sys/stat.h>#include "gsmd.h"#include "gsmd-version.h"#include <gsmd/gsmd.h>#include <gsmd/atcmd.h>#include <gsmd/select.h>#include <gsmd/usock.h>#include <gsmd/vendorplugin.h>#include <gsmd/talloc.h>#include <gsmd/sms.h>#include <gsmd/unsolicited.h>#define GSMD_ALIVECMD		"AT"#define GSMD_ALIVE_INTERVAL	5*60#define GSMD_ALIVE_TIMEOUT	30static struct gsmd g;static int daemonize = 0;/* alive checking * either OK or ERROR is allowed since, both mean the modem still responds */static int gsmd_alive_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp){	struct gsmd *g = ctx;	if (!strcmp(resp, "OK") || !strcmp(resp, "ERROR") ||	    ((g->flags & GSMD_FLAG_V0) && resp[0] == '0'))		g->alive_responded = 1;	return 0;}static void alive_tmr_cb(struct gsmd_timer *tmr, void *data){	struct gsmd *g = data;	DEBUGP("gsmd_alive timer expired\n");	if (g->alive_responded == 0) {		gsmd_log(GSMD_FATAL, "modem dead!\n");		exit(3);	} else		gsmd_log(GSMD_INFO, "modem alive!\n");	/* FIXME: update some global state */	gsmd_timer_free(tmr);}static struct gsmd_timer * alive_timer(struct gsmd *g){ 	struct timeval tv;	tv.tv_sec = GSMD_ALIVE_TIMEOUT;	tv.tv_usec = 0;	return gsmd_timer_create(&tv, &alive_tmr_cb, g);}static int gsmd_modem_alive(struct gsmd *gsmd){	struct gsmd_atcmd *cmd;	gsmd->alive_responded = 0;	cmd = atcmd_fill(GSMD_ALIVECMD, strlen(GSMD_ALIVECMD)+1, 			 &gsmd_alive_cb, gsmd, 0, alive_timer);	if (!cmd) {		return -ENOMEM;	}	return atcmd_submit(gsmd, cmd);}static void alive_interval_tmr_cb(struct gsmd_timer *tmr, void *data){	struct gsmd *gsmd = data;	DEBUGP("interval expired, starting next alive inquiry\n");	/* start a new alive check iteration */	gsmd_modem_alive(gsmd);	/* re-add the timer for the next interval */	tmr->expires.tv_sec = GSMD_ALIVE_INTERVAL;	tmr->expires.tv_usec = 0;	gsmd_timer_register(tmr);}int gsmd_alive_start(struct gsmd *gsmd){	struct timeval tv;	tv.tv_sec = GSMD_ALIVE_INTERVAL;	tv.tv_usec = 0;	if (!gsmd_timer_create(&tv, &alive_interval_tmr_cb, gsmd))		return -1;	return 0;}/* initial startup code */static int gsmd_test_atcb(struct gsmd_atcmd *cmd, void *ctx, char *resp){	DEBUGP("`%s' returned `%s'\n", cmd->buf, resp);	return 0;}static int gsmd_get_imsi_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp){	struct gsmd *g = ctx;	DEBUGP("imsi : %s\n", resp);	strlcpy(g->imsi, resp, sizeof(g->imsi));	return 0;}int gsmd_simplecmd(struct gsmd *gsmd, char *cmdtxt){	struct gsmd_atcmd *cmd;	cmd = atcmd_fill(cmdtxt, strlen(cmdtxt)+1, &gsmd_test_atcb, NULL, 0, NULL);	if (!cmd)		return -ENOMEM;		return atcmd_submit(gsmd, cmd);}static int gsmd_initsettings2(struct gsmd *gsmd){	int rc = 0;		/* echo on, verbose */	rc |= gsmd_simplecmd(gsmd, "ATE0V1");	/* use +CRING instead of RING */	rc |= gsmd_simplecmd(gsmd, "AT+CRC=1");	/* enable +CREG: unsolicited response if registration status changes */	rc |= gsmd_simplecmd(gsmd, "AT+CREG=2");	/* use +CME ERROR: instead of ERROR */	rc |= gsmd_simplecmd(gsmd, "AT+CMEE=1");	/* use +CLIP: to indicate CLIP */	rc |= gsmd_simplecmd(gsmd, "AT+CLIP=1");	/* use +COLP: to indicate COLP */	/* set it 0 to disable subscriber info and avoid cme err 512 */	rc |= gsmd_simplecmd(gsmd, "AT+COLP=0");	/* use +CCWA: to indicate waiting call */	rc |= gsmd_simplecmd(gsmd, "AT+CCWA=1,1");	/* configure message format as PDU mode*/	/* FIXME: TEXT mode support!! */	rc |= gsmd_simplecmd(gsmd, "AT+CMGF=0");	/* reueset imsi */	atcmd_submit(gsmd, atcmd_fill("AT+CIMI", 7+1,					&gsmd_get_imsi_cb, gsmd, 0, NULL));	sms_cb_init(gsmd);	if (gsmd->vendorpl && gsmd->vendorpl->initsettings){		rc |= gsmd->vendorpl->initsettings(gsmd);		if (gsmd->machinepl && gsmd->machinepl->initsettings)			rc |= gsmd->machinepl->initsettings(gsmd);		return rc;	}		else		return rc;}static int firstcmd_response = 0;/* we submit the first atcmd and wait synchronously for a valid response */static int firstcmd_atcb(struct gsmd_atcmd *cmd, void *ctx, char *resp){	struct gsmd *gsmd = ctx;	if (strcmp(resp, "OK") &&	    (!(gsmd->flags & GSMD_FLAG_V0) || resp[0] != '0')) {		// temporarily changed to GSMD_ERROR instead of GSMD_FATAL + commented out exit(4) :M:		gsmd_log(GSMD_ERROR, "response '%s' to initial command invalid", resp);		//exit(4);	}	firstcmd_response = 1;	if (daemonize) {		if (fork()) {			exit(0);		}		fclose(stdout);		fclose(stderr);		fclose(stdin);		setsid();	}	return gsmd_initsettings2(gsmd);}int gsmd_initsettings(struct gsmd *gsmd){	struct gsmd_atcmd *cmd;	cmd = atcmd_fill("ATZ", strlen("ATZ")+1, &firstcmd_atcb, gsmd, 0, NULL);	if (!cmd)		return -ENOMEM;	return atcmd_submit(gsmd, cmd);}struct bdrt {	int bps;	u_int32_t b;};static struct bdrt bdrts[] = {	{ 0, B0 },	{ 9600, B9600 },	{ 19200, B19200 },	{ 38400, B38400 },	{ 57600, B57600 },	{ 115200, B115200 },	{ 230400, B230400 },	{ 460800, B460800 },	{ 921600, B921600 },};static int set_baudrate(int fd, int baudrate, int hwflow){	int i;	u_int32_t bd = 0;	struct termios ti;	for (i = 0; i < ARRAY_SIZE(bdrts); i++) {		if (bdrts[i].bps == baudrate)			bd = bdrts[i].b;	}	if (bd == 0)		return -EINVAL;		i = tcgetattr(fd, &ti);	if (i < 0) {                return -errno;        }		i = cfsetispeed(&ti, B0);	if (i < 0) {                return -errno;        }		i = cfsetospeed(&ti, bd);	if (i < 0) {                return -errno;        }		if (hwflow)		ti.c_cflag |= CRTSCTS;	else		ti.c_cflag &= ~CRTSCTS;	return tcsetattr(fd, 0, &ti) ? -errno : 0;}static int gsmd_initialize(struct gsmd *g){	INIT_LLIST_HEAD(&g->users);	g->mlbuf = talloc_array(gsmd_tallocs, unsigned char, MLPARSE_BUF_SIZE);	if (!g->mlbuf)		return -ENOMEM;	return 0;}static struct option opts[] = {	{ "version", 0, NULL, 'V' },	{ "daemon", 0, NULL, 'd' },	{ "help", 0, NULL, 'h' },	{ "device", 1, NULL, 'p' },	{ "speed", 1, NULL, 's' },	{ "logfile", 1, NULL, 'l' },	{ "hwflow", 0, NULL, 'F' },	{ "leak-report", 0, NULL, 'L' },	{ "vendor", 1, NULL, 'v' },	{ "machine", 1, NULL, 'm' },	{ "wait", 1, NULL, 'w' },	{ 0, 0, 0, 0 }};static void print_header(void){	printf("gsmd - (C) 2006-2007 by OpenMoko, Inc. and contributors\n"	       "This program is FREE SOFTWARE under the terms of GNU GPL\n\n");}static void print_version(void){	printf("gsmd, version %s\n",GSMD_VERSION);}static void print_usage(void){	printf("Usage:\n"	       "\t-V\t--version\tDisplay program version\n"	       "\t-d\t--daemon\tDeamonize\n"	       "\t-h\t--help\t\tDisplay this help message\n"	       "\t-p dev\t--device dev\tSpecify serial device to be used\n"	       "\t-s spd\t--speed spd\tSpecify speed in bps (9600,38400,115200,...)\n"	       "\t-F\t--hwflow\tHardware Flow Control (RTS/CTS)\n"	       "\t-L\t--leak-report\tLeak Report of talloc memory allocator\n"	       "\t-l file\t--logfile file\tSpecify a logfile to log to\n"	       "\t-v\t--vendor v\tSpecify GSM modem vendor plugin\n"	       "\t-m\t--machine m\tSpecify GSM modem machine plugin\n"	       "\t-w\t--wait m\tWait for the AT Interpreter Ready message\n"	       );}static void sig_handler(int signr){	switch (signr) {	case SIGTERM:	case SIGINT:		talloc_report_full(gsmd_tallocs, stderr);		exit(0);		break;	case SIGUSR1:		talloc_report_full(gsmd_tallocs, stderr);	case SIGALRM:		gsmd_timer_check_n_run();		break;	}}int main(int argc, char **argv){	int fd, argch; 	int bps = 115200;	int hwflow = 0;	char *device = NULL;	char *vendor_name = NULL;	char *machine_name = NULL;	int wait = -1;	signal(SIGTERM, sig_handler);	signal(SIGINT, sig_handler);	signal(SIGUSR1, sig_handler);	signal(SIGALRM, sig_handler);		gsmd_tallocs = talloc_named_const(NULL, 1, "GSMD");	print_header();	/*FIXME: parse commandline, set daemonize, device, ... */	while ((argch = getopt_long(argc, argv, "FVLdhp:s:l:v:m:w:", opts, NULL)) != -1) {		switch (argch) {		case 'V':			print_version();			exit(0);			break;		case 'L':			talloc_enable_leak_report_full();			break;		case 'F':			hwflow = 1;			break;		case 'd':			daemonize = 1;			break;		case 'h':			/* FIXME */			print_usage();			exit(0);			break;		case 'p':			device = optarg;			break;		case 's':			bps = atoi(optarg);			break;		case 'l':			if (gsmdlog_init(optarg)) {				fprintf(stderr, "can't open logfile `%s'\n", optarg);				exit(2);			}			break;		case 'v':			vendor_name = optarg;			break;		case 'm':			machine_name = optarg;			break;		case 'w':			wait = atoi(optarg);			break;		}	}	if (!device) {		fprintf(stderr, "ERROR: you have to specify a port (-p port)\n");		print_usage();		exit(2);	}	/* use direct access to device node ([virtual] tty device) */	fd = open(device, O_RDWR);	if (fd < 0) {		fprintf(stderr, "can't open device `%s': %s\n",			device, strerror(errno));		exit(1);	}	if (set_baudrate(fd, bps, hwflow) < 0) {		fprintf(stderr, "can't set baudrate\n");		exit(1);	}	if (gsmd_initialize(&g) < 0) {		fprintf(stderr, "internal error\n");		exit(1);	}	gsmd_timer_init();	if (gsmd_machine_plugin_init(&g, machine_name, vendor_name) < 0) {		fprintf(stderr, "no machine plugins found\n");		exit(1);	}	/* select a machine plugin and load possible vendor plugins */	gsmd_machine_plugin_find(&g);	/* initialize the machine plugin */	if (g.machinepl->init &&	    (g.machinepl->init(&g, fd) < 0)) {		fprintf(stderr, "couldn't initialize machine plugin\n");		exit(1);	}	if (wait >= 0)		g.interpreter_ready = !wait;	if (atcmd_init(&g, fd) < 0) {		fprintf(stderr, "can't initialize UART device\n");		exit(1);	}        write(fd,"\r",1);	atcmd_drain(fd);	if (usock_init(&g) < 0) {		fprintf(stderr, "can't open unix socket\n");		exit(1);	}	/* select a vendor plugin */	gsmd_vendor_plugin_find(&g);	unsolicited_init(&g);	if (g.interpreter_ready) {		gsmd_initsettings(&g);			gsmd_alive_start(&g);	}	gsmd_opname_init(&g);	while (1) {		int ret = gsmd_select_main();		if (ret == 0)			continue;		if (ret < 0) {			if (errno == EINTR)				continue;			else {				DEBUGP("select returned error (%s)\n",					strerror(errno));				break;			}		}	}	exit(0);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美激情综合在线| 国产午夜亚洲精品羞羞网站| 精品一区二区免费看| 不卡视频一二三四| 日韩欧美你懂的| 亚洲一区二区三区在线播放| 国产激情精品久久久第一区二区| 波多野结衣中文一区| 日韩一区二区中文字幕| 一区二区三区在线视频播放| 高清日韩电视剧大全免费| 91精品国产91久久综合桃花| 一区二区三国产精华液| 国产成a人亚洲精品| 日韩美女在线视频| 肉肉av福利一精品导航| 欧美在线视频全部完| 中文字幕乱码日本亚洲一区二区| 亚洲国产裸拍裸体视频在线观看乱了| 国产在线播放一区| 日韩一卡二卡三卡四卡| 五月天丁香久久| 欧美日韩三级在线| 一区二区高清在线| 亚洲天堂精品视频| 日韩一级片在线播放| 欧美剧情片在线观看| 国产主播一区二区三区| 午夜电影网亚洲视频| 国产亚洲一二三区| 在线视频国内自拍亚洲视频| 国内精品视频一区二区三区八戒| 樱花影视一区二区| 欧美tickling网站挠脚心| 日韩一区二区在线观看视频| 96av麻豆蜜桃一区二区| 欧美激情中文字幕一区二区| 国产在线精品不卡| 精品99一区二区| 国产精品一区在线观看乱码| 久久综合色婷婷| 国产麻豆日韩欧美久久| 久久久久国产精品麻豆ai换脸| 国产精品69毛片高清亚洲| 国产网站一区二区三区| 不卡的看片网站| 一区二区三区日韩欧美| 777色狠狠一区二区三区| 精东粉嫩av免费一区二区三区| 2欧美一区二区三区在线观看视频| 九九热在线视频观看这里只有精品| 精品乱人伦一区二区三区| 国精品**一区二区三区在线蜜桃| 国产精品日韩成人| 欧美视频一区二区三区| 秋霞国产午夜精品免费视频| 久久你懂得1024| 91免费小视频| 亚洲国产另类精品专区| 欧美精品丝袜久久久中文字幕| 美女视频免费一区| 欧美国产视频在线| 色94色欧美sute亚洲13| 日韩av中文字幕一区二区三区| 久久久久国产成人精品亚洲午夜| 成人h精品动漫一区二区三区| 亚洲欧美激情在线| 欧美成人r级一区二区三区| 成人黄色片在线观看| 天堂一区二区在线| 国产欧美日韩视频在线观看| 色婷婷综合五月| 免费高清视频精品| 亚洲欧洲日韩在线| 在线综合+亚洲+欧美中文字幕| 国产福利一区二区三区视频| 午夜一区二区三区视频| 制服丝袜国产精品| 色老汉av一区二区三区| 午夜精品一区在线观看| 欧美日韩激情一区二区| 亚洲午夜av在线| 国产精品亲子伦对白| 青青草国产精品亚洲专区无| 欧美吻胸吃奶大尺度电影| 亚洲柠檬福利资源导航| 国产精品66部| 国产精品三级久久久久三级| 国产成人av福利| 欧美成人r级一区二区三区| 久久国产生活片100| 99国产精品久| 亚洲乱码国产乱码精品精的特点 | 亚洲成年人影院| 不卡欧美aaaaa| 国产视频视频一区| 99精品国产热久久91蜜凸| 中文字幕精品一区二区三区精品| 日韩激情视频网站| 久久亚洲捆绑美女| 成人爱爱电影网址| 日韩电影网1区2区| 欧美mv日韩mv| 欧美喷水一区二区| 欧美最猛性xxxxx直播| gogo大胆日本视频一区| 国产成人aaaa| 成人午夜激情片| 国产精品一二三四| 狠狠网亚洲精品| 精品系列免费在线观看| 久久成人18免费观看| 久久国产免费看| 国内外成人在线视频| 日本一区中文字幕| 免费看日韩a级影片| 日本色综合中文字幕| 亚洲成a人片综合在线| 天涯成人国产亚洲精品一区av| 国产精品美女www爽爽爽| 中文字幕在线一区免费| 亚洲丝袜精品丝袜在线| 亚洲视频免费在线| 亚洲在线视频网站| 午夜成人免费视频| 精品一区二区免费在线观看| 国产精品亚洲第一区在线暖暖韩国| 国产不卡视频一区| 日本伊人色综合网| 色系网站成人免费| 欧美亚洲动漫精品| 91精品免费观看| 久久亚洲私人国产精品va媚药| 久久久久99精品国产片| 成人欧美一区二区三区黑人麻豆| 亚洲精品大片www| 日本系列欧美系列| 国产成人午夜精品5599| 91在线你懂得| 欧美丰满高潮xxxx喷水动漫| 久久久久久亚洲综合影院红桃 | 成人av综合在线| 国产亚洲午夜高清国产拍精品 | 欧美一区二区三区在线观看 | 亚洲精品免费电影| 亚洲品质自拍视频网站| 亚洲国产综合在线| 免费欧美日韩国产三级电影| 国产一区二区三区精品视频| 在线观看亚洲a| 成人av网站在线| 九九**精品视频免费播放| 国产精品一二二区| 日本高清不卡一区| 日韩精品一区二区三区中文不卡| 国产精品成人免费在线| 蜜臀久久99精品久久久画质超高清| 国产.欧美.日韩| 欧美一区二区三区免费大片| 亚洲丝袜美腿综合| 国产精一区二区三区| 欧美丝袜第三区| 国产天堂亚洲国产碰碰| 亚洲一区二区三区在线看| 国产不卡视频一区二区三区| 宅男噜噜噜66一区二区66| 中文字幕一区二区三区在线不卡 | 欧美va亚洲va在线观看蝴蝶网| 亚洲欧洲精品成人久久奇米网 | 亚洲成人一区二区在线观看| 精久久久久久久久久久| 欧美性感一类影片在线播放| 国产欧美日产一区| 麻豆国产91在线播放| 在线视频欧美精品| 国产精品高潮呻吟久久| 精品一区二区三区香蕉蜜桃| 欧美日韩一区二区三区视频| 国产精品日日摸夜夜摸av| 国产在线视视频有精品| 欧美精品日韩一区| 曰韩精品一区二区| 成人高清伦理免费影院在线观看| 久久久亚洲高清| 国内精品久久久久影院薰衣草| 337p亚洲精品色噜噜狠狠| 亚洲一区二区三区小说| 99免费精品视频| 亚洲国产岛国毛片在线| 国产在线精品一区二区三区不卡| 欧美一级久久久久久久大片| 亚洲第一久久影院| 欧美性感一类影片在线播放| 亚洲一区二区在线观看视频| 色狠狠桃花综合| 一区二区日韩电影| 欧美亚洲一区二区三区四区| 亚洲综合在线五月| 在线免费观看日本一区| 一区二区三区四区国产精品|