commit 9935a10111d138217f154cd0f207662437cadaac
parent 7a039fb7e4d0becfecce7721dc03d65262c9bba5
Author: Kyle Milz <kyle@0x30.net>
Date: Tue, 23 Feb 2016 22:14:24 -0700
server: move message handling to its own function
Diffstat:
M | server/sl | | | 101 | +++++++++++++++++++++++++++++++++++++++++-------------------------------------- |
1 file changed, 52 insertions(+), 49 deletions(-)
diff --git a/server/sl b/server/sl
@@ -92,67 +92,70 @@ while (my $client_socket = $server_socket->accept()) {
my $db = database->new($db_file);
$db->prepare_stmt_handles();
- while (1) {
- # Database errors and socket connect errors both modify this
- # value. Make sure it's reset
- undef $@;
-
- # Wait for an entire message to be received
- my ($ver, $msg_type, $request) = recv_msg($client_socket);
-
- $db->{dbh}->begin_work;
-
- # Every message type except 'device_add' needs to include
- # 'device_id' in the request. Check that here.
- my $device = undef;
- if ($msg_type != $msg_num{device_add}) {
- (my $err, $device) = get_device($db, $request->{device_id});
-
- if ($err) {
- send_msg($client_socket, $ver, $msg_type, make_error($err));
- $db->{dbh}->commit;
- next;
- }
- }
+ handle_message($client_socket, $db) while (1);
+}
+
+sub handle_message {
+ my ($client_socket, $db) = @_;
- # Call appropriate message handler. Each handler returns both
- # data that should be sent back over the main socket and
- # notification data that gets sent over vendor specific API.
- my ($response, $notify) = $msg_func[$msg_type]->($db, $request->{data}, $device);
+ # Make sure this gets reset
+ undef $@;
- $db->{dbh}->commit;
- if ($@) {
- $log->print("db transaction aborted: $@\n");
+ # Wait for an entire message to be received
+ my ($ver, $msg_type, $request) = recv_msg($client_socket);
- # now rollback to undo the incomplete changes
- # but do it in an eval{} as it may also fail
- eval { $db->{dbh}->rollback };
+ $db->{dbh}->begin_work;
- $response->{status} = 'err';
- $response->{reason} = 'database transaction aborted';
+ # Every message type except 'device_add' needs to include 'device_id' in
+ # the request. Check that here.
+ my $device = undef;
+ if ($msg_type != $msg_num{device_add}) {
+ (my $err, $device) = get_device($db, $request->{device_id});
- send_msg($client_socket, $ver, $msg_type, $response);
- next;
+ if ($err) {
+ send_msg($client_socket, $ver, $msg_type, make_error($err));
+ $db->{dbh}->commit;
+ return;
}
+ }
- # Respond to client over the main socket
- send_msg($client_socket, $ver, $msg_type, $response);
+ # Call appropriate message handler. Each handler returns both data that
+ # should be sent back over the main socket and notification data that
+ # gets sent over vendor specific API.
+ my ($response, $notify) = $msg_func[$msg_type]->($db, $request->{data}, $device);
- # Some messages don't send notifications
- next if (! defined $notify);
+ $db->{dbh}->commit;
+ if ($@) {
+ $log->print("db transaction aborted: $@\n");
- # Don't send notifications when there was en error
- next if ($response->{status} eq 'err');
+ # now rollback to undo the incomplete changes but do it in an
+ # eval{} as it may also fail
+ eval { $db->{dbh}->rollback };
- # Encode the notification message and find its size
- my $msg = encode_json($notify);
- my $msg_len = length($msg);
+ $response->{status} = 'err';
+ $response->{reason} = 'database transaction aborted';
- # Send to notification daemons
- send_unix("../apnd.socket", $msg, $msg_len) unless ($args{t});
- send_unix("../gcmd.socket", $msg, $msg_len) unless ($args{t});
- send_unix("../testd.socket", $msg, $msg_len) if ($args{t});
+ send_msg($client_socket, $ver, $msg_type, $response);
+ return;
}
+
+ # Respond to client over the main socket
+ send_msg($client_socket, $ver, $msg_type, $response);
+
+ # Some messages don't send notifications
+ return if (! defined $notify);
+
+ # Don't send notifications when there was en error
+ return if ($response->{status} eq 'err');
+
+ # Encode the notification message and find its size
+ my $msg = encode_json($notify);
+ my $msg_len = length($msg);
+
+ # Send to notification daemons
+ send_unix("../apnd.socket", $msg, $msg_len) unless ($args{t});
+ send_unix("../gcmd.socket", $msg, $msg_len) unless ($args{t});
+ send_unix("../testd.socket", $msg, $msg_len) if ($args{t});
}
# Takes a request and verifies device_id is present and valid