/* * Close a file or directory */ static int pfs_close(struct vop_close_args *va) { struct vnode *vn = va->a_vp; struct pfs_vdata *pvd = vn->v_data; struct pfs_node *pn = pvd->pvd_pn; struct proc *proc; int error; PFS_TRACE(("%s", pn->pn_name)); pfs_assert_not_owned(pn); /* * Do nothing unless this is the last close and the node has a * last-close handler. */ if (vrefcnt(vn) > 1 || pn->pn_close == NULL) PFS_RETURN (0); if (pvd->pvd_pid != NO_PID) { proc = pfind(pvd->pvd_pid); } else { proc = NULL; } error = pn_close(va->a_td, proc, pn); if (proc != NULL) PROC_UNLOCK(proc); PFS_RETURN (error); }
/* * Function called to delete the contents of a disk */ static WORD delete_disk(ANODE *pa) { PNODE *pn; FNODE *fn; BYTE path[10]; WORD ret = 0; build_root_path(path, pa->a_letter); strcat(path,"*.*"); pn = pn_open(path, F_SUBDIR); if (pn == NULL) return 0; graf_mouse(HGLASS, NULL); pn_active(pn); if (pn->p_flist) { /* * point all the FNODEs to the root, then set the root's * SELECTED attribute; this is a cheap way of making dir_op() * (called by fun_op()) think all the files are selected */ for (fn = pn->p_flist; fn; fn = fn->f_next) fn->f_obid = 0; G.g_screen->ob_state = SELECTED; ret = fun_op(OP_DELETE, pa->a_type, pn, NULL); G.g_screen->ob_state = 0; /* reset for safety */ } pn_close(pn); graf_mouse(ARROW, NULL); return ret; }
static void pni_connection_finalize(pn_selectable_t *sel) { pn_reactor_t *reactor = (pn_reactor_t *) pni_selectable_get_context(sel); pn_transport_t *transport = pni_transport(sel); pn_record_t *record = pn_transport_attachments(transport); pn_record_set(record, PN_TRANCTX, NULL); pn_socket_t fd = pn_selectable_get_fd(sel); pn_close(pni_reactor_io(reactor), fd); }
pn_socket_t pn_accept(pn_io_t *io, pn_socket_t listen_sock, char *name, size_t size) { struct sockaddr_in addr = {0}; addr.sin_family = AF_INET; socklen_t addrlen = sizeof(addr); iocpdesc_t *listend = pni_iocpdesc_map_get(io->iocp, listen_sock); pn_socket_t accept_sock; if (listend) accept_sock = pni_iocp_end_accept(listend, (struct sockaddr *) &addr, &addrlen, &io->wouldblock, io->error); else { // User supplied socket accept_sock = accept(listen_sock, (struct sockaddr *) &addr, &addrlen); if (accept_sock == INVALID_SOCKET) pni_win32_error(io->error, "sync accept", WSAGetLastError()); } if (accept_sock == INVALID_SOCKET) return accept_sock; int code = getnameinfo((struct sockaddr *) &addr, addrlen, io->host, NI_MAXHOST, io->serv, NI_MAXSERV, 0); if (code) code = getnameinfo((struct sockaddr *) &addr, addrlen, io->host, NI_MAXHOST, io->serv, NI_MAXSERV, NI_NUMERICHOST | NI_NUMERICSERV); if (code) { pn_error_format(io->error, PN_ERR, "getnameinfo: %s\n", gai_strerror(code)); pn_close(io, accept_sock); return INVALID_SOCKET; } else { pn_configure_sock(io, accept_sock); snprintf(name, size, "%s:%s", io->host, io->serv); if (listend) { pni_iocpdesc_start(pni_iocpdesc_map_get(io->iocp, accept_sock)); } return accept_sock; } }