コード例 #1
0
/*
 * 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);
}
コード例 #2
0
ファイル: deskfun.c プロジェクト: kelihlodversson/emutos
/*
 * 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;
}
コード例 #3
0
ファイル: connection.c プロジェクト: ChugR/qpid-proton
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);
}
コード例 #4
0
ファイル: io.c プロジェクト: VMinute/qpid-proton
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;
  }
}