aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/net/smsgiucv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/net/smsgiucv.c')
-rw-r--r--drivers/s390/net/smsgiucv.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/s390/net/smsgiucv.c b/drivers/s390/net/smsgiucv.c
index a3d285859564..1e3f7f3c662f 100644
--- a/drivers/s390/net/smsgiucv.c
+++ b/drivers/s390/net/smsgiucv.c
@@ -32,7 +32,7 @@ struct smsg_callback {
32 struct list_head list; 32 struct list_head list;
33 char *prefix; 33 char *prefix;
34 int len; 34 int len;
35 void (*callback)(char *str); 35 void (*callback)(char *from, char *str);
36}; 36};
37 37
38MODULE_AUTHOR 38MODULE_AUTHOR
@@ -55,8 +55,9 @@ smsg_message_pending(iucv_MessagePending *eib, void *pgm_data)
55{ 55{
56 struct smsg_callback *cb; 56 struct smsg_callback *cb;
57 unsigned char *msg; 57 unsigned char *msg;
58 unsigned char sender[9];
58 unsigned short len; 59 unsigned short len;
59 int rc; 60 int rc, i;
60 61
61 len = eib->ln1msg2.ipbfln1f; 62 len = eib->ln1msg2.ipbfln1f;
62 msg = kmalloc(len + 1, GFP_ATOMIC|GFP_DMA); 63 msg = kmalloc(len + 1, GFP_ATOMIC|GFP_DMA);
@@ -69,10 +70,18 @@ smsg_message_pending(iucv_MessagePending *eib, void *pgm_data)
69 if (rc == 0) { 70 if (rc == 0) {
70 msg[len] = 0; 71 msg[len] = 0;
71 EBCASC(msg, len); 72 EBCASC(msg, len);
73 memcpy(sender, msg, 8);
74 sender[8] = 0;
75 /* Remove trailing whitespace from the sender name. */
76 for (i = 7; i >= 0; i--) {
77 if (sender[i] != ' ' && sender[i] != '\t')
78 break;
79 sender[i] = 0;
80 }
72 spin_lock(&smsg_list_lock); 81 spin_lock(&smsg_list_lock);
73 list_for_each_entry(cb, &smsg_list, list) 82 list_for_each_entry(cb, &smsg_list, list)
74 if (strncmp(msg + 8, cb->prefix, cb->len) == 0) { 83 if (strncmp(msg + 8, cb->prefix, cb->len) == 0) {
75 cb->callback(msg + 8); 84 cb->callback(sender, msg + 8);
76 break; 85 break;
77 } 86 }
78 spin_unlock(&smsg_list_lock); 87 spin_unlock(&smsg_list_lock);
@@ -91,7 +100,7 @@ static struct device_driver smsg_driver = {
91}; 100};
92 101
93int 102int
94smsg_register_callback(char *prefix, void (*callback)(char *str)) 103smsg_register_callback(char *prefix, void (*callback)(char *from, char *str))
95{ 104{
96 struct smsg_callback *cb; 105 struct smsg_callback *cb;
97 106
@@ -108,7 +117,7 @@ smsg_register_callback(char *prefix, void (*callback)(char *str))
108} 117}
109 118
110void 119void
111smsg_unregister_callback(char *prefix, void (*callback)(char *str)) 120smsg_unregister_callback(char *prefix, void (*callback)(char *from, char *str))
112{ 121{
113 struct smsg_callback *cb, *tmp; 122 struct smsg_callback *cb, *tmp;
114 123