⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smsc.c

📁 gnu的专业网关smpp协议支持源代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
            error(errno, "Error doing select for socket");            goto error;        } else if (ret == 0)            goto got_data;        if (smsc->buflen == smsc->bufsize) {            p = gw_realloc(smsc->buffer, smsc->bufsize * 2);            smsc->buffer = p;            smsc->bufsize *= 2;        }        ret = read(smsc->socket,                   smsc->buffer + smsc->buflen,                   1);        if (ret == -1) {            error(errno, "Reading from `%s' port `%d' failed.",                  smsc->hostname, smsc->port);            goto error;        }        if (ret == 0)            goto eof;        smsc->buflen += ret;        bytes_read += ret;        if (bytes_read >= MAX_READ_INTO_BUFFER)            break;    }eof:    ret = 0;    goto unblock;got_data:    ret = 1;    goto unblock;error:    ret = -1;    goto unblock;unblock:    return ret;}void smscenter_remove_from_buffer(SMSCenter *smsc, size_t n){    memmove(smsc->buffer, smsc->buffer + n, smsc->buflen - n);    smsc->buflen -= n;}/* * Lock an SMSCenter. Return -1 for error, 0 for OK.  */static void smscenter_lock(SMSCenter *smsc){    if (smsc->type == SMSC_TYPE_DELETED)        error(0, "smscenter_lock called on DELETED SMSC.");    mutex_lock(smsc->mutex);}/* * Unlock an SMSCenter. Return -1 for error, 0 for OK. */static void smscenter_unlock(SMSCenter *smsc){    mutex_unlock(smsc->mutex);}/*------------------------------------------------------------------------ * Public SMSC functions */SMSCenter *smsc_open(CfgGroup *grp){    SMSCenter *smsc;    Octstr *type, *host, *username, *password, *phone, *device;    Octstr *preferred_prefix, *allowed_prefix, *denied_prefix;    Octstr *alt_chars, *allow_ip;    Octstr *sema_smscnua, *sema_homenua, *sema_report;    Octstr *at_modemtype, *at_pin, *at_validityperiod;    Octstr *sender_prefix;    long iwaitreport;    long port, receive_port, our_port;    long keepalive;    long ois_debug;    long alt_dcs;    int typeno;    type = cfg_get(grp, octstr_imm("smsc"));    if (type == NULL) {	error(0, "Required field 'smsc' missing for smsc group.");	return NULL;    }    if (octstr_compare(type, octstr_imm("cimd")) == 0)    	typeno = SMSC_TYPE_CIMD;    else if (octstr_compare(type, octstr_imm("cimd2")) == 0)    	typeno = SMSC_TYPE_CIMD2;    else if (octstr_compare(type, octstr_imm("emi")) == 0)    	typeno = SMSC_TYPE_EMI;    else if (octstr_compare(type, octstr_imm("emi_ip")) == 0)    	typeno = SMSC_TYPE_EMI_IP;    else if (octstr_compare(type, octstr_imm("sema")) == 0)    	typeno = SMSC_TYPE_SEMA_X28;    else if (octstr_compare(type, octstr_imm("ois")) == 0)    	typeno = SMSC_TYPE_OIS;    else if (octstr_compare(type, octstr_imm("at")) == 0)    	typeno = SMSC_TYPE_AT;    else {	error(0, "Unknown SMSC type '%s'", octstr_get_cstr(type));	octstr_destroy(type);	return NULL;    }    host = cfg_get(grp, octstr_imm("host"));    if (cfg_get_integer(&port, grp, octstr_imm("port")) == -1)    	port = 0;    if (cfg_get_integer(&receive_port, grp, octstr_imm("receive-port")) == -1)    	receive_port = 0;    if (cfg_get_integer(&our_port, grp, octstr_imm("our-port")) == -1)    	our_port = 0;    username = cfg_get(grp, octstr_imm("smsc-username"));    password = cfg_get(grp, octstr_imm("smsc-password"));    phone = cfg_get(grp, octstr_imm("phone"));    device = cfg_get(grp, octstr_imm("device"));    preferred_prefix = cfg_get(grp, octstr_imm("preferred-prefix"));    allowed_prefix = cfg_get(grp, octstr_imm("allowed-prefix"));    denied_prefix = cfg_get(grp, octstr_imm("denied-prefix"));    alt_chars = cfg_get(grp, octstr_imm("alt-charset"));    allow_ip = cfg_get(grp, octstr_imm("connect-allow-ip"));    sema_smscnua = cfg_get(grp, octstr_imm("smsc_nua"));    sema_homenua = cfg_get(grp, octstr_imm("home_nua"));    sema_report = cfg_get(grp, octstr_imm("wait_report"));    if (sema_report == NULL)    	iwaitreport = 1;    else    	octstr_parse_long(&iwaitreport, sema_report, 0, 0);    if (cfg_get_integer(&keepalive, grp, octstr_imm("keepalive")) == -1)    	keepalive = 0;    if (cfg_get_integer(&alt_dcs, grp, octstr_imm("alt-dcs")) == -1)    	alt_dcs = 0;    if (alt_dcs > 1)        alt_dcs = 1;    if (cfg_get_integer(&ois_debug, grp, octstr_imm("ois-debug-level")) == -1)    	ois_debug = 0;    at_modemtype = cfg_get(grp, octstr_imm("modemtype"));    at_pin = cfg_get(grp, octstr_imm("pin"));    at_validityperiod = cfg_get(grp, octstr_imm("validityperiod"));    sender_prefix = cfg_get(grp, octstr_imm("sender-prefix"));    if (sender_prefix == NULL)        sender_prefix = octstr_create("never");    smsc = NULL;    switch (typeno) {    case SMSC_TYPE_CIMD:        if (host == NULL || port == 0 || username == NULL || password == NULL)            error(0, "Required field missing for CIMD center.");        else            smsc = cimd_open(octstr_get_cstr(host),	    	    	     port, 	    	    	     octstr_get_cstr(username), 			     octstr_get_cstr(password));        break;    case SMSC_TYPE_CIMD2:        if (host == NULL || port == 0 || username == NULL || password == NULL)            error(0, "Required field missing for CIMD 2 center.");        else            smsc = cimd2_open(host,	    	    	      port, 			      username, 			      password, 			      keepalive,                              sender_prefix);        break;    case SMSC_TYPE_EMI:        if (phone == NULL || device == NULL || username == NULL ||            password == NULL)            error(0, "Required field missing for EMI center.");        else            smsc = emi_open(octstr_get_cstr(phone), 	    	    	    octstr_get_cstr(device), 			    octstr_get_cstr(username), 			    octstr_get_cstr(password));        break;    case SMSC_TYPE_EMI_IP:        if (host == NULL || port == 0)            error(0, "Required field missing for EMI IP center.");        else	    smsc = emi_open_ip(octstr_get_cstr(host), 	    	    	       port, 			       username ? octstr_get_cstr(username) : 0, 			       password ? octstr_get_cstr(password) : 0,                               receive_port, 			       allow_ip ? octstr_get_cstr(allow_ip) : 0, 			       our_port);        break;    case SMSC_TYPE_SEMA_X28:        if (device == NULL || sema_smscnua == NULL || sema_homenua == NULL)            error(0, "Required field missing for SEMA center.");        else            smsc = sema_open(octstr_get_cstr(sema_smscnua), 	    	    	     octstr_get_cstr(sema_homenua), 			     octstr_get_cstr(device),                             iwaitreport);        break;    case SMSC_TYPE_OIS:        if (host == NULL || port == 0 || receive_port == 0)            error(0, "Required field missing for OIS center.");        else            smsc = ois_open(receive_port, 	    	    	    octstr_get_cstr(host), 			    port, 	    	    	    ois_debug);        break;    case SMSC_TYPE_AT:        if (device == NULL)            error(0, "Required field missing for AT virtual center.");        else            smsc = at_open(octstr_get_cstr(device), 	    	    	   at_modemtype ? octstr_get_cstr(at_modemtype) : 0, 			   at_pin ? octstr_get_cstr(at_pin) : 0,	    	    	   at_validityperiod ? 			       octstr_get_cstr(at_validityperiod) : 0,			       alt_dcs);        break;        /* add new SMSCes here */    default: 		/* Unknown SMSC type */        break;    }    if (smsc != NULL) {	if (cfg_get_integer(&smsc->alt_charset, grp, 	    	    	    octstr_imm("alt-charset")) == -1)	    smsc->alt_charset = 0;    	if (preferred_prefix == NULL)	    smsc->preferred_prefix = NULL;	else	    smsc->preferred_prefix = 	    	gw_strdup(octstr_get_cstr(preferred_prefix));    	if (allowed_prefix == NULL)	    smsc->allowed_prefix = NULL;	else	    smsc->allowed_prefix = gw_strdup(octstr_get_cstr(allowed_prefix));    	if (denied_prefix == NULL)	    smsc->denied_prefix = NULL;	else	    smsc->denied_prefix = gw_strdup(octstr_get_cstr(denied_prefix));    }    octstr_destroy(type);    octstr_destroy(host);    octstr_destroy(username);    octstr_destroy(password);    octstr_destroy(phone);    octstr_destroy(device);    octstr_destroy(preferred_prefix);    octstr_destroy(denied_prefix);    octstr_destroy(allowed_prefix);    octstr_destroy(alt_chars);    octstr_destroy(allow_ip);    octstr_destroy(sema_smscnua);    octstr_destroy(sema_homenua);    octstr_destroy(sema_report);    octstr_destroy(at_modemtype);    octstr_destroy(at_pin);    octstr_destroy(at_validityperiod);    octstr_destroy(sender_prefix);    return smsc;}int smsc_reopen(SMSCenter *smsc){    int ret;    if (smsc->killed)	return -2;    smscenter_lock(smsc);    switch (smsc->type) {    case SMSC_TYPE_CIMD:        ret = cimd_reopen(smsc);	break;    case SMSC_TYPE_CIMD2:        ret = cimd2_reopen(smsc);	break;    case SMSC_TYPE_EMI_IP:        ret = emi_reopen_ip(smsc);	break;    case SMSC_TYPE_EMI:        ret = emi_reopen(smsc);	break;    case SMSC_TYPE_SEMA_X28:        ret = sema_reopen(smsc);	break;    case SMSC_TYPE_OIS:        ret = ois_reopen(smsc);	break;    case SMSC_TYPE_AT:        ret = at_reopen(smsc);	break;        /* add new SMSCes here */    default: 		/* Unknown SMSC type */        ret = -2; 		/* no use */    }    smscenter_unlock(smsc);    return ret;}char *smsc_name(SMSCenter *smsc){    return smsc->name;}int smsc_close(SMSCenter *smsc){    int errors = 0;    if (smsc == NULL)        return 0;    smscenter_lock(smsc);    switch (smsc->type) {    case SMSC_TYPE_CIMD:        if (cimd_close(smsc) == -1)            errors = 1;        break;    case SMSC_TYPE_CIMD2:        if (cimd2_close(smsc) == -1)            errors = 1;        break;    case SMSC_TYPE_EMI:        if (emi_close(smsc) == -1)            errors = 1;        break;    case SMSC_TYPE_EMI_IP:        if (emi_close_ip(smsc) == -1)            errors = 1;        break;    case SMSC_TYPE_SEMA_X28:        if (sema_close(smsc) == -1)            errors = 1;        break;    case SMSC_TYPE_OIS:        if (ois_close(smsc) == -1)            errors = 1;        break;    case SMSC_TYPE_AT:        if (at_close(smsc) == -1)            errors = 1;        break;        /* add new SMSCes here */    default: 		/* Unknown SMSC type */        break;    }    /*     smsc->type = SMSC_TYPE_DELETED;     smscenter_unlock(smsc);    */    if (errors)        return -1;    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -