FreeCalypso > hg > osmo-playpen
comparison smsc-daemon/main.c @ 7:22ddb71f6883
smsc-daemon: convert to setting IPA name on the command line
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 25 Aug 2023 14:47:24 -0800 |
parents | cef4677a4cf8 |
children | d9db8661d9f3 |
comparison
equal
deleted
inserted
replaced
6:18b7f75fed9b | 7:22ddb71f6883 |
---|---|
21 #include <osmocom/core/application.h> | 21 #include <osmocom/core/application.h> |
22 #include <osmocom/core/utils.h> | 22 #include <osmocom/core/utils.h> |
23 #include <osmocom/core/logging.h> | 23 #include <osmocom/core/logging.h> |
24 | 24 |
25 #include <osmocom/gsm/gsup.h> | 25 #include <osmocom/gsm/gsup.h> |
26 #include <osmocom/gsm/ipa.h> | |
26 | 27 |
27 #include <osmocom/gsupclient/gsup_client.h> | 28 #include <osmocom/gsupclient/gsup_client.h> |
28 | 29 |
29 #include "logging.h" | 30 #include "logging.h" |
30 | 31 |
31 extern int gsupc_read_cb(struct osmo_gsup_client *gsupc, struct msgb *msg); | 32 extern int gsupc_read_cb(struct osmo_gsup_client *gsupc, struct msgb *msg); |
32 | 33 |
33 char smsc_addr_num[21]; /* maximum of 20 digits per GSM 04.11 */ | 34 #define MAX_IPA_NAME 31 |
34 uint8_t smsc_addr_ton_npi; | 35 |
35 FILE *smsc_log_file; | 36 FILE *smsc_log_file; |
36 char smsc_gsup_name[26]; | 37 char smsc_ipa_name[MAX_IPA_NAME+1]; |
38 struct ipaccess_unit gsup_ipa_dev; | |
37 struct osmo_gsup_client *g_gc; | 39 struct osmo_gsup_client *g_gc; |
38 | 40 |
39 static struct log_info_cat default_categories[] = { | 41 static struct log_info_cat default_categories[] = { |
40 [DMAIN] = { | 42 [DMAIN] = { |
41 .name = "DMAIN", | 43 .name = "DMAIN", |
47 static const struct log_info smsc_log_info = { | 49 static const struct log_info smsc_log_info = { |
48 .cat = default_categories, | 50 .cat = default_categories, |
49 .num_cat = ARRAY_SIZE(default_categories), | 51 .num_cat = ARRAY_SIZE(default_categories), |
50 }; | 52 }; |
51 | 53 |
52 static void parse_smsc_addr_arg(char *arg) | 54 static void set_ipa_name(const char *arg) |
53 { | 55 { |
54 char *cp, *dp, *endp; | 56 if (strlen(arg) > MAX_IPA_NAME) { |
55 unsigned ndig; | 57 fprintf(stderr, "error: IPA name argument is too long\n"); |
56 | |
57 cp = arg; | |
58 dp = smsc_addr_num; | |
59 ndig = 0; | |
60 while (isdigit(*cp)) { | |
61 if (ndig >= 20) { | |
62 fprintf(stderr, | |
63 "error: SMSC address argument exceeds GSM 04.11 limit of 20 digits\n"); | |
64 exit(1); | |
65 } | |
66 *dp++ = *cp++; | |
67 ndig++; | |
68 } | |
69 if (!ndig) { | |
70 invalid: fprintf(stderr, | |
71 "error: SMSC address argument \"%s\" is invalid\n", | |
72 arg); | |
73 exit(1); | 58 exit(1); |
74 } | 59 } |
75 if (!*cp) { | 60 strcpy(smsc_ipa_name, arg); |
76 /* default to TON=1, NPI=1, i.e., a pretend Global Title */ | |
77 smsc_addr_ton_npi = 0x91; | |
78 return; | |
79 } | |
80 if (*cp++ != ',') | |
81 goto invalid; | |
82 if (!*cp) | |
83 goto invalid; | |
84 smsc_addr_ton_npi = strtoul(cp, &endp, 0); | |
85 if (*endp) | |
86 goto invalid; | |
87 } | 61 } |
88 | 62 |
89 static void open_log_file(char *filename) | 63 static void open_log_file(const char *filename) |
90 { | 64 { |
91 smsc_log_file = fopen(filename, "a"); | 65 smsc_log_file = fopen(filename, "a"); |
92 if (!smsc_log_file) { | 66 if (!smsc_log_file) { |
93 perror(filename); | 67 perror(filename); |
94 exit(1); | 68 exit(1); |
95 } | 69 } |
70 } | |
71 | |
72 static void build_ipa_dev(void) | |
73 { | |
74 gsup_ipa_dev.unit_name = "SMSC"; | |
75 gsup_ipa_dev.serno = smsc_ipa_name; | |
96 } | 76 } |
97 | 77 |
98 int main(int argc, char **argv) | 78 int main(int argc, char **argv) |
99 { | 79 { |
100 char *server_host = "127.0.0.1"; | 80 char *server_host = "127.0.0.1"; |
102 void *ctx = talloc_named_const(NULL, 0, "proto-smsc"); | 82 void *ctx = talloc_named_const(NULL, 0, "proto-smsc"); |
103 | 83 |
104 osmo_init_logging2(ctx, &smsc_log_info); | 84 osmo_init_logging2(ctx, &smsc_log_info); |
105 | 85 |
106 if (argc != 3) { | 86 if (argc != 3) { |
107 fprintf(stderr, "usage: %s smsc-addr logfile\n", argv[0]); | 87 fprintf(stderr, "usage: %s ipa-name logfile\n", argv[0]); |
108 exit(1); | 88 exit(1); |
109 } | 89 } |
110 parse_smsc_addr_arg(argv[1]); | 90 set_ipa_name(argv[1]); |
111 open_log_file(argv[2]); | 91 open_log_file(argv[2]); |
112 | 92 |
113 sprintf(smsc_gsup_name, "SMSC-%s", smsc_addr_num); | 93 build_ipa_dev(); |
114 g_gc = osmo_gsup_client_create(ctx, smsc_gsup_name, server_host, | 94 g_gc = osmo_gsup_client_create2(ctx, &gsup_ipa_dev, server_host, |
115 server_port, gsupc_read_cb, NULL); | 95 server_port, gsupc_read_cb, NULL); |
116 if (!g_gc) { | 96 if (!g_gc) { |
117 fprintf(stderr, "error: osmo_gsup_client_create() failed\n"); | 97 fprintf(stderr, "error: osmo_gsup_client_create2() failed\n"); |
118 exit(1); | 98 exit(1); |
119 } | 99 } |
120 | 100 |
121 while (1) { | 101 while (1) { |
122 osmo_select_main(0); | 102 osmo_select_main(0); |