LCOV - code coverage report
Current view: top level - openssh-6.6p1 - sftp-glob.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 31 34 91.2 %
Date: 2014-08-01 Functions: 6 6 100.0 %
Branches: 7 10 70.0 %

           Branch data     Line data    Source code
       1                 :            : /* $OpenBSD: sftp-glob.c,v 1.26 2013/11/08 11:15:19 dtucker Exp $ */
       2                 :            : /*
       3                 :            :  * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
       4                 :            :  *
       5                 :            :  * Permission to use, copy, modify, and distribute this software for any
       6                 :            :  * purpose with or without fee is hereby granted, provided that the above
       7                 :            :  * copyright notice and this permission notice appear in all copies.
       8                 :            :  *
       9                 :            :  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      10                 :            :  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
      11                 :            :  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
      12                 :            :  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
      13                 :            :  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
      14                 :            :  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
      15                 :            :  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      16                 :            :  */
      17                 :            : 
      18                 :            : #include "includes.h"
      19                 :            : 
      20                 :            : #include <sys/types.h>
      21                 :            : #ifdef HAVE_SYS_STAT_H
      22                 :            : # include <sys/stat.h>
      23                 :            : #endif
      24                 :            : 
      25                 :            : #include <dirent.h>
      26                 :            : #include <stdlib.h>
      27                 :            : #include <string.h>
      28                 :            : 
      29                 :            : #include "xmalloc.h"
      30                 :            : #include "sftp.h"
      31                 :            : #include "buffer.h"
      32                 :            : #include "sftp-common.h"
      33                 :            : #include "sftp-client.h"
      34                 :            : 
      35                 :            : int remote_glob(struct sftp_conn *, const char *, int,
      36                 :            :     int (*)(const char *, int), glob_t *);
      37                 :            : 
      38                 :            : struct SFTP_OPENDIR {
      39                 :            :         SFTP_DIRENT **dir;
      40                 :            :         int offset;
      41                 :            : };
      42                 :            : 
      43                 :            : static struct {
      44                 :            :         struct sftp_conn *conn;
      45                 :            : } cur;
      46                 :            : 
      47                 :            : static void *
      48                 :          6 : fudge_opendir(const char *path)
      49                 :            : {
      50                 :            :         struct SFTP_OPENDIR *r;
      51                 :            : 
      52                 :          6 :         r = xcalloc(1, sizeof(*r));
      53                 :            : 
      54         [ -  + ]:          6 :         if (do_readdir(cur.conn, (char *)path, &r->dir)) {
      55                 :          0 :                 free(r);
      56                 :          0 :                 return(NULL);
      57                 :            :         }
      58                 :            : 
      59                 :          6 :         r->offset = 0;
      60                 :            : 
      61                 :          6 :         return((void *)r);
      62                 :            : }
      63                 :            : 
      64                 :            : static struct dirent *
      65                 :        611 : fudge_readdir(struct SFTP_OPENDIR *od)
      66                 :            : {
      67                 :            :         /* Solaris needs sizeof(dirent) + path length (see below) */
      68                 :            :         static char buf[sizeof(struct dirent) + MAXPATHLEN];
      69                 :        611 :         struct dirent *ret = (struct dirent *)buf;
      70                 :            : #ifdef __GNU_LIBRARY__
      71                 :            :         static int inum = 1;
      72                 :            : #endif /* __GNU_LIBRARY__ */
      73                 :            : 
      74         [ +  + ]:        611 :         if (od->dir[od->offset] == NULL)
      75                 :            :                 return(NULL);
      76                 :            : 
      77                 :            :         memset(buf, 0, sizeof(buf));
      78                 :            : 
      79                 :            :         /*
      80                 :            :          * Solaris defines dirent->d_name as a one byte array and expects
      81                 :            :          * you to hack around it.
      82                 :            :          */
      83                 :            : #ifdef BROKEN_ONE_BYTE_DIRENT_D_NAME
      84                 :            :         strlcpy(ret->d_name, od->dir[od->offset++]->filename, MAXPATHLEN);
      85                 :            : #else
      86                 :        605 :         strlcpy(ret->d_name, od->dir[od->offset++]->filename,
      87                 :            :             sizeof(ret->d_name));
      88                 :            : #endif
      89                 :            : #ifdef __GNU_LIBRARY__
      90                 :            :         /*
      91                 :            :          * Idiot glibc uses extensions to struct dirent for readdir with
      92                 :            :          * ALTDIRFUNCs. Not that this is documented anywhere but the
      93                 :            :          * source... Fake an inode number to appease it.
      94                 :            :          */
      95                 :        605 :         ret->d_ino = inum++;
      96         [ -  + ]:        605 :         if (!inum)
      97                 :          0 :                 inum = 1;
      98                 :            : #endif /* __GNU_LIBRARY__ */
      99                 :            : 
     100                 :            :         return(ret);
     101                 :            : }
     102                 :            : 
     103                 :            : static void
     104                 :          6 : fudge_closedir(struct SFTP_OPENDIR *od)
     105                 :            : {
     106                 :          6 :         free_sftp_dirents(od->dir);
     107                 :          6 :         free(od);
     108                 :          6 : }
     109                 :            : 
     110                 :            : static int
     111                 :        113 : fudge_lstat(const char *path, struct stat *st)
     112                 :            : {
     113                 :            :         Attrib *a;
     114                 :            : 
     115         [ +  + ]:        113 :         if (!(a = do_lstat(cur.conn, (char *)path, 1)))
     116                 :            :                 return(-1);
     117                 :            : 
     118                 :        110 :         attrib_to_stat(a, st);
     119                 :            : 
     120                 :        110 :         return(0);
     121                 :            : }
     122                 :            : 
     123                 :            : static int
     124                 :          6 : fudge_stat(const char *path, struct stat *st)
     125                 :            : {
     126                 :            :         Attrib *a;
     127                 :            : 
     128         [ +  - ]:          6 :         if (!(a = do_stat(cur.conn, (char *)path, 1)))
     129                 :            :                 return(-1);
     130                 :            : 
     131                 :          6 :         attrib_to_stat(a, st);
     132                 :            : 
     133                 :          6 :         return(0);
     134                 :            : }
     135                 :            : 
     136                 :            : int
     137                 :         76 : remote_glob(struct sftp_conn *conn, const char *pattern, int flags,
     138                 :            :     int (*errfunc)(const char *, int), glob_t *pglob)
     139                 :            : {
     140                 :         76 :         pglob->gl_opendir = fudge_opendir;
     141                 :         76 :         pglob->gl_readdir = (struct dirent *(*)(void *))fudge_readdir;
     142                 :         76 :         pglob->gl_closedir = (void (*)(void *))fudge_closedir;
     143                 :         76 :         pglob->gl_lstat = fudge_lstat;
     144                 :         76 :         pglob->gl_stat = fudge_stat;
     145                 :            : 
     146                 :            :         memset(&cur, 0, sizeof(cur));
     147                 :         76 :         cur.conn = conn;
     148                 :            : 
     149                 :         76 :         return(glob(pattern, flags | GLOB_ALTDIRFUNC, errfunc, pglob));
     150                 :            : }

Generated by: LCOV version 1.9