diff options
author | Harald Welte <laforge@netfilter.org> | 2009-08-09 19:55:21 +0200 |
---|---|---|
committer | Harald Welte <laforge@netfilter.org> | 2009-08-09 19:55:21 +0200 |
commit | 1e0a8ea4d53226812a358d22c103daea0dddcfb5 (patch) | |
tree | 3c7eed70c6fa077d19f1f4785d137cc17ca21be6 /openbsc/src/vty_interface.c | |
parent | 42581829ec2a79ef82c813b8212da76f514aa4f4 (diff) | |
parent | 369cc27f3b7da119b41527de14c447f44b4bfaef (diff) |
Merge branch 'master' into config_file
Conflicts:
openbsc/src/vty_interface.c
Diffstat (limited to 'openbsc/src/vty_interface.c')
-rw-r--r-- | openbsc/src/vty_interface.c | 82 |
1 files changed, 74 insertions, 8 deletions
diff --git a/openbsc/src/vty_interface.c b/openbsc/src/vty_interface.c index b4aa9f4f5..05b0070a1 100644 --- a/openbsc/src/vty_interface.c +++ b/openbsc/src/vty_interface.c @@ -23,6 +23,7 @@ #include <sys/types.h> #include <vty/command.h> +#include <vty/buffer.h> #include <vty/vty.h> #include <arpa/inet.h> @@ -32,6 +33,7 @@ #include <openbsc/gsm_subscriber.h> #include <openbsc/e1_input.h> #include <openbsc/abis_nm.h> +#include <openbsc/gsm_utils.h> #include <openbsc/db.h> #include <openbsc/talloc.h> @@ -1139,16 +1141,74 @@ DEFUN(sms_send_pend, return CMD_SUCCESS; } +static struct buffer *argv_to_buffer(int argc, const char *argv[], int base) +{ + struct buffer *b = buffer_new(1024); + int i; + + if (!b) + return NULL; + + for (i = base; i < argc; i++) { + buffer_putstr(b, argv[i]); + buffer_putc(b, ' '); + } + buffer_putc(b, '\0'); + + return b; +} + +static int _send_sms_buffer(struct gsm_subscriber *receiver, + struct buffer *b) +{ + struct gsm_sms *sms = sms_alloc(); + + if (!sms) + return CMD_WARNING; + + if (!receiver->lac) { + /* subscriber currently not attached, store in database? */ + subscr_put(sms->receiver); + return CMD_WARNING; + } + + sms->receiver = receiver; + strncpy(sms->text, buffer_getstr(b), sizeof(sms->text)-1); + + /* FIXME: don't use ID 1 static */ + sms->sender = subscr_get_by_id(gsmnet, 1); + sms->reply_path_req = 0; + sms->status_rep_req = 0; + sms->ud_hdr_ind = 0; + sms->protocol_id = 0; /* implicit */ + sms->data_coding_scheme = 0; /* default 7bit */ + strncpy(sms->dest_addr, receiver->extension, sizeof(sms->dest_addr)-1); + /* Generate user_data */ + sms->user_data_len = gsm_7bit_encode(sms->user_data, sms->text); + + gsm411_send_sms_subscr(sms->receiver, sms); + + return CMD_SUCCESS; +} + DEFUN(sms_send_ext, sms_send_ext_cmd, "sms send extension EXTEN .LINE", "Send a message to a subscriber identified by EXTEN") { - struct gsm_sms *sms; + struct gsm_subscriber *receiver; + struct buffer *b; + int rc; + + receiver = subscr_get_by_extension(gsmnet, argv[0]); + if (!receiver) + return CMD_WARNING; - //gsm411_send_sms_subscr(sms->receiver, sms); + b = argv_to_buffer(argc, argv, 1); + rc = _send_sms_buffer(receiver, b); + buffer_free(b); - return CMD_SUCCESS; + return rc; } DEFUN(sms_send_imsi, @@ -1156,11 +1216,19 @@ DEFUN(sms_send_imsi, "sms send imsi IMSI .LINE", "Send a message to a subscriber identified by IMSI") { - struct gsm_sms *sms; + struct gsm_subscriber *receiver; + struct buffer *b; + int rc; + + receiver = subscr_get_by_imsi(gsmnet, argv[0]); + if (!receiver) + return CMD_WARNING; - //gsm411_send_sms_subscr(sms->receiver, sms); + b = argv_to_buffer(argc, argv, 1); + rc = _send_sms_buffer(receiver, b); + buffer_free(b); - return CMD_SUCCESS; + return rc; } @@ -1234,10 +1302,8 @@ int bsc_vty_init(struct gsm_network *net) install_element(VIEW_NODE, &show_subscr_cmd); install_element(VIEW_NODE, &sms_send_pend_cmd); -#if 0 install_element(VIEW_NODE, &sms_send_ext_cmd); install_element(VIEW_NODE, &sms_send_imsi_cmd); -#endif install_element(CONFIG_NODE, &cfg_net_cmd); install_node(&net_node, config_write_net); |