static void pty_close(struct tty_struct * tty, struct file * filp) { if (!tty) return; if (tty->driver->subtype == PTY_TYPE_MASTER) { if (tty->count > 1) printk("master pty_close: count = %d!!\n", tty->count); } else { if (tty->count > 2) return; } wake_up_interruptible(&tty->read_wait); wake_up_interruptible(&tty->write_wait); tty->packet = 0; if (!tty->link) return; tty->link->packet = 0; set_bit(TTY_OTHER_CLOSED, &tty->link->flags); wake_up_interruptible(&tty->link->read_wait); wake_up_interruptible(&tty->link->write_wait); if (tty->driver->subtype == PTY_TYPE_MASTER) { set_bit(TTY_OTHER_CLOSED, &tty->flags); #ifdef CONFIG_UNIX98_PTYS if (tty->driver == ptm_driver) devpts_pty_kill(tty->index); #endif tty_vhangup(tty->link); } }
static void pty_close(struct tty_struct * tty, struct file * filp) { if (!tty) return; if (tty->driver.subtype == PTY_TYPE_MASTER) { if (tty->count > 1) printk("master pty_close: count = %d!!\n", tty->count); } else { if (tty->count > 2) return; } wake_up_interruptible(&tty->read_wait); wake_up_interruptible(&tty->write_wait); tty->packet = 0; if (!tty->link) return; tty->link->packet = 0; wake_up_interruptible(&tty->link->read_wait); wake_up_interruptible(&tty->link->write_wait); set_bit(TTY_OTHER_CLOSED, &tty->link->flags); if (tty->driver.subtype == PTY_TYPE_MASTER) { set_bit(TTY_OTHER_CLOSED, &tty->flags); #ifdef CONFIG_UNIX98_PTYS { unsigned int major = MAJOR(tty->device) - UNIX98_PTY_MASTER_MAJOR; if ( major < UNIX98_NR_MAJORS ) { devpts_pty_kill( MINOR(tty->device) - tty->driver.minor_start + tty->driver.name_base ); } } #endif tty_unregister_devfs (&tty->link->driver, MINOR (tty->device)); tty_vhangup(tty->link); } }
static void pty_close(struct tty_struct *tty, struct file *filp) { BUG_ON(!tty); if (tty->driver->subtype == PTY_TYPE_MASTER) WARN_ON(tty->count > 1); else { if (tty->count > 2) return; } wake_up_interruptible(&tty->read_wait); wake_up_interruptible(&tty->write_wait); tty->packet = 0; if (!tty->link) return; set_bit(TTY_OTHER_CLOSED, &tty->link->flags); wake_up_interruptible(&tty->link->read_wait); wake_up_interruptible(&tty->link->write_wait); if (tty->driver->subtype == PTY_TYPE_MASTER) { set_bit(TTY_OTHER_CLOSED, &tty->flags); #ifdef CONFIG_UNIX98_PTYS if (tty->driver == ptm_driver) devpts_pty_kill(tty->link); #endif tty_unlock(); tty_vhangup(tty->link); tty_lock(); } }
int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport) { struct uart_state *state = drv->state + uport->line; struct tty_port *port = &state->port; BUG_ON(in_interrupt()); if (state->uart_port != uport) printk(KERN_ALERT "Removing wrong port: %p != %p\n", state->uart_port, uport); mutex_lock(&port_mutex); mutex_lock(&port->mutex); uport->flags |= UPF_DEAD; mutex_unlock(&port->mutex); tty_unregister_device(drv->tty_driver, uport->line); if (port->tty) tty_vhangup(port->tty); if (uport->type != PORT_UNKNOWN) uport->ops->release_port(uport); uport->type = PORT_UNKNOWN; state->uart_port = NULL; mutex_unlock(&port_mutex); return 0; }
void unregister_lte_tty_device(struct tty_dev *tty_dev) { struct gdm *gdm; struct tty_struct *tty; int i; for (i = 0; i < TTY_MAX_COUNT; i++) { gdm = tty_dev->gdm[i]; if (!gdm) continue; mutex_lock(&gdm_table_lock); gdm_table[gdm->index][gdm->minor] = NULL; mutex_unlock(&gdm_table_lock); tty = tty_port_tty_get(&gdm->port); if (tty) { tty_vhangup(tty); tty_kref_put(tty); } tty_unregister_device(gdm_driver[i], gdm->minor); tty_port_put(&gdm->port); } }
/* * This routine simulates a hangup on the tty, to arrange that users * are given clean terminals at login time. */ asmlinkage long sys_vhangup(void) { if (capable(CAP_SYS_TTY_CONFIG)) { tty_vhangup(current->tty); return 0; } return -EPERM; }
/* * This routine simulates a hangup on the tty, to arrange that users * are given clean terminals at login time. */ asmlinkage long sys_vhangup(void) { if (capable(CAP_SYS_TTY_CONFIG)) { /* XXX: this needs locking */ tty_vhangup(current->signal->tty); return 0; } return -EPERM; }
/* * This routine simulates a hangup on the tty, to arrange that users * are given clean terminals at login time. */ asmlinkage int sys_vhangup(void) { if (!suser()) return -EPERM; /* If there is a controlling tty, hang it up */ if (current->tty) tty_vhangup(current->tty); return 0; }
static void acm_disconnect(struct usb_interface *intf) { struct acm *acm = usb_get_intfdata(intf); struct usb_device *usb_dev = interface_to_usbdev(intf); struct tty_struct *tty; int i; dev_dbg(&intf->dev, "%s\n", __func__); /* sibling interface is already cleaning up */ if (!acm) return; mutex_lock(&acm->mutex); acm->disconnected = true; if (acm->country_codes) { device_remove_file(&acm->control->dev, &dev_attr_wCountryCodes); device_remove_file(&acm->control->dev, &dev_attr_iCountryCodeRelDate); kfree(acm->country_codes); } device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); usb_set_intfdata(acm->control, NULL); usb_set_intfdata(acm->data, NULL); mutex_unlock(&acm->mutex); tty = tty_port_tty_get(&acm->port); if (tty) { tty_vhangup(tty); tty_kref_put(tty); } stop_data_traffic(acm); tty_unregister_device(acm_tty_driver, acm->minor); usb_free_urb(acm->ctrlurb); for (i = 0; i < ACM_NW; i++) usb_free_urb(acm->wb[i].urb); for (i = 0; i < acm->rx_buflimit; i++) usb_free_urb(acm->read_urbs[i]); acm_write_buffers_free(acm); usb_free_coherent(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); acm_read_buffers_free(acm); if (!acm->combined_interfaces) usb_driver_release_interface(&acm_driver, intf == acm->control ? acm->data : acm->control); tty_port_put(&acm->port); }
int ntv2_remove_one_port(struct uart_driver *drv, struct uart_port *uport) { struct uart_state *state = drv->state + uport->line; struct tty_port *port = &state->port; struct tty_struct *tty; int ret = 0; if (state->uart_port != uport) dev_alert(uport->dev, "Removing wrong port: %p != %p\n", state->uart_port, uport); /* * Mark the port "dead" - this prevents any opens from * succeeding while we shut down the port. */ uport->flags |= UPF_DEAD; /* * Remove the devices from the tty layer */ tty_unregister_device(drv->tty_driver, uport->line); tty = tty_port_tty_get(port); if (tty) { tty_vhangup(port->tty); tty_kref_put(tty); } /* * Hack to wait for tty to close to prevent panic */ msleep(250); /* * Free the port IO and memory resources, if any. */ if (uport->type != PORT_UNKNOWN) uport->ops->release_port(uport); #ifdef NTV2_USE_TTY_GROUP kfree(uport->tty_groups); #endif /* * Indicate that there isn't a port here anymore. */ uport->type = PORT_UNKNOWN; state->uart_port = NULL; return ret; }
static void pty_close(struct tty_struct *tty, struct file *filp) { BUG_ON(!tty); if (tty->driver->subtype == PTY_TYPE_MASTER) WARN_ON(tty->count > 1); else { if (test_bit(TTY_IO_ERROR, &tty->flags)) return; if (tty->count > 2) return; } set_bit(TTY_IO_ERROR, &tty->flags); wake_up_interruptible(&tty->read_wait); wake_up_interruptible(&tty->write_wait); tty->packet = 0; tty->peer_stops = 0; /* Review - krefs on tty_link ?? */ if (!tty->link) return; tty->link->peer_stops = 0; set_bit(TTY_OTHER_CLOSED, &tty->link->flags); wake_up_interruptible(&tty->link->read_wait); wake_up_interruptible(&tty->link->write_wait); if (tty->driver->subtype == PTY_TYPE_MASTER) { set_bit(TTY_OTHER_CLOSED, &tty->flags); #ifdef CONFIG_UNIX98_PTYS if (tty->driver == ptm_driver) { mutex_lock(&devpts_mutex); if (tty->link->driver_data) devpts_pty_kill(tty->link->driver_data); mutex_unlock(&devpts_mutex); } #endif tty_unlock(tty); tty_vhangup(tty->link); tty_lock(tty); } }
/* * Must be called before ipwireless_network_free(). */ void ipwireless_tty_free(struct ipw_tty *tty) { int j; struct ipw_network *network = ttys[tty->index]->network; for (j = tty->index; j < IPWIRELESS_PCMCIA_MINORS; j += IPWIRELESS_PCMCIA_MINOR_RANGE) { struct ipw_tty *ttyj = ttys[j]; if (ttyj) { mutex_lock(&ttyj->ipw_tty_mutex); if (get_tty(j)) printk(KERN_INFO IPWIRELESS_PCCARD_NAME ": deregistering %s device ttyIPWp%d\n", tty_type_name(ttyj->tty_type), j); ttyj->closing = 1; if (ttyj->port.tty != NULL) { mutex_unlock(&ttyj->ipw_tty_mutex); tty_vhangup(ttyj->port.tty); /* FIXME: Exactly how is the tty object locked here against a parallel ioctl etc */ /* FIXME2: hangup does not mean all processes * are gone */ mutex_lock(&ttyj->ipw_tty_mutex); } while (ttyj->port.count) do_ipw_close(ttyj); ipwireless_disassociate_network_ttys(network, ttyj->channel_idx); tty_unregister_device(ipw_tty_driver, j); tty_port_destroy(&ttyj->port); ttys[j] = NULL; mutex_unlock(&ttyj->ipw_tty_mutex); kfree(ttyj); } } }