Home | History | Annotate | Line # | Download | only in libpuffs
requests.c revision 1.10
      1  1.10  pooka /*	$NetBSD: requests.c,v 1.10 2007/10/11 19:41:15 pooka Exp $	*/
      2   1.1  pooka 
      3   1.1  pooka /*
      4   1.1  pooka  * Copyright (c) 2006 Antti Kantee.  All Rights Reserved.
      5   1.1  pooka  *
      6   1.1  pooka  * Redistribution and use in source and binary forms, with or without
      7   1.1  pooka  * modification, are permitted provided that the following conditions
      8   1.1  pooka  * are met:
      9   1.1  pooka  * 1. Redistributions of source code must retain the above copyright
     10   1.1  pooka  *    notice, this list of conditions and the following disclaimer.
     11   1.1  pooka  * 2. Redistributions in binary form must reproduce the above copyright
     12   1.1  pooka  *    notice, this list of conditions and the following disclaimer in the
     13   1.1  pooka  *    documentation and/or other materials provided with the distribution.
     14   1.1  pooka  *
     15   1.1  pooka  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
     16   1.1  pooka  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     17   1.1  pooka  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     18   1.1  pooka  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     19   1.1  pooka  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     20   1.1  pooka  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     21   1.1  pooka  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     22   1.1  pooka  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     23   1.1  pooka  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     24   1.1  pooka  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     25   1.1  pooka  * SUCH DAMAGE.
     26   1.1  pooka  */
     27   1.1  pooka 
     28   1.1  pooka #include <sys/cdefs.h>
     29   1.1  pooka #if !defined(lint)
     30  1.10  pooka __RCSID("$NetBSD: requests.c,v 1.10 2007/10/11 19:41:15 pooka Exp $");
     31   1.1  pooka #endif /* !lint */
     32   1.1  pooka 
     33   1.1  pooka #include <sys/types.h>
     34   1.1  pooka #include <sys/ioctl.h>
     35   1.2  pooka #include <sys/queue.h>
     36   1.1  pooka 
     37   1.2  pooka #include <assert.h>
     38  1.10  pooka #include <errno.h>
     39   1.1  pooka #include <puffs.h>
     40   1.1  pooka #include <stdio.h>
     41   1.1  pooka #include <stdlib.h>
     42  1.10  pooka #include <unistd.h>
     43   1.1  pooka 
     44   1.1  pooka #include "puffs_priv.h"
     45   1.1  pooka 
     46  1.10  pooka /*
     47  1.10  pooka  * XXX: a lot of this stuff is together just with string and bubblegum now
     48  1.10  pooka  */
     49  1.10  pooka 
     50  1.10  pooka /*ARGSUSED*/
     51   1.1  pooka struct puffs_getreq *
     52   1.3  pooka puffs_req_makeget(struct puffs_usermount *pu, size_t buflen, int maxops)
     53   1.1  pooka {
     54   1.1  pooka 	struct puffs_getreq *pgr;
     55   1.1  pooka 
     56   1.1  pooka 	pgr = malloc(sizeof(struct puffs_getreq));
     57   1.1  pooka 	if (!pgr)
     58   1.1  pooka 		return NULL;
     59   1.1  pooka 
     60   1.2  pooka 	pgr->pgr_pu = pu;
     61  1.10  pooka 	pgr->pgr_buf = NULL;
     62   1.2  pooka 
     63   1.2  pooka 	return pgr;
     64   1.2  pooka }
     65   1.2  pooka 
     66   1.2  pooka int
     67   1.3  pooka puffs_req_loadget(struct puffs_getreq *pgr)
     68   1.2  pooka {
     69  1.10  pooka 	struct puffs_frame pfr;
     70  1.10  pooka 	uint8_t *buf;
     71  1.10  pooka 	size_t rlen;
     72  1.10  pooka 	int fd = pgr->pgr_pu->pu_fd;
     73   1.2  pooka 
     74  1.10  pooka 	assert(pgr->pgr_buf == NULL);
     75   1.2  pooka 
     76  1.10  pooka 	if (read(fd, &pfr, sizeof(struct puffs_frame)) == -1) {
     77  1.10  pooka 		if (errno == EWOULDBLOCK)
     78  1.10  pooka 			return 0;
     79  1.10  pooka 		return -1;
     80  1.10  pooka 	}
     81  1.10  pooka 	buf = malloc(pfr.pfr_len);
     82  1.10  pooka 	assert(buf != NULL); /* XXX: a bit more grace here, thanks */
     83  1.10  pooka 	memcpy(buf, &pfr, sizeof(pfr));
     84  1.10  pooka 
     85  1.10  pooka 	rlen = pfr.pfr_len - sizeof(pfr);
     86  1.10  pooka 	if (read(fd, buf + sizeof(pfr), rlen) != rlen) { /* XXX */
     87  1.10  pooka 		free(buf);
     88   1.2  pooka 		return -1;
     89  1.10  pooka 	}
     90  1.10  pooka 	pgr->pgr_buf = buf;
     91   1.1  pooka 
     92   1.2  pooka 	return 0;
     93   1.1  pooka }
     94   1.1  pooka 
     95   1.1  pooka struct puffs_req *
     96   1.3  pooka puffs_req_get(struct puffs_getreq *pgr)
     97   1.1  pooka {
     98  1.10  pooka 	void *buf;
     99   1.1  pooka 
    100  1.10  pooka 	buf = pgr->pgr_buf;
    101  1.10  pooka 	pgr->pgr_buf = NULL;
    102  1.10  pooka 	return buf;
    103   1.1  pooka }
    104   1.1  pooka 
    105   1.1  pooka int
    106   1.3  pooka puffs_req_remainingget(struct puffs_getreq *pgr)
    107   1.1  pooka {
    108   1.1  pooka 
    109  1.10  pooka 	return pgr->pgr_buf != NULL;
    110   1.1  pooka }
    111   1.1  pooka 
    112  1.10  pooka /*ARGSUSED*/
    113   1.1  pooka void
    114   1.3  pooka puffs_req_setmaxget(struct puffs_getreq *pgr, int maxops)
    115   1.2  pooka {
    116   1.2  pooka 
    117  1.10  pooka 	/* nada */
    118   1.2  pooka }
    119   1.2  pooka 
    120   1.2  pooka void
    121   1.3  pooka puffs_req_destroyget(struct puffs_getreq *pgr)
    122   1.1  pooka {
    123   1.1  pooka 
    124  1.10  pooka 	free(pgr->pgr_buf);
    125   1.1  pooka 	free(pgr);
    126   1.1  pooka }
    127   1.1  pooka 
    128   1.1  pooka 
    129   1.1  pooka struct puffs_putreq *
    130   1.3  pooka puffs_req_makeput(struct puffs_usermount *pu)
    131   1.1  pooka {
    132   1.1  pooka 	struct puffs_putreq *ppr;
    133   1.1  pooka 
    134   1.1  pooka 	ppr = malloc(sizeof(struct puffs_putreq));
    135   1.1  pooka 	if (!ppr)
    136   1.1  pooka 		return NULL;
    137  1.10  pooka 	memset(ppr, 0, sizeof(*ppr));
    138   1.1  pooka 
    139   1.2  pooka 	TAILQ_INIT(&ppr->ppr_pccq);
    140   1.1  pooka 
    141   1.1  pooka 	ppr->ppr_pu = pu;
    142   1.1  pooka 
    143   1.1  pooka 	return ppr;
    144   1.1  pooka }
    145   1.1  pooka 
    146   1.1  pooka void
    147   1.3  pooka puffs_req_put(struct puffs_putreq *ppr, struct puffs_req *preq)
    148   1.1  pooka {
    149  1.10  pooka 	ssize_t n;
    150   1.1  pooka 
    151  1.10  pooka 	n = write(ppr->ppr_pu->pu_fd, preq, preq->preq_frhdr.pfr_len);
    152  1.10  pooka 	assert(n == preq->preq_frhdr.pfr_len);
    153  1.10  pooka 	free(preq);
    154   1.1  pooka }
    155   1.1  pooka 
    156   1.2  pooka /*
    157   1.2  pooka  * instead of a direct preq, put a cc onto the push queue
    158   1.2  pooka  */
    159   1.2  pooka void
    160   1.3  pooka puffs_req_putcc(struct puffs_putreq *ppr, struct puffs_cc *pcc)
    161   1.2  pooka {
    162   1.2  pooka 
    163  1.10  pooka 	puffs_req_put(ppr, pcc->pcc_preq);
    164   1.2  pooka 	TAILQ_INSERT_TAIL(&ppr->ppr_pccq, pcc, entries);
    165   1.2  pooka }
    166   1.2  pooka 
    167  1.10  pooka /*ARGSUSED*/
    168   1.1  pooka int
    169   1.3  pooka puffs_req_putput(struct puffs_putreq *ppr)
    170   1.1  pooka {
    171   1.1  pooka 
    172   1.1  pooka 	return 0;
    173   1.1  pooka }
    174   1.1  pooka 
    175   1.1  pooka void
    176   1.3  pooka puffs_req_resetput(struct puffs_putreq *ppr)
    177   1.2  pooka {
    178   1.2  pooka 	struct puffs_cc *pcc;
    179   1.2  pooka 
    180   1.2  pooka 	while ((pcc = TAILQ_FIRST(&ppr->ppr_pccq)) != NULL) {
    181   1.2  pooka 		TAILQ_REMOVE(&ppr->ppr_pccq, pcc, entries);
    182   1.2  pooka 		puffs_cc_destroy(pcc);
    183   1.2  pooka 	}
    184   1.2  pooka }
    185   1.2  pooka 
    186   1.2  pooka void
    187   1.3  pooka puffs_req_destroyput(struct puffs_putreq *ppr)
    188   1.1  pooka {
    189   1.1  pooka 
    190   1.3  pooka 	puffs_req_resetput(ppr);
    191   1.1  pooka 	free(ppr);
    192   1.1  pooka }
    193   1.3  pooka 
    194  1.10  pooka /*ARGSUSED*/
    195   1.3  pooka int
    196   1.6  pooka puffs_req_handle(struct puffs_getreq *pgr, struct puffs_putreq *ppr, int maxops)
    197   1.3  pooka {
    198   1.6  pooka 	struct puffs_usermount *pu;
    199   1.3  pooka 	struct puffs_req *preq;
    200   1.3  pooka 	int pval;
    201   1.3  pooka 
    202   1.6  pooka 	assert(pgr->pgr_pu == ppr->ppr_pu);
    203   1.6  pooka 	pu = pgr->pgr_pu;
    204   1.6  pooka 
    205   1.3  pooka 	if (puffs_req_loadget(pgr) == -1)
    206   1.3  pooka 		return -1;
    207   1.3  pooka 
    208   1.3  pooka 	pval = 0;
    209   1.3  pooka 	while ((preq = puffs_req_get(pgr)) != NULL
    210   1.7  pooka 	    && puffs_getstate(pu) != PUFFS_STATE_UNMOUNTED)
    211   1.4  pooka 		pval = puffs_dopreq(pu, preq, ppr);
    212   1.3  pooka 
    213   1.3  pooka 	return pval;
    214   1.3  pooka }
    215