11e8db6e2SBrian Feldman /* 21e8db6e2SBrian Feldman * Copyright (c) 2001 Damien Miller. All rights reserved. 31e8db6e2SBrian Feldman * 41e8db6e2SBrian Feldman * Redistribution and use in source and binary forms, with or without 51e8db6e2SBrian Feldman * modification, are permitted provided that the following conditions 61e8db6e2SBrian Feldman * are met: 71e8db6e2SBrian Feldman * 1. Redistributions of source code must retain the above copyright 81e8db6e2SBrian Feldman * notice, this list of conditions and the following disclaimer. 91e8db6e2SBrian Feldman * 2. Redistributions in binary form must reproduce the above copyright 101e8db6e2SBrian Feldman * notice, this list of conditions and the following disclaimer in the 111e8db6e2SBrian Feldman * documentation and/or other materials provided with the distribution. 121e8db6e2SBrian Feldman * 131e8db6e2SBrian Feldman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 141e8db6e2SBrian Feldman * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 151e8db6e2SBrian Feldman * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 161e8db6e2SBrian Feldman * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 171e8db6e2SBrian Feldman * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 181e8db6e2SBrian Feldman * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 191e8db6e2SBrian Feldman * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 201e8db6e2SBrian Feldman * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 211e8db6e2SBrian Feldman * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 221e8db6e2SBrian Feldman * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 231e8db6e2SBrian Feldman */ 241e8db6e2SBrian Feldman 251e8db6e2SBrian Feldman #include "includes.h" 261e8db6e2SBrian Feldman RCSID("$OpenBSD: sftp-glob.c,v 1.5 2001/04/15 08:43:46 markus Exp $"); 271e8db6e2SBrian Feldman 281e8db6e2SBrian Feldman #include <glob.h> 291e8db6e2SBrian Feldman 301e8db6e2SBrian Feldman #include "ssh.h" 311e8db6e2SBrian Feldman #include "buffer.h" 321e8db6e2SBrian Feldman #include "bufaux.h" 331e8db6e2SBrian Feldman #include "getput.h" 341e8db6e2SBrian Feldman #include "xmalloc.h" 351e8db6e2SBrian Feldman #include "log.h" 361e8db6e2SBrian Feldman #include "atomicio.h" 371e8db6e2SBrian Feldman #include "pathnames.h" 381e8db6e2SBrian Feldman 391e8db6e2SBrian Feldman #include "sftp.h" 401e8db6e2SBrian Feldman #include "sftp-common.h" 411e8db6e2SBrian Feldman #include "sftp-client.h" 421e8db6e2SBrian Feldman #include "sftp-glob.h" 431e8db6e2SBrian Feldman 441e8db6e2SBrian Feldman struct SFTP_OPENDIR { 451e8db6e2SBrian Feldman SFTP_DIRENT **dir; 461e8db6e2SBrian Feldman int offset; 471e8db6e2SBrian Feldman }; 481e8db6e2SBrian Feldman 491e8db6e2SBrian Feldman static struct { 501e8db6e2SBrian Feldman int fd_in; 511e8db6e2SBrian Feldman int fd_out; 521e8db6e2SBrian Feldman } cur; 531e8db6e2SBrian Feldman 541e8db6e2SBrian Feldman void *fudge_opendir(const char *path) 551e8db6e2SBrian Feldman { 561e8db6e2SBrian Feldman struct SFTP_OPENDIR *r; 571e8db6e2SBrian Feldman 581e8db6e2SBrian Feldman r = xmalloc(sizeof(*r)); 591e8db6e2SBrian Feldman 601e8db6e2SBrian Feldman if (do_readdir(cur.fd_in, cur.fd_out, (char*)path, &r->dir)) 611e8db6e2SBrian Feldman return(NULL); 621e8db6e2SBrian Feldman 631e8db6e2SBrian Feldman r->offset = 0; 641e8db6e2SBrian Feldman 651e8db6e2SBrian Feldman return((void*)r); 661e8db6e2SBrian Feldman } 671e8db6e2SBrian Feldman 681e8db6e2SBrian Feldman struct dirent *fudge_readdir(struct SFTP_OPENDIR *od) 691e8db6e2SBrian Feldman { 701e8db6e2SBrian Feldman static struct dirent ret; 711e8db6e2SBrian Feldman 721e8db6e2SBrian Feldman if (od->dir[od->offset] == NULL) 731e8db6e2SBrian Feldman return(NULL); 741e8db6e2SBrian Feldman 751e8db6e2SBrian Feldman memset(&ret, 0, sizeof(ret)); 761e8db6e2SBrian Feldman strlcpy(ret.d_name, od->dir[od->offset++]->filename, 771e8db6e2SBrian Feldman sizeof(ret.d_name)); 781e8db6e2SBrian Feldman 791e8db6e2SBrian Feldman return(&ret); 801e8db6e2SBrian Feldman } 811e8db6e2SBrian Feldman 821e8db6e2SBrian Feldman void fudge_closedir(struct SFTP_OPENDIR *od) 831e8db6e2SBrian Feldman { 841e8db6e2SBrian Feldman free_sftp_dirents(od->dir); 851e8db6e2SBrian Feldman xfree(od); 861e8db6e2SBrian Feldman } 871e8db6e2SBrian Feldman 881e8db6e2SBrian Feldman void attrib_to_stat(Attrib *a, struct stat *st) 891e8db6e2SBrian Feldman { 901e8db6e2SBrian Feldman memset(st, 0, sizeof(*st)); 911e8db6e2SBrian Feldman 921e8db6e2SBrian Feldman if (a->flags & SSH2_FILEXFER_ATTR_SIZE) 931e8db6e2SBrian Feldman st->st_size = a->size; 941e8db6e2SBrian Feldman if (a->flags & SSH2_FILEXFER_ATTR_UIDGID) { 951e8db6e2SBrian Feldman st->st_uid = a->uid; 961e8db6e2SBrian Feldman st->st_gid = a->gid; 971e8db6e2SBrian Feldman } 981e8db6e2SBrian Feldman if (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) 991e8db6e2SBrian Feldman st->st_mode = a->perm; 1001e8db6e2SBrian Feldman if (a->flags & SSH2_FILEXFER_ATTR_ACMODTIME) { 1011e8db6e2SBrian Feldman st->st_atime = a->atime; 1021e8db6e2SBrian Feldman st->st_mtime = a->mtime; 1031e8db6e2SBrian Feldman } 1041e8db6e2SBrian Feldman } 1051e8db6e2SBrian Feldman 1061e8db6e2SBrian Feldman int fudge_lstat(const char *path, struct stat *st) 1071e8db6e2SBrian Feldman { 1081e8db6e2SBrian Feldman Attrib *a; 1091e8db6e2SBrian Feldman 1101e8db6e2SBrian Feldman if (!(a = do_lstat(cur.fd_in, cur.fd_out, (char*)path, 0))) 1111e8db6e2SBrian Feldman return(-1); 1121e8db6e2SBrian Feldman 1131e8db6e2SBrian Feldman attrib_to_stat(a, st); 1141e8db6e2SBrian Feldman 1151e8db6e2SBrian Feldman return(0); 1161e8db6e2SBrian Feldman } 1171e8db6e2SBrian Feldman 1181e8db6e2SBrian Feldman int fudge_stat(const char *path, struct stat *st) 1191e8db6e2SBrian Feldman { 1201e8db6e2SBrian Feldman Attrib *a; 1211e8db6e2SBrian Feldman 1221e8db6e2SBrian Feldman if (!(a = do_stat(cur.fd_in, cur.fd_out, (char*)path, 0))) 1231e8db6e2SBrian Feldman return(-1); 1241e8db6e2SBrian Feldman 1251e8db6e2SBrian Feldman attrib_to_stat(a, st); 1261e8db6e2SBrian Feldman 1271e8db6e2SBrian Feldman return(0); 1281e8db6e2SBrian Feldman } 1291e8db6e2SBrian Feldman 1301e8db6e2SBrian Feldman int 1311e8db6e2SBrian Feldman remote_glob(int fd_in, int fd_out, const char *pattern, int flags, 1321e8db6e2SBrian Feldman int (*errfunc)(const char *, int), glob_t *pglob) 1331e8db6e2SBrian Feldman { 1341e8db6e2SBrian Feldman pglob->gl_opendir = (void*)fudge_opendir; 1351e8db6e2SBrian Feldman pglob->gl_readdir = (void*)fudge_readdir; 1361e8db6e2SBrian Feldman pglob->gl_closedir = (void*)fudge_closedir; 1371e8db6e2SBrian Feldman pglob->gl_lstat = fudge_lstat; 1381e8db6e2SBrian Feldman pglob->gl_stat = fudge_stat; 1391e8db6e2SBrian Feldman 1401e8db6e2SBrian Feldman memset(&cur, 0, sizeof(cur)); 1411e8db6e2SBrian Feldman cur.fd_in = fd_in; 1421e8db6e2SBrian Feldman cur.fd_out = fd_out; 1431e8db6e2SBrian Feldman 1441e8db6e2SBrian Feldman return(glob(pattern, flags | GLOB_ALTDIRFUNC, (void*)errfunc, 1451e8db6e2SBrian Feldman pglob)); 1461e8db6e2SBrian Feldman } 147