2023-05-03 02:00:13 +00:00

1020 lines
32 KiB
C
Executable File

#include <dirent.h>
#include <sys/shm.h>
#include <sys/time.h>
#include <sys/utsname.h>
#include <sys/wait.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
//begin modified by zhangkaibo get qmap_num process flow. mantis 0048920,0048917 20200605
#include <errno.h>
//end modified by zhangkaibo get qmap_num process flow. mantis 0048920,0048917 20200605
#include "util.h"
#include "query_pcie_mode.h"
#define MAJOR 1
#define MINOR 0
#define REVISION 4
/*
* Generally, we do not modify version info, so several modifications will share
* the same version code. SUBVERSION is used for customized modification to
* distinguise this version from previous one. SUBVERSION adds up before you
* send the code to customers and it should be set to 0 if VERSION_STRING info
* is changed.
*/
#define SUBVERSION 0
#define STRINGIFY_HELPER(v) #v
#define STRINGIFY(v) STRINGIFY_HELPER(v)
#define VERSION_STRING() \
STRINGIFY(MAJOR) "." STRINGIFY(MINOR) "." STRINGIFY(REVISION)
#define MAX_PATH 256
#define _PARAM_GLOBALS_
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
//begin modified by zhangkaibo get qmap_num process flow. mantis 0048920,0048917 20200605
#include <ctype.h>
//end modified by zhangkaibo get qmap_num process flow. mantis 0048920,0048917 20200605
#define SECTION_MAX_LEN 256
#define STRVALUE_MAX_LEN 256
#define LINE_CONTENT_MAX_LEN 256
#define READ_STR_ERR -1
#define READ_STR_OK 0
//begin modified by zhangkaibo get qmap_num process flow. mantis 0048920,0048917 20200605
//2021-03-24 willa.liu@fibocom.com changed begin for support mantis 0071817
//#include "query_pcie_mode.h"
//2021-03-24 willa.liu@fibocom.com changed end for support mantis 0071817
static int is_pcie_dial()
{
return (access("/dev/mhi_QMI0", F_OK) == 0);
}
static int is_gobinet_dial()
{
return (access("/dev/qcqmi0", F_OK) == 0);
}
static int is_qmiwwan_dial()
{
return (access("/dev/cdc-wdm0", F_OK) == 0);
}
static size_t fibo_fread(const char *filename, void *buf, size_t size)
{
FILE *fp = fopen(filename, "r");
size_t n = 0;
memset(buf, 0x00, size);
if (fp) {
n = fread(buf, 1, size, fp);
if (n <= 0 || n == size) {
dbg_time(
"warnning: fail to fread(%s), fread=%zd, buf_size=%zd, "
"errno: %d (%s)",
__func__, filename, n, size, errno, strerror(errno));
}
fclose(fp);
}
return n > 0 ? n : 0;
}
int get_qmap_num()
{
int n;
int qmap_num=-1;
char buf[128];
struct {
char filename[255 * 2];
char linkname[255 * 2];
} * pl;
if (is_pcie_dial())
return 8;
pl = (typeof(pl))malloc(sizeof(*pl));
if(is_gobinet_dial())
{
snprintf(pl->linkname, sizeof(pl->linkname),
"/sys/class/net/usb0/device/driver");
n = readlink(pl->linkname, pl->filename, sizeof(pl->filename));
pl->filename[n] = '\0';
while (pl->filename[n] != '/') n--;
snprintf(pl->filename, sizeof(pl->filename), "/sys/class/net/usb0/qmap_num");
//2021-02-22 kaibo.zhangkaibo@fibocom.com changed begin for support mantis 0071171
if (access(pl->filename, F_OK) == 0) {
dbg_time("access %s", pl->filename);
if (errno != ENOENT) {
dbg_time("fail to access %s, errno: %d (%s)", pl->filename, errno,
strerror(errno));
goto _out;
}
}
else
{
snprintf(pl->filename, sizeof(pl->filename), "/sys/class/net/usb0/qmap_mode");
if (access(pl->filename, F_OK) == 0) {
dbg_time("access %s", pl->filename);
if (errno != ENOENT) {
dbg_time("fail to access %s, errno: %d (%s)", pl->filename, errno,
strerror(errno));
goto _out;
}
}
}
}
if(is_qmiwwan_dial())
{
snprintf(pl->linkname, sizeof(pl->linkname),
"/sys/class/net/wwan0/device/driver");
n = readlink(pl->linkname, pl->filename, sizeof(pl->filename));
pl->filename[n] = '\0';
while (pl->filename[n] != '/') n--;
snprintf(pl->filename, sizeof(pl->filename), "/sys/class/net/wwan0/qmap_mode");
if (access(pl->filename, F_OK) == 0) {
dbg_time("access %s", pl->filename);
if (errno != ENOENT) {
dbg_time("fail to access %s, errno: %d (%s)", pl->filename, errno,
strerror(errno));
goto _out;
}
}
}
dbg_time("access %s", pl->filename);
if (!access(pl->filename, R_OK)) {
n = fibo_fread(pl->filename, buf, sizeof(buf));
if (n > 0) {
qmap_num = atoi(buf);
}
}
_out:
free(pl);
return qmap_num;
}
//end modified by zhangkaibo get qmap_num process flow. mantis 0048920,0048917 20200605
//begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605
int IsInt(char* str)
{
int len;
len = strlen(str-1);
len = len>=1?len:1;
int i=0;
for(; i < len ; i++)
{
if(!(isdigit(str[i])))
return 0;
}
return 1;
}
//end modified by zhangkaibo limit input parameters. mantis 0048965 20200605
// read value from .ini
void IniReadValue(char *section, char *key, char *val, const char *file)
{
FILE *fp;
int i = 0;
int lineContentLen = 0;
int position = 0;
char lineContent[LINE_CONTENT_MAX_LEN];
bool bFoundSection = false;
bool bFoundKey = false;
fp = fopen(file, "r");
if (fp == NULL) {
printf("%s: Opent file %s failed.\n", __FILE__, file);
return;
}
while (feof(fp) == 0) {
memset(lineContent, 0, LINE_CONTENT_MAX_LEN);
fgets(lineContent, LINE_CONTENT_MAX_LEN, fp);
if ((lineContent[0] == ';') || (lineContent[0] == '\0') ||
(lineContent[0] == '\r') || (lineContent[0] == '\n')) {
continue;
}
// check section
if (strncmp(lineContent, section, strlen(section)) == 0) {
bFoundSection = true;
// printf("Found section = %s\n", lineContent);
while (feof(fp) == 0) {
memset(lineContent, 0, LINE_CONTENT_MAX_LEN);
fgets(lineContent, LINE_CONTENT_MAX_LEN, fp);
// check key
if (strncmp(lineContent, key, strlen(key)) == 0) {
bFoundKey = true;
lineContentLen = strlen(lineContent);
// find value
for (i = strlen(key); i < lineContentLen; i++) {
if (lineContent[i] == '=') {
position = i + 1;
break;
}
}
if (i >= lineContentLen)
break;
strncpy(val, lineContent + position,
strlen(lineContent + position));
lineContentLen = strlen(val);
for (i = 0; i < lineContentLen; i++) {
if ((val[i] == '\0') || (val[i] == '\r') ||
(val[i] == '\n')) {
val[i] = '\0';
// break;
}
}
} else if (lineContent[0] == '[') {
break;
}
}
break;
}
}
if (!bFoundSection) {
printf("No section = %s\n", section);
} else if (!bFoundKey) {
printf("No key = %s\n", key);
}
fclose(fp);
}
int readStringValue(const char *section, char *key, char *val, const char *file)
{
char sect[SECTION_MAX_LEN];
// printf("section = %s, key = %s, file = %s\n", section, key, file);
if (section == NULL || key == NULL || val == NULL || file == NULL) {
printf("%s: input parameter(s) is NULL!\n", __func__);
return READ_STR_ERR;
}
memset(sect, 0, SECTION_MAX_LEN);
sprintf(sect, "[%s]", section);
// printf("reading value...\n");
IniReadValue(sect, key, val, file);
return READ_STR_OK;
}
char fileContents[80][LINE_CONTENT_MAX_LEN];
int fileIndex = 0;
void IniWriteValue(const char *section, char *key, char *val, const char *file)
{
int err = 0;
char lineContent[LINE_CONTENT_MAX_LEN];
char strWrite[LINE_CONTENT_MAX_LEN];
bool bFoundSection = false;
bool bFoundKey = false;
int fileIndextemp = 0;
memset(lineContent, '\0', LINE_CONTENT_MAX_LEN);
memset(strWrite, '\0', LINE_CONTENT_MAX_LEN);
sprintf(strWrite, "%s=%s\n", key, val);
while (fileIndextemp <= fileIndex) {
memset(lineContent, 0, LINE_CONTENT_MAX_LEN);
memcpy(lineContent, fileContents[fileIndextemp++],
LINE_CONTENT_MAX_LEN);
if ((lineContent[0] == ';') || (lineContent[0] == '\0') ||
(lineContent[0] == '\r') || (lineContent[0] == '\n')) {
continue;
}
// check section
if (strncmp(lineContent, section, strlen(section)) == 0) {
bFoundSection = true;
while (fileIndextemp <= fileIndex) {
memset(lineContent, 0, LINE_CONTENT_MAX_LEN);
memcpy(lineContent, fileContents[fileIndextemp],
LINE_CONTENT_MAX_LEN);
// check key
if (strncmp(lineContent, key, strlen(key)) == 0) {
bFoundKey = true;
// printf("%s: %s=%s\n", __func__, key, val);
memset(fileContents[fileIndextemp], 0,
LINE_CONTENT_MAX_LEN);
memcpy(fileContents[fileIndextemp], strWrite,
strlen(strWrite));
// printf("%s\n",strWrite);
if (err < 0) {
printf("%s err.\n", __func__);
}
break;
} else if (lineContent[0] == '[') {
fileIndextemp++;
break;
}
fileIndextemp++;
}
break;
}
}
if (!bFoundSection) {
printf("No section = %s\n", section);
} else if (!bFoundKey) {
printf("No key = %s\n", key);
}
}
int writeStringVlaue(const char *section, char *key, char *val,
const char *file)
{
char sect[SECTION_MAX_LEN];
// printf("section = %s, key = %s, value=%s , file = %s\n", section, key,
// val, file);
if (section == NULL || key == NULL || val == NULL || file == NULL) {
printf("%s: input parameter(s) is NULL!\n", __func__);
return READ_STR_ERR;
}
memset(sect, '\0', SECTION_MAX_LEN);
sprintf(sect, "[%s]", section);
IniWriteValue(sect, key, val, file);
return READ_STR_OK;
}
int writeIntValue(const char *section, char *key, int val, const char *file)
{
char strValue[STRVALUE_MAX_LEN];
memset(strValue, '\0', STRVALUE_MAX_LEN);
sprintf(strValue, "%d", val);
return writeStringVlaue(section, key, strValue, file);
}
int readIntValue(const char *section, char *key, const char *file)
{
char strValue[STRVALUE_MAX_LEN];
memset(strValue, '\0', STRVALUE_MAX_LEN);
if (readStringValue(section, key, strValue, file) != READ_STR_OK) {
printf("%s: error", __func__);
return 0;
}
return (atoi(strValue));
}
int mygetch()
{
struct termios oldt, newt;
int ch;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return ch;
}
#define CONFIG_FILE "multi-pdn.ini"
#define DIAL_PROCESS "fibocom-dial"
#define MAX_QMAP_NUM 8
struct profile {
char apn[MAX_PATH];
char user[MAX_PATH];
char password[MAX_PATH];
int auth;
int ipfamily;
//begin modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
char pin[MAX_PATH];
//end modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
};
int shmid;
void *shm;
int qmap_num = -1;
bool connectState[MAX_QMAP_NUM];
int lock_file = -1;
void initShareMemory()
{
shmid = shmget((key_t)9527, sizeof(int) * 8, 0666 | IPC_CREAT);
if (shmid == -1) {
fprintf(stderr, "shmget failed\n");
exit(EXIT_FAILURE);
}
shm = shmat(shmid, 0, 0);
if (shm == (void *)-1) {
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
}
}
void destoryShareMemory()
{
if (shmdt(shm) == -1) {
fprintf(stderr, "shmdt failed\n");
exit(EXIT_FAILURE);
}
if (shmctl(shmid, IPC_RMID, 0) == -1) {
fprintf(stderr, "shmctl(IPC_RMID) failed\n");
exit(EXIT_FAILURE);
}
}
void SIGINT_handle(int sig_num)
{
printf("reveice signal %d \n", sig_num);
{
int *connectPids = (int *)shm;
int cIndex;
for(cIndex = 1 ; cIndex <= qmap_num ; cIndex++)
{
dbg_time("kill pid %d", connectPids[cIndex - 1]);
kill(connectPids[cIndex - 1], SIGINT);
connectState[cIndex - 1] = false;
}
}
destoryShareMemory();
close(lock_file); // 不要忘记释放文件指针
exit(0);
}
int loadConfigFromIni(struct profile *profileList, bool *connectState)
{
int profileIndex;
//begin modified by zhangkaibo get qmap_num process flow. mantis 0048920,0048917 20200605
//qmap_num = readIntValue("Setting", "qmap_num", CONFIG_FILE);
qmap_num = get_qmap_num();
if (qmap_num == 0 || qmap_num == -1 )
return -1;
//end modified by zhangkaibo get qmap_num process flow. mantis 0048920,0048917 20200605
for (profileIndex = 0; profileIndex < 8; profileIndex++) {
char profilename[MAX_PATH];
sprintf(profilename, "profile%d", profileIndex + 1);
memset(profileList[profileIndex].apn, 0, MAX_PATH);
readStringValue(profilename, "apn", profileList[profileIndex].apn,
CONFIG_FILE);
memset(profileList[profileIndex].user, 0, MAX_PATH);
readStringValue(profilename, "user", profileList[profileIndex].user,
CONFIG_FILE);
memset(profileList[profileIndex].password, 0, MAX_PATH);
readStringValue(profilename, "password",
profileList[profileIndex].password, CONFIG_FILE);
profileList[profileIndex].auth =
readIntValue(profilename, "auth", CONFIG_FILE);
profileList[profileIndex].ipfamily =
readIntValue(profilename, "ipfamily", CONFIG_FILE);
//begin modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
memset(profileList[profileIndex].pin, 0, MAX_PATH);
readStringValue(profilename, "pin", profileList[profileIndex].pin,
CONFIG_FILE);
//end modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
}
FILE *fp;
fileIndex = 0;
char lineContent[LINE_CONTENT_MAX_LEN];
fp = fopen(CONFIG_FILE, "r+");
if (fp == NULL) {
printf("%s: Opent file %s failed.\n", __FILE__, CONFIG_FILE);
return -2;
}
// read all
while (feof(fp) == 0) {
memset(lineContent, 0, LINE_CONTENT_MAX_LEN);
fgets(lineContent, LINE_CONTENT_MAX_LEN, fp);
memcpy(fileContents[fileIndex], lineContent, strlen(lineContent));
// printf("%s",fileContents[fileIndex]);
fileIndex++;
}
fclose(fp);
return 0;
}
void saveConfigToIni()
{
FILE *fp;
fp = fopen(CONFIG_FILE, "w");
int fileIndextemp = 0;
fseek(fp, 0, SEEK_SET);
while (fileIndextemp <= fileIndex) {
fwrite(fileContents[fileIndextemp], strlen(fileContents[fileIndextemp]),
1, fp);
// printf("%s",fileContents[fileIndextemp]);
fileIndextemp++;
}
fclose(fp);
}
void modifyProfile(struct profile *profileList)
{
int profileIndex;
//begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605
struct profile tempprofile;
//end modified by zhangkaibo limit input parameters. mantis 0048965 20200605
char *f;
// show current fprfile setting
for (profileIndex = 0; profileIndex < 8; profileIndex++) {
dbg_time(
"Fibocom manager \nprofile%d apn:\"%s\" username:\"%s\" password: "
"\"%s\" auth: \"%d\" ip family: \"%d\"",
profileIndex + 1, profileList[profileIndex].apn,
profileList[profileIndex].user, profileList[profileIndex].password,
profileList[profileIndex].auth, profileList[profileIndex].ipfamily);
}
// select instance to be set
int connectProfile;
printf("set profile index:");
f = malloc(sizeof(f));
fgets(f,sizeof(f),stdin);
connectProfile = atoi(f);
//begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605
if(!IsInt(f)){
dbg_time("invalid input");
return;
}
//end modified by zhangkaibo limit input parameters. mantis 0048965 20200605
if (connectProfile < 0 || connectProfile > 8) {
dbg_time("error profile id");
return;
}
free(f);
/*
* Begin: 2020-11-16, Lizhengyang for multi-pdn-manager,
* Solve the problem of setting length
* of apn/username/password, mantis 0062495.
*/
printf("profile apn:");
f = malloc(MAX_PATH);
if (f == NULL)
{
printf("profile apn f malloc null\n");
return;
}
fgets(f, MAX_PATH, stdin);
f[strlen(f) - 1] = '\0';
strcpy(tempprofile.apn, f);
free(f);
printf("profile username:");
f = malloc(MAX_PATH);
if (f == NULL)
{
printf("profile username f malloc null\n");
return;
}
fgets(f, MAX_PATH, stdin);
f[strlen(f) - 1] = '\0';
strcpy(tempprofile.user, f);
free(f);
printf("profile password:");
f = malloc(MAX_PATH);
if (f == NULL)
{
printf("profile password f malloc null\n");
return;
}
fgets(f, MAX_PATH, stdin);
f[strlen(f) - 1] = '\0';
strcpy(tempprofile.password, f);
free(f);
/*
* End: 2020-11-16, Lizhengyang for multi-pdn-manager,
* Solve the problem of setting length
* of apn/username/password, mantis 0062495.
*/
printf("profile auth[0-3]:");
f = malloc(sizeof(f));
fgets(f,sizeof(f),stdin);
//begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605
tempprofile.auth = atoi(f);
if(!IsInt(f)){
dbg_time("invalid input");
return;
}
if(tempprofile.auth < 0 || tempprofile.auth > 3){
dbg_time("invalid auth type");
return;
}
//end modified by zhangkaibo limit input parameters. mantis 0048965 20200605
free(f);
printf("profile ipfamily[1-3]:");
f = malloc(sizeof(f));
fgets(f,sizeof(f),stdin);
//begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605
tempprofile.ipfamily = atoi(f);
if(!IsInt(f)){
dbg_time("invalid input");
return;
}
free(f);
if(tempprofile.ipfamily < 1 || tempprofile.ipfamily > 3){
dbg_time("invalid auth type");
return;
}
//begin modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
printf("pin:");
f = malloc(sizeof(f));
fgets(f,sizeof(f),stdin);
f[strlen(f)-1]='\0';
strcpy(tempprofile.pin, f);
free(f);
//end modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
memset(profileList[connectProfile-1].apn, 0, MAX_PATH);
memset(profileList[connectProfile-1].user, 0, MAX_PATH);
memset(profileList[connectProfile-1].password, 0, MAX_PATH);
strcpy(profileList[connectProfile-1].apn , tempprofile.apn);
strcpy(profileList[connectProfile-1].user , tempprofile.user);
strcpy(profileList[connectProfile-1].password , tempprofile.password);
profileList[connectProfile-1].auth = tempprofile.auth;
profileList[connectProfile-1].ipfamily = tempprofile.ipfamily;
//end modified by zhangkaibo limit input parameters. mantis 0048965 20200605
//begin modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
//strcpy(profileList[connectProfile].pin , tempprofile.pin);
strcpy(profileList[connectProfile-1].pin , tempprofile.pin);
//end modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
// save in
for (profileIndex = 0; profileIndex < qmap_num; profileIndex++) {
dbg_time(
"Fibocom manager \nprofile%d apn:\"%s\" username:\"%s\" pawssword: "
"\"%s\" auth: \"%d\" ip family: \"%d\"",
profileIndex + 1, profileList[profileIndex].apn,
profileList[profileIndex].user, profileList[profileIndex].password,
profileList[profileIndex].auth, profileList[profileIndex].ipfamily);
char profilename[MAX_PATH];
sprintf(profilename, "profile%d", profileIndex + 1);
writeStringVlaue(profilename, "apn", profileList[profileIndex].apn,
CONFIG_FILE);
writeStringVlaue(profilename, "user", profileList[profileIndex].user,
CONFIG_FILE);
writeStringVlaue(profilename, "password",
profileList[profileIndex].password, CONFIG_FILE);
writeIntValue(profilename, "auth", profileList[profileIndex].auth,
CONFIG_FILE);
writeIntValue(profilename, "ipfamily",
profileList[profileIndex].ipfamily, CONFIG_FILE);
//begin modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
writeStringVlaue(profilename, "pin",
profileList[profileIndex].pin, CONFIG_FILE);
//end modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
}
}
void startConnectCM(struct profile *profileList, bool *connectState)
{
int connectIndex;
int connectProfile;
char *f;
printf("connect visual net interface use:");
f = malloc(sizeof(f));
fgets(f,sizeof(f),stdin);
connectIndex = atoi(f);
free(f);
if (connectIndex < 1 || connectIndex > qmap_num) {
dbg_time("error visual net interface ");
return;
}
printf("connect profile use:");
f = malloc(sizeof(f));
fgets(f,sizeof(f),stdin);
connectProfile = atoi(f);
free(f);
if (connectProfile < 1 || connectProfile > 8) {
dbg_time("error profile id");
return;
}
//begin modified by zhangkaibo modify mantis0048806. 20200605
if (connectState[connectIndex - 1] == true) {
dbg_time(
"visual net interface %d now is connected",
connectIndex);
return;
}
//end modified by zhangkaibo modify mantis0048806. 20200605
dbg_time("Start connect network use instance %d profile %d", connectIndex,
connectProfile);
char cmd[1024];
//./fibicom-dial -n -s -s apn user password auth -4 -6
sprintf(cmd, "-n %d -m %d -s %s %s %s %d", connectIndex, connectProfile,
profileList[connectProfile - 1].apn,
profileList[connectProfile - 1].user,
profileList[connectProfile - 1].password,
profileList[connectProfile - 1].auth);
char *argvCmd[30];
int index = 0;
// DIAL_PROCESS,","-N","4,""-n","2","-m","1","-s","ctnet","","","","-4","-6","-f","temp.txt",NULL;
argvCmd[index] = malloc(256);
sprintf(argvCmd[index++], "%s", DIAL_PROCESS);
argvCmd[index] = malloc(5);
sprintf(argvCmd[index++], "-N");
argvCmd[index] = malloc(256);
sprintf(argvCmd[index++], "%d", qmap_num);
argvCmd[index] = malloc(5);
sprintf(argvCmd[index++], "-n");
argvCmd[index] = malloc(256);
sprintf(argvCmd[index++], "%d", connectIndex);
argvCmd[index] = malloc(5);
sprintf(argvCmd[index++], "-m");
argvCmd[index] = malloc(256);
sprintf(argvCmd[index++], "%d", connectProfile);
argvCmd[index] = malloc(5);
sprintf(argvCmd[index++], "-s");
argvCmd[index] = malloc(256);
sprintf(argvCmd[index++], "%s", profileList[connectProfile - 1].apn);
if (strlen(profileList[connectProfile - 1].user) > 0) {
argvCmd[index] = malloc(256);
sprintf(argvCmd[index++], "%s", profileList[connectProfile - 1].user);
argvCmd[index] = malloc(256);
sprintf(argvCmd[index++], "%s",
profileList[connectProfile - 1].password);
argvCmd[index] = malloc(256);
sprintf(argvCmd[index++], "%d", profileList[connectProfile - 1].auth);
}
if (profileList[connectProfile - 1].ipfamily == 2) {
argvCmd[index] = malloc(5);
//begin modified by zhangkaibo fix ipv6 dial process flow. mantis 0048789 20200605
sprintf(argvCmd[index++], "-6");
//end modified by zhangkaibo fix ipv6 dial process flow. mantis 0048789 20200605
} else if (profileList[connectProfile - 1].ipfamily == 3) {
argvCmd[index] = malloc(5);
sprintf(argvCmd[index++], "-4");
argvCmd[index] = malloc(5);
sprintf(argvCmd[index++], "-6");
} else {
argvCmd[index] = malloc(5);
sprintf(argvCmd[index++], "-4");
}
//begin modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
if (strlen(profileList[connectProfile - 1].pin) > 0) {
argvCmd[index] = malloc(5);
sprintf(argvCmd[index++], "-p");
argvCmd[index] = malloc(256);
sprintf(argvCmd[index++], "%s", profileList[connectProfile - 1].pin);
}
argvCmd[index] = malloc(5);
//end modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
sprintf(argvCmd[index++], "-f");
argvCmd[index] = malloc(256);
sprintf(argvCmd[index++], "instance%d.txt", connectIndex);
argvCmd[index] = NULL;
char temp[MAX_PATH];
sprintf(temp, "rm -f instance%d.txt", connectIndex);
system(temp);
if (0 == fork()) {
int *connectPids = (int *)shm;
connectPids[connectIndex - 1] = getpid();
dbg_time("exec pid %d", connectPids[connectIndex - 1]);
char tempcmd[MAX_PATH];
sprintf(tempcmd, "./%s", DIAL_PROCESS);
execvp(tempcmd, argvCmd);
// system(cmd);
//begin modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
}
//2021-02-01 willa.liu@fibocom.com changed begin for support mantis 0069837
//for(int ii=0; ii < index;ii++)
int ii;
for(ii = 0;ii < index;ii++)
//2021-02-01 willa.liu@fibocom.com changed end for support mantis 0069837
{
printf("%s ",argvCmd[ii]);
free(argvCmd[ii]);
}
printf("\r\n");
connectState[connectIndex - 1] = true;
}
int main(int argc, char *argv[])
{
struct profile profileList[MAX_QMAP_NUM];
char *f;
int profileIndex;
int opsCode = -1;
int ret=0;
/* Exit if the process is already running */
lock_file = open("/tmp/single_proc.lock", O_CREAT|O_RDWR, 0666);
ret = flock(lock_file, LOCK_EX|LOCK_NB);
if (ret)
{
if (EWOULDBLOCK == errno)
{
dbg_time("The Fibocom multi-pdn-manager is already running! So killall multi-pdn-manager!");
system("killall -9 fibocom-dial");
system("killall -9 multi-pdn-manager");
}
}
else
{
char buffer[64];
sprintf(buffer, "pid:%d\n", getpid());
write(lock_file, buffer, strlen(buffer));
system("killall -9 fibocom-dial");
dbg_time("Start Fibocom multi-pdn-manager!\n");
}
system("clear");
get_pcie_mode();
signal(SIGCHLD, SIG_IGN);
// read from config
ret = loadConfigFromIni(profileList, connectState);
if(ret == -1)
{
dbg_time("Fibocom multi-pdn-manager %s", VERSION_STRING());
dbg_time("Fibocom manager current qmap_num is %d,not support multi-pdn", qmap_num);
dbg_time("please use \"echo 4 > /sys/class/net/usb0/qmap_num\",set driver to multi mode");
return -1;
}
if(ret == -2)
return -2;
initShareMemory();
signal(SIGINT, SIGINT_handle);
if (is_pcie_dial())
{
dbg_time("start qmi proxy server");
//system("./fibo_qmimsg_server -d /dev/mhi_QMI0 &");
}
while (1)
{
// show tips
dbg_time("Fibocom multi-pdn-manager %s", VERSION_STRING());
dbg_time("Fibocom manager current qmap_num is %d", qmap_num);
for (profileIndex = 0; profileIndex < qmap_num; profileIndex++)
{
dbg_time("Fibocom manager sub-instance%d %s", profileIndex + 1,
connectState[profileIndex] ? "Connected" : "Disconnected");
}
printf("Please select an action[0-9]\n");
printf("1.show profile setting\n");
printf("2.set profile setting\n");
printf("3.connect to network\n");
printf("4.disconnect to network\n");
printf("5.show connect log\n");
printf("6.reload profile setting\n");
printf("7.save profile setting\n");
printf("8.show max instance number\n");
printf("9.set max instance number\n");
printf("0.exit\n");
// get operate
printf("input [0-9]: ");
f = malloc(sizeof(f));
//begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605
fgets(f,sizeof(f),stdin);
if(!IsInt(f))
{
dbg_time("invalid input");
printf("Press any key to continus");
getchar();
system("clear");
continue;
}
//end modified by zhangkaibo limit input parameters. mantis 0048965 20200605
opsCode = atoi(f);
free(f);
// select operate
switch (opsCode)
{
case 1:
//begin modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
for (profileIndex = 0; profileIndex < qmap_num; profileIndex++)
{
dbg_time(
"Fibocom manager \nprofile%d apn:\"%s\" username:\"%s\" "
"password: \"%s\" auth: \"%d\" ip family: \"%d\" pin:\"%s\"",
profileIndex + 1, profileList[profileIndex].apn,
profileList[profileIndex].user,
profileList[profileIndex].password,
profileList[profileIndex].auth,
profileList[profileIndex].ipfamily,
profileList[profileIndex].pin);
}
//end modified by zhangkaibo add sim pin operate. mantis 0049142 20200612
break;
case 2:
{
modifyProfile(profileList);
}
break;
case 3:
{
startConnectCM(profileList, connectState);
break;
}
case 4:
{
int connectIndex;
printf("disconnect visual net interface :");
f = malloc(sizeof(f));
fgets(f,sizeof(f),stdin);
connectIndex = atoi(f);
free(f);
int *connectPids = (int *)shm;
if (connectIndex < 1 || connectIndex > qmap_num)
{
dbg_time("error visual net interface id");
break;
}
if (connectState[connectIndex - 1] == false)
{
dbg_time("visual net interface %d now is disconnected", connectIndex);
break;
}
dbg_time("kill pid %d", connectPids[connectIndex - 1]);
kill(connectPids[connectIndex - 1], SIGINT);
connectState[connectIndex - 1] = false;
}
break;
case 5:
{
int connectIndex;
printf("show visual net interface :");
f = malloc(sizeof(f));
fgets(f,sizeof(f),stdin);
connectIndex = atoi(f);
free(f);
if (connectIndex < 1 || connectIndex > qmap_num)
{
dbg_time("error visual net interface id");
break;
}
char temp[MAX_PATH];
sprintf(temp, "cat instance%d.txt", connectIndex);
system(temp);
}
break;
case 6:
{
loadConfigFromIni(profileList, connectState);
}
break;
case 7:
{
saveConfigToIni(profileList);
}
break;
case 8:
printf("qmap_num : %d", qmap_num);
break;
case 9:
{
int temp_qmap;
printf("set qmap_num :");
f = malloc(sizeof(f));
fgets(f,sizeof(f),stdin);
temp_qmap = atoi(f);
free(f);
if (temp_qmap < 1 || temp_qmap > 8)
{
dbg_time("error qmap_num id");
break;
}
qmap_num = temp_qmap;
}
break;
case 0:
printf("exit? [Y/N] :");
f = malloc(sizeof(f));
fgets(f,sizeof(f),stdin);
if (f[0] == 'y' || f[0] == 'Y')
goto __main_exit;
break;
default:
dbg_time("invalid input");
};
printf("Press any key to continus");
getchar();
system("clear");
}
__main_exit:
{
int *connectPids = (int *)shm;
int cIndex;
for(cIndex = 1 ; cIndex <= qmap_num ; cIndex++)
{
dbg_time("kill pid %d", connectPids[cIndex - 1]);
kill(connectPids[cIndex - 1], SIGINT);
connectState[cIndex - 1] = false;
}
//system("ps -ef|grep fibo|grep -v grep|cut -c 9-15|xargs kill");
}
destoryShareMemory();
close(lock_file); // 不要忘记释放文件指针
return 0;
}