bsc: Send a TRAP with the locations on a MSC connection

Send the current position when the MSC connection is established.
diff --git a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c
index 6802b42..96e727e 100644
--- a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c
+++ b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c
@@ -1,4 +1,5 @@
 /* (C) 2011 by Daniel Willmann <daniel@totalueberwachung.de>
+ * (C) 2011 by Holger Hans Peter Freyther
  * (C) 2011 by On-Waves
  * All Rights Reserved
  *
@@ -420,6 +421,42 @@
 	return 0;
 }
 
+static int msc_signal_handler(unsigned int subsys, unsigned int signal,
+			void *handler_data, void *signal_data)
+{
+	struct ctrl_cmd *cmd;
+	struct msc_signal_data *msc;
+	struct gsm_network *net;
+	struct gsm_bts *bts;
+	char *loc_fmt = "net.bts.%i.location";
+
+	if (subsys != SS_MSC)
+		return 0;
+	if (signal != S_MSC_AUTHENTICATED)
+		return 0;
+
+	msc = signal_data;
+	cmd = ctrl_cmd_create(msc->data, CTRL_TYPE_TRAP);
+	if (!cmd) {
+		LOGP(DCTRL, LOGL_ERROR, "Failed to create TRAP for location.\n");
+		return 0;
+	}
+
+	cmd->id = "0";
+
+	net = msc->data->network;
+	llist_for_each_entry(bts, &net->bts_list, list) {
+		cmd->node = bts;
+		cmd->variable = talloc_asprintf(cmd, loc_fmt, bts->nr);
+		get_bts_loc(cmd, NULL);
+		osmo_bsc_send_trap(cmd, msc->data->msc_con);
+		talloc_free(cmd->variable);
+	}
+
+	talloc_free(cmd);
+	return 0;
+}
+
 int bsc_ctrl_cmds_install(struct gsm_network *net)
 {
 	int rc;
@@ -436,10 +473,14 @@
 	rc = osmo_signal_register_handler(SS_MSC, &msc_connection_status_trap_cb, net);
 	if (rc)
 		goto end;
+	rc = osmo_signal_register_handler(SS_MSC, msc_signal_handler, NULL);
+	if (rc)
+		goto end;
 	rc = ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_bts_connection_status);
 	if (rc)
 		goto end;
 	rc = osmo_signal_register_handler(SS_L_INPUT, &bts_connection_status_trap_cb, net);
+
 end:
 	return rc;
 }