📄 smsc.c
字号:
/* * smsc.c - implement interface to SMS centers as defined by smsc.h * * Lars Wirzenius and Kalle Marjola for WapIT Ltd. *//* NOTE: private functions (only for smsc_* use) are named smscenter_*, * public functions (used by gateway) are named smsc_* */#include <errno.h>#include <signal.h>#include <stdarg.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <unistd.h>#include <sys/time.h>#include "gwlib/gwlib.h"#include "smsc.h"#include "smsc_p.h"#include "msg.h"/* * Maximum number of characters for read_into_buffer to read at a time. */#define MAX_READ_INTO_BUFFER (1024)static void smscenter_lock(SMSCenter *smsc);static void smscenter_unlock(SMSCenter *smsc);/*-------------------------------------------------------------------- * TODO: WAP WDP functions! *//*-------------------------------------------------------------------- * smscenter functions */SMSCenter *smscenter_construct(void){ SMSCenter *smsc; static int next_id = 1; smsc = gw_malloc(sizeof(SMSCenter)); smsc->killed = 0; smsc->type = SMSC_TYPE_DELETED; smsc->preferred_prefix = NULL; smsc->allowed_prefix = NULL; smsc->denied_prefix = NULL; smsc->alt_charset = 0; smsc->keepalive = 0; smsc->mutex = mutex_create(); sprintf(smsc->name, "Unknown SMSC"); smsc->id = next_id++; /* FAKE */ smsc->hostname = NULL; smsc->port = -1; smsc->socket = -1; /* CIMD */ smsc->cimd_hostname = NULL; smsc->cimd_port = -1; smsc->cimd_username = NULL; smsc->cimd_password = NULL; /* CIMD 2 */ smsc->cimd2_hostname = NULL; smsc->cimd2_port = -1; smsc->cimd2_username = NULL; smsc->cimd2_password = NULL; smsc->cimd2_send_seq = 1; smsc->cimd2_receive_seq = 0; smsc->cimd2_inbuffer = NULL; smsc->cimd2_received = NULL; smsc->cimd2_error = 0; smsc->cimd2_next_ping = 0; /* EMI */ smsc->emi_phonenum = NULL; smsc->emi_serialdevice = NULL; smsc->emi_username = NULL; smsc->emi_password = NULL; /* EMI IP */ smsc->emi_hostname = NULL; smsc->emi_port = -1; smsc->emi_backup_fd = -1; smsc->emi_backup_port = -1; smsc->emi_backup_allow_ip = NULL; smsc->emi_our_port = -1; smsc->emi_secondary_fd = -1; /* SEMA SMS2000 */ smsc->sema_smscnua = NULL; smsc->sema_homenua = NULL; smsc->sema_serialdevice = NULL; smsc->sema_fd = -1; /* SEMA SMS2000 OIS X.25 */ smsc->ois_alive = 0; smsc->ois_alive2 = 0; smsc->ois_received_mo = NULL; smsc->ois_ack_debt = 0; smsc->ois_flags = 0; smsc->ois_listening_socket = -1; smsc->ois_socket = -1; smsc->ois_buflen = 0; smsc->ois_bufsize = 0; smsc->ois_buffer = 0; /* AT Wireless modems (GSM 03.40 version 7.4.0) */ smsc->at_serialdevice = NULL; smsc->at_fd = -1; smsc->at_modemtype = NULL; smsc->at_received = NULL; smsc->at_inbuffer = NULL; smsc->at_pin = NULL; smsc->at_validityperiod = NULL; smsc->at_alt_dcs = 0; /* add new SMSCes here */ /* Memory */ smsc->buflen = 0; smsc->bufsize = 10*1024; smsc->buffer = gw_malloc(smsc->bufsize); memset(smsc->buffer, 0, smsc->bufsize); return smsc;}void smscenter_destruct(SMSCenter *smsc){ if (smsc == NULL) return; /* FAKE */ gw_free(smsc->hostname); /* CIMD */ gw_free(smsc->cimd_hostname); gw_free(smsc->cimd_username); gw_free(smsc->cimd_password); /* CIMD 2 */ octstr_destroy(smsc->cimd2_hostname); octstr_destroy(smsc->cimd2_username); octstr_destroy(smsc->cimd2_password); octstr_destroy(smsc->cimd2_inbuffer); octstr_destroy(smsc->sender_prefix); list_destroy(smsc->cimd2_received, NULL); /* EMI */ gw_free(smsc->emi_phonenum); gw_free(smsc->emi_serialdevice); gw_free(smsc->emi_username); gw_free(smsc->emi_password); /* EMI IP */ gw_free(smsc->emi_hostname); gw_free(smsc->emi_backup_allow_ip); /* SEMA */ gw_free(smsc->sema_smscnua); gw_free(smsc->sema_homenua); gw_free(smsc->sema_serialdevice); /* OIS */ ois_delete_queue(smsc); gw_free(smsc->ois_buffer); /* AT */ gw_free(smsc->at_serialdevice); gw_free(smsc->at_modemtype); gw_free(smsc->at_pin); list_destroy(smsc->at_received, NULL); gw_free(smsc->at_inbuffer); /* add new SMSCes here */ /* Other fields */ mutex_destroy(smsc->mutex); /* Memory */ gw_free(smsc->buffer); gw_free(smsc);}int smscenter_submit_msg(SMSCenter *smsc, Msg *msg){ smscenter_lock(smsc); switch (smsc->type) { case SMSC_TYPE_CIMD: if (cimd_submit_msg(smsc, msg) == -1) goto error; break; case SMSC_TYPE_CIMD2: if (cimd2_submit_msg(smsc, msg) == -1) goto error; break; case SMSC_TYPE_EMI: case SMSC_TYPE_EMI_IP: if (emi_submit_msg(smsc, msg) == -1) goto error; break; case SMSC_TYPE_SEMA_X28: if (sema_submit_msg(smsc, msg) == -1) goto error; break; case SMSC_TYPE_OIS: if (ois_submit_msg(smsc, msg) == -1) goto error; break; case SMSC_TYPE_AT: if (at_submit_msg(smsc, msg) == -1) goto error; break; /* add new SMSCes here */ default: goto error; } smscenter_unlock(smsc); return 0;error: smscenter_unlock(smsc); return -1;}int smscenter_receive_msg(SMSCenter *smsc, Msg **msg){ int ret; smscenter_lock(smsc); switch (smsc->type) { case SMSC_TYPE_CIMD: ret = cimd_receive_msg(smsc, msg); if (ret == -1) goto error; break; case SMSC_TYPE_CIMD2: ret = cimd2_receive_msg(smsc, msg); if (ret == -1) goto error; break; case SMSC_TYPE_EMI: case SMSC_TYPE_EMI_IP: ret = emi_receive_msg(smsc, msg); if (ret == -1) goto error; break; case SMSC_TYPE_OIS: ret = ois_receive_msg(smsc, msg); if (ret == -1) goto error; break; case SMSC_TYPE_SEMA_X28: ret = sema_receive_msg(smsc, msg); if (ret == -1) goto error; break; case SMSC_TYPE_AT: ret = at_receive_msg(smsc, msg); if (ret == -1) goto error; break; default: goto error; } smscenter_unlock(smsc); /* If the SMSC didn't set the timestamp, set it here. */ if (ret == 1 && msg_type(*msg) == sms && (*msg)->sms.time == 0) time(&(*msg)->sms.time); return ret;error: smscenter_unlock(smsc); return -1;}int smscenter_pending_smsmessage(SMSCenter *smsc){ int ret; smscenter_lock(smsc); switch (smsc->type) { case SMSC_TYPE_CIMD: ret = cimd_pending_smsmessage(smsc); if (ret == -1) goto error; break; case SMSC_TYPE_CIMD2: ret = cimd2_pending_smsmessage(smsc); if (ret == -1) goto error; break; case SMSC_TYPE_EMI: case SMSC_TYPE_EMI_IP: ret = emi_pending_smsmessage(smsc); if (ret == -1) goto error; break; case SMSC_TYPE_SEMA_X28: ret = sema_pending_smsmessage(smsc); if (ret == -1) goto error; break; case SMSC_TYPE_OIS: ret = ois_pending_smsmessage(smsc); if (ret == -1) goto error; break; case SMSC_TYPE_AT: ret = at_pending_smsmessage(smsc); if (ret == -1) goto error; break; default: goto error; } smscenter_unlock(smsc); return ret;error: error(0, "smscenter_pending_smsmessage is failing"); smscenter_unlock(smsc); return -1;}int smscenter_read_into_buffer(SMSCenter *smsc){ char *p; int ret, result; fd_set read_fd; struct timeval tv, tvinit; size_t bytes_read; tvinit.tv_sec = 0; tvinit.tv_usec = 1000; bytes_read = 0; result = 0; for (;;) { FD_ZERO(&read_fd); FD_SET(smsc->socket, &read_fd); tv = tvinit; ret = select(smsc->socket + 1, &read_fd, NULL, NULL, &tv); if (ret == -1) { if (errno == EINTR) goto got_data; if (errno == EAGAIN) goto got_data;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -