void cgibin_debug_device_list(WEBBLK *webblk) { DEVBLK *dev; char *class; html_header(webblk); hprintf(webblk->sock,"<h2>Attached Device List</h2>\n" "<table>\n" "<tr><th>Number</th>" "<th>Subchannel</th>" "<th>Class</th>" "<th>Type</th>" "<th>Status</th></tr>\n"); for(dev = sysblk.firstdev; dev; dev = dev->nextdev) if(dev->pmcw.flag5 & PMCW5_V) { (dev->hnd->query)(dev, &class, 0, NULL); hprintf(webblk->sock,"<tr>" "<td>%4.4X</td>" "<td><a href=\"detail?subchan=%4.4X\">%4.4X</a></td>" "<td>%s</td>" "<td>%4.4X</td>" "<td>%s%s%s</td>" "</tr>\n", dev->devnum, dev->subchan,dev->subchan, class, dev->devtype, (dev->fd > 2 ? "open " : ""), (dev->busy ? "busy " : ""), (IOPENDING(dev) ? "pending " : "")); }
/*-------------------------------------------------------------------*/ void socket_device_connection_handler (bind_struct* bs) { struct sockaddr_in client; /* Client address structure */ struct hostent* pHE; /* Addr of hostent structure */ socklen_t namelen; /* Length of client structure*/ char* clientip; /* Addr of client ip address */ char* clientname; /* Addr of client hostname */ DEVBLK* dev; /* Device Block pointer */ int csock; /* Client socket */ dev = bs->dev; logdebug("socket_device_connection_handler(dev=%4.4X)\n", dev->devnum); /* Accept the connection... */ csock = accept(bs->sd, 0, 0); if (csock == -1) { logmsg (_("HHCSD017E Connect to device %4.4X (%s) failed: %s\n"), dev->devnum, bs->spec, strerror(HSO_errno)); return; } /* Determine the connected client's IP address and hostname */ namelen = sizeof(client); clientip = NULL; clientname = "<unknown>"; if (1 && getpeername(csock, (struct sockaddr*) &client, &namelen) == 0 && (clientip = inet_ntoa(client.sin_addr)) != NULL && (pHE = gethostbyaddr((unsigned char*)(&client.sin_addr), sizeof(client.sin_addr), AF_INET)) != NULL && pHE->h_name && *pHE->h_name ) { clientname = (char*) pHE->h_name; } if (!clientip) clientip = "<unknown>"; /* Obtain the device lock */ obtain_lock (&dev->lock); /* Reject if device is busy or interrupt pending */ if (dev->busy || IOPENDING(dev) || (dev->scsw.flag3 & SCSW3_SC_PEND)) { close_socket( csock ); logmsg (_("HHCSD015E Client %s (%s) connection to device %4.4X " "(%s) rejected: device busy or interrupt pending\n"), clientname, clientip, dev->devnum, bs->spec); release_lock (&dev->lock); return; } /* Reject new client if previous client still connected */ if (dev->fd != -1) { close_socket( csock ); logmsg (_("HHCSD016E Client %s (%s) connection to device %4.4X " "(%s) rejected: client %s (%s) still connected\n"), clientname, clientip, dev->devnum, bs->spec, bs->clientname, bs->clientip); release_lock (&dev->lock); return; } /* Indicate that a client is now connected to this device */ dev->fd = csock; if (bs->clientip) free(bs->clientip); if (bs->clientname) free(bs->clientname); bs->clientip = strdup(clientip); bs->clientname = strdup(clientname); /* Call the boolean onconnect callback */ if (bs->fn && !bs->fn( bs->arg )) { /* Callback says it can't accept it */ close_socket( dev->fd ); dev->fd = -1; logmsg (_("HHCSD026E Client %s (%s) connection to device %4.4X " "(%s) rejected: by onconnect callback\n"), clientname, clientip, dev->devnum, bs->spec); release_lock (&dev->lock); return; } logmsg (_("HHCSD018I Client %s (%s) connected to device %4.4X (%s)\n"), clientname, clientip, dev->devnum, bs->spec); release_lock (&dev->lock); device_attention (dev, CSW_DE); }