git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
drivers
/
s390
/
net
/
smsgiucv.c
diff --git
a/drivers/s390/net/smsgiucv.c
b/drivers/s390/net/smsgiucv.c
index
23b151c
..
b8179c2
100644
(file)
--- a/
drivers/s390/net/smsgiucv.c
+++ b/
drivers/s390/net/smsgiucv.c
@@
-32,7
+32,7
@@
struct smsg_callback {
struct list_head list;
char *prefix;
int len;
struct list_head list;
char *prefix;
int len;
- void (*callback)(char *str);
+ void (*callback)(char *
from, char *
str);
};
MODULE_AUTHOR
};
MODULE_AUTHOR
@@
-41,7
+41,7
@@
MODULE_DESCRIPTION ("Linux for S/390 IUCV special message driver");
static iucv_handle_t smsg_handle;
static unsigned short smsg_pathid;
static iucv_handle_t smsg_handle;
static unsigned short smsg_pathid;
-static
spinlock_t smsg_list_lock = SPIN_LOCK_UNLOCKED
;
+static
DEFINE_SPINLOCK(smsg_list_lock)
;
static struct list_head smsg_list = LIST_HEAD_INIT(smsg_list);
static void
static struct list_head smsg_list = LIST_HEAD_INIT(smsg_list);
static void
@@
-55,8
+55,9
@@
smsg_message_pending(iucv_MessagePending *eib, void *pgm_data)
{
struct smsg_callback *cb;
unsigned char *msg;
{
struct smsg_callback *cb;
unsigned char *msg;
+ unsigned char sender[9];
unsigned short len;
unsigned short len;
- int rc;
+ int rc
, i
;
len = eib->ln1msg2.ipbfln1f;
msg = kmalloc(len + 1, GFP_ATOMIC|GFP_DMA);
len = eib->ln1msg2.ipbfln1f;
msg = kmalloc(len + 1, GFP_ATOMIC|GFP_DMA);
@@
-65,14
+66,22
@@
smsg_message_pending(iucv_MessagePending *eib, void *pgm_data)
return;
}
rc = iucv_receive(eib->ippathid, eib->ipmsgid, eib->iptrgcls,
return;
}
rc = iucv_receive(eib->ippathid, eib->ipmsgid, eib->iptrgcls,
- msg, len,
0, 0, 0
);
+ msg, len,
NULL, NULL, NULL
);
if (rc == 0) {
msg[len] = 0;
EBCASC(msg, len);
if (rc == 0) {
msg[len] = 0;
EBCASC(msg, len);
+ memcpy(sender, msg, 8);
+ sender[8] = 0;
+ /* Remove trailing whitespace from the sender name. */
+ for (i = 7; i >= 0; i--) {
+ if (sender[i] != ' ' && sender[i] != '\t')
+ break;
+ sender[i] = 0;
+ }
spin_lock(&smsg_list_lock);
list_for_each_entry(cb, &smsg_list, list)
if (strncmp(msg + 8, cb->prefix, cb->len) == 0) {
spin_lock(&smsg_list_lock);
list_for_each_entry(cb, &smsg_list, list)
if (strncmp(msg + 8, cb->prefix, cb->len) == 0) {
- cb->callback(msg + 8);
+ cb->callback(
sender,
msg + 8);
break;
}
spin_unlock(&smsg_list_lock);
break;
}
spin_unlock(&smsg_list_lock);
@@
-91,7
+100,7
@@
static struct device_driver smsg_driver = {
};
int
};
int
-smsg_register_callback(char *prefix, void (*callback)(char *str))
+smsg_register_callback(char *prefix, void (*callback)(char *
from, char *
str))
{
struct smsg_callback *cb;
{
struct smsg_callback *cb;
@@
-108,12
+117,12
@@
smsg_register_callback(char *prefix, void (*callback)(char *str))
}
void
}
void
-smsg_unregister_callback(char *prefix, void (*callback)(char *str))
+smsg_unregister_callback(char *prefix, void (*callback)(char *
from, char *
str))
{
struct smsg_callback *cb, *tmp;
spin_lock(&smsg_list_lock);
{
struct smsg_callback *cb, *tmp;
spin_lock(&smsg_list_lock);
- cb =
0
;
+ cb =
NULL
;
list_for_each_entry(tmp, &smsg_list, list)
if (tmp->callback == callback &&
strcmp(tmp->prefix, prefix) == 0) {
list_for_each_entry(tmp, &smsg_list, list)
if (tmp->callback == callback &&
strcmp(tmp->prefix, prefix) == 0) {
@@
-129,8
+138,8
@@
static void __exit
smsg_exit(void)
{
if (smsg_handle > 0) {
smsg_exit(void)
{
if (smsg_handle > 0) {
- cpcmd("SET SMSG OFF",
0, 0
);
- iucv_sever(smsg_pathid,
0
);
+ cpcmd("SET SMSG OFF",
NULL, 0, NULL
);
+ iucv_sever(smsg_pathid,
NULL
);
iucv_unregister_program(smsg_handle);
driver_unregister(&smsg_driver);
}
iucv_unregister_program(smsg_handle);
driver_unregister(&smsg_driver);
}
@@
-153,22
+162,22
@@
smsg_init(void)
return rc;
}
smsg_handle = iucv_register_program("SMSGIUCV ", "*MSG ",
return rc;
}
smsg_handle = iucv_register_program("SMSGIUCV ", "*MSG ",
- pgmmask, &smsg_ops,
0
);
+ pgmmask, &smsg_ops,
NULL
);
if (!smsg_handle) {
printk(KERN_ERR "SMSGIUCV: failed to register to iucv");
driver_unregister(&smsg_driver);
return -EIO; /* better errno ? */
}
if (!smsg_handle) {
printk(KERN_ERR "SMSGIUCV: failed to register to iucv");
driver_unregister(&smsg_driver);
return -EIO; /* better errno ? */
}
- rc = iucv_connect (&smsg_pathid,
1, 0, "*MSG ", 0, 0, 0
, 0,
-
smsg_handle, 0
);
+ rc = iucv_connect (&smsg_pathid,
255, NULL, "*MSG ", NULL
, 0,
+
NULL, NULL, smsg_handle, NULL
);
if (rc) {
printk(KERN_ERR "SMSGIUCV: failed to connect to *MSG");
iucv_unregister_program(smsg_handle);
driver_unregister(&smsg_driver);
if (rc) {
printk(KERN_ERR "SMSGIUCV: failed to connect to *MSG");
iucv_unregister_program(smsg_handle);
driver_unregister(&smsg_driver);
- smsg_handle =
0
;
+ smsg_handle =
NULL
;
return -EIO;
}
return -EIO;
}
- cpcmd("SET SMSG IUCV",
0, 0
);
+ cpcmd("SET SMSG IUCV",
NULL, 0, NULL
);
return 0;
}
return 0;
}