14ca1ab94SDag-Erling Smørgrav /*- 24ca1ab94SDag-Erling Smørgrav * Copyright (c) 1998 Dag-Erling Co�dan Sm�rgrav 34ca1ab94SDag-Erling Smørgrav * All rights reserved. 44ca1ab94SDag-Erling Smørgrav * 54ca1ab94SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 64ca1ab94SDag-Erling Smørgrav * modification, are permitted provided that the following conditions 74ca1ab94SDag-Erling Smørgrav * are met: 84ca1ab94SDag-Erling Smørgrav * 1. Redistributions of source code must retain the above copyright 94ca1ab94SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer 104ca1ab94SDag-Erling Smørgrav * in this position and unchanged. 114ca1ab94SDag-Erling Smørgrav * 2. Redistributions in binary form must reproduce the above copyright 124ca1ab94SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer in the 134ca1ab94SDag-Erling Smørgrav * documentation and/or other materials provided with the distribution. 144ca1ab94SDag-Erling Smørgrav * 3. The name of the author may not be used to endorse or promote products 154ca1ab94SDag-Erling Smørgrav * derived from this software without specific prior written permission 164ca1ab94SDag-Erling Smørgrav * 174ca1ab94SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 184ca1ab94SDag-Erling Smørgrav * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 194ca1ab94SDag-Erling Smørgrav * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 204ca1ab94SDag-Erling Smørgrav * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 214ca1ab94SDag-Erling Smørgrav * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 224ca1ab94SDag-Erling Smørgrav * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234ca1ab94SDag-Erling Smørgrav * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244ca1ab94SDag-Erling Smørgrav * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254ca1ab94SDag-Erling Smørgrav * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 264ca1ab94SDag-Erling Smørgrav * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274ca1ab94SDag-Erling Smørgrav * 287f3dea24SPeter Wemm * $FreeBSD$ 294ca1ab94SDag-Erling Smørgrav */ 304ca1ab94SDag-Erling Smørgrav 310fba3a00SDag-Erling Smørgrav #include <sys/param.h> 32d8acd8dcSDag-Erling Smørgrav #include <sys/stat.h> 33ce71b736SDag-Erling Smørgrav 34ce71b736SDag-Erling Smørgrav #include <dirent.h> 354ca1ab94SDag-Erling Smørgrav #include <stdio.h> 364ca1ab94SDag-Erling Smørgrav #include <string.h> 374ca1ab94SDag-Erling Smørgrav 384ca1ab94SDag-Erling Smørgrav #include "fetch.h" 39d8acd8dcSDag-Erling Smørgrav #include "common.h" 404ca1ab94SDag-Erling Smørgrav 414ca1ab94SDag-Erling Smørgrav FILE * 4238c7e4a6SArchie Cobbs fetchXGetFile(struct url *u, struct url_stat *us, const char *flags) 434ca1ab94SDag-Erling Smørgrav { 44d8acd8dcSDag-Erling Smørgrav FILE *f; 45d8acd8dcSDag-Erling Smørgrav 461a5faa10SDag-Erling Smørgrav if (us && fetchStatFile(u, us, flags) == -1) 471a5faa10SDag-Erling Smørgrav return NULL; 481a5faa10SDag-Erling Smørgrav 49d8acd8dcSDag-Erling Smørgrav f = fopen(u->doc, "r"); 50d8acd8dcSDag-Erling Smørgrav 51d8acd8dcSDag-Erling Smørgrav if (f == NULL) 52d8acd8dcSDag-Erling Smørgrav _fetch_syserr(); 535ff28c82SDag-Erling Smørgrav 5498b8c4cbSDag-Erling Smørgrav if (u->offset && fseeko(f, u->offset, SEEK_SET) == -1) { 555ff28c82SDag-Erling Smørgrav fclose(f); 565ff28c82SDag-Erling Smørgrav _fetch_syserr(); 575ff28c82SDag-Erling Smørgrav } 585ff28c82SDag-Erling Smørgrav 59d8acd8dcSDag-Erling Smørgrav return f; 604ca1ab94SDag-Erling Smørgrav } 614ca1ab94SDag-Erling Smørgrav 624ca1ab94SDag-Erling Smørgrav FILE * 6338c7e4a6SArchie Cobbs fetchGetFile(struct url *u, const char *flags) 641a5faa10SDag-Erling Smørgrav { 651a5faa10SDag-Erling Smørgrav return fetchXGetFile(u, NULL, flags); 661a5faa10SDag-Erling Smørgrav } 671a5faa10SDag-Erling Smørgrav 681a5faa10SDag-Erling Smørgrav FILE * 6938c7e4a6SArchie Cobbs fetchPutFile(struct url *u, const char *flags) 704ca1ab94SDag-Erling Smørgrav { 71d8acd8dcSDag-Erling Smørgrav FILE *f; 72d8acd8dcSDag-Erling Smørgrav 73d74a913bSDag-Erling Smørgrav if (CHECK_FLAG('a')) 74d8acd8dcSDag-Erling Smørgrav f = fopen(u->doc, "a"); 75d8acd8dcSDag-Erling Smørgrav else 765ff28c82SDag-Erling Smørgrav f = fopen(u->doc, "w+"); 77d8acd8dcSDag-Erling Smørgrav 78d8acd8dcSDag-Erling Smørgrav if (f == NULL) 79d8acd8dcSDag-Erling Smørgrav _fetch_syserr(); 805ff28c82SDag-Erling Smørgrav 8198b8c4cbSDag-Erling Smørgrav if (u->offset && fseeko(f, u->offset, SEEK_SET) == -1) { 825ff28c82SDag-Erling Smørgrav fclose(f); 835ff28c82SDag-Erling Smørgrav _fetch_syserr(); 845ff28c82SDag-Erling Smørgrav } 855ff28c82SDag-Erling Smørgrav 86d8acd8dcSDag-Erling Smørgrav return f; 87d8acd8dcSDag-Erling Smørgrav } 88d8acd8dcSDag-Erling Smørgrav 89ce71b736SDag-Erling Smørgrav static int 9038c7e4a6SArchie Cobbs _fetch_stat_file(const char *fn, struct url_stat *us) 91d8acd8dcSDag-Erling Smørgrav { 92d8acd8dcSDag-Erling Smørgrav struct stat sb; 93d8acd8dcSDag-Erling Smørgrav 947a5b4b1bSDag-Erling Smørgrav us->size = -1; 957a5b4b1bSDag-Erling Smørgrav us->atime = us->mtime = 0; 96ce71b736SDag-Erling Smørgrav if (stat(fn, &sb) == -1) { 97d8acd8dcSDag-Erling Smørgrav _fetch_syserr(); 98d8acd8dcSDag-Erling Smørgrav return -1; 99d8acd8dcSDag-Erling Smørgrav } 100d8acd8dcSDag-Erling Smørgrav us->size = sb.st_size; 1010fba3a00SDag-Erling Smørgrav us->atime = sb.st_atime; 1020fba3a00SDag-Erling Smørgrav us->mtime = sb.st_mtime; 103d8acd8dcSDag-Erling Smørgrav return 0; 1044ca1ab94SDag-Erling Smørgrav } 105ce71b736SDag-Erling Smørgrav 106ce71b736SDag-Erling Smørgrav int 10798b8c4cbSDag-Erling Smørgrav fetchStatFile(struct url *u, struct url_stat *us, const char *flags __unused) 108ce71b736SDag-Erling Smørgrav { 109ce71b736SDag-Erling Smørgrav return _fetch_stat_file(u->doc, us); 110ce71b736SDag-Erling Smørgrav } 111ce71b736SDag-Erling Smørgrav 112ce71b736SDag-Erling Smørgrav struct url_ent * 11398b8c4cbSDag-Erling Smørgrav fetchListFile(struct url *u, const char *flags __unused) 114ce71b736SDag-Erling Smørgrav { 115ce71b736SDag-Erling Smørgrav DIR *dir; 116ce71b736SDag-Erling Smørgrav struct dirent *de; 117ce71b736SDag-Erling Smørgrav struct url_stat us; 118ce71b736SDag-Erling Smørgrav struct url_ent *ue; 119ce71b736SDag-Erling Smørgrav int size, len; 1202b26f942SDag-Erling Smørgrav char fn[PATH_MAX], *p; 121ce71b736SDag-Erling Smørgrav int l; 122ce71b736SDag-Erling Smørgrav 123ce71b736SDag-Erling Smørgrav if ((dir = opendir(u->doc)) == NULL) { 124ce71b736SDag-Erling Smørgrav _fetch_syserr(); 125ce71b736SDag-Erling Smørgrav return NULL; 126ce71b736SDag-Erling Smørgrav } 127ce71b736SDag-Erling Smørgrav 128ce71b736SDag-Erling Smørgrav ue = NULL; 129ce71b736SDag-Erling Smørgrav strncpy(fn, u->doc, sizeof fn - 2); 130ce71b736SDag-Erling Smørgrav fn[sizeof fn - 2] = 0; 131ce71b736SDag-Erling Smørgrav strcat(fn, "/"); 132ce71b736SDag-Erling Smørgrav p = strchr(fn, 0); 133ce71b736SDag-Erling Smørgrav l = sizeof fn - strlen(fn) - 1; 134ce71b736SDag-Erling Smørgrav 135ce71b736SDag-Erling Smørgrav while ((de = readdir(dir)) != NULL) { 136ce71b736SDag-Erling Smørgrav strncpy(p, de->d_name, l - 1); 137ce71b736SDag-Erling Smørgrav p[l - 1] = 0; 138ce71b736SDag-Erling Smørgrav if (_fetch_stat_file(fn, &us) == -1) 139ce71b736SDag-Erling Smørgrav /* should I return a partial result, or abort? */ 140ce71b736SDag-Erling Smørgrav break; 141ce71b736SDag-Erling Smørgrav _fetch_add_entry(&ue, &size, &len, de->d_name, &us); 142ce71b736SDag-Erling Smørgrav } 143ce71b736SDag-Erling Smørgrav 144ce71b736SDag-Erling Smørgrav return ue; 145ce71b736SDag-Erling Smørgrav } 146