/* z/VM user ID which is permitted to send SMSGs *Ifthevalueisundefinedorempty(""),specialmessagesare
* accepted from any z/VM user ID. */ staticchar *sender;
module_param(sender, charp, 0400);
MODULE_PARM_DESC(sender, "z/VM user ID from which CP SMSGs are accepted");
/* check if the originating z/VM user ID matches
* the configured sender. */ if (sender && strlen(sender) > 0 && strcmp(from, sender) != 0) return;
/* get start of message text (skip prefix and leading blanks) */
msg += strlen(SMSG_PREFIX); while (*msg && isspace(*msg))
msg++; if (*msg == '\0') return;
/* allocate event list element and its environment */
se = smsg_app_event_alloc(from, msg); if (!se) return;
/* queue event and schedule work function */
spin_lock(&smsg_event_queue_lock);
list_add_tail(&se->list, &smsg_event_queue);
spin_unlock(&smsg_event_queue_lock);
schedule_work(&smsg_event_work); return;
}
staticint __init smsgiucv_app_init(void)
{ struct device_driver *smsgiucv_drv; int rc;
if (!machine_is_vm()) return -ENODEV;
smsgiucv_drv = driver_find(SMSGIUCV_DRV_NAME, &iucv_bus); if (!smsgiucv_drv) return -ENODEV;
smsg_app_dev = iucv_alloc_device(NULL, smsgiucv_drv, NULL, KMSG_COMPONENT); if (!smsg_app_dev) return -ENOMEM;
rc = device_register(smsg_app_dev); if (rc) {
put_device(smsg_app_dev); goto fail;
}
/* convert sender to uppercase characters */ if (sender) { int len = strlen(sender); while (len--)
sender[len] = toupper(sender[len]);
}
/* register with the smsgiucv device driver */
rc = smsg_register_callback(SMSG_PREFIX, smsg_app_callback); if (rc) {
device_unregister(smsg_app_dev); goto fail;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.