OpenCoverage

sftp-glob.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssh/src/sftp-glob.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: sftp-glob.c,v 1.27 2015/01/14 13:54:13 djm 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#include <stdlib.h>-
29-
30#include "xmalloc.h"-
31#include "sftp.h"-
32#include "sftp-common.h"-
33#include "sftp-client.h"-
34-
35int remote_glob(struct sftp_conn *, const char *, int,-
36 int (*)(const char *, int), glob_t *);-
37-
38struct SFTP_OPENDIR {-
39 SFTP_DIRENT **dir;-
40 int offset;-
41};-
42-
43static struct {-
44 struct sftp_conn *conn;-
45} cur;-
46-
47static void *-
48fudge_opendir(const char *path)-
49{-
50 struct SFTP_OPENDIR *r;-
51-
52 r = xcalloc(1, sizeof(*r));-
53-
54 if (do_readdir(cur.conn, (char *)path, &r->dir)) {
do_readdir(cur...path, &r->dir)Description
TRUEnever evaluated
FALSEnever evaluated
0
55 free(r);-
56 return(NULL);
never executed: return( ((void *)0) );
0
57 }-
58-
59 r->offset = 0;-
60-
61 return((void *)r);
never executed: return((void *)r);
0
62}-
63-
64static struct dirent *-
65fudge_readdir(struct SFTP_OPENDIR *od)-
66{-
67 /* Solaris needs sizeof(dirent) + path length (see below) */-
68 static char buf[sizeof(struct dirent) + MAXPATHLEN];-
69 struct dirent *ret = (struct dirent *)buf;-
70#ifdef __GNU_LIBRARY__-
71 static int inum = 1;-
72#endif /* __GNU_LIBRARY__ */-
73-
74 if (od->dir[od->offset] == NULL)
od->dir[od->of...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
75 return(NULL);
never executed: return( ((void *)0) );
0
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 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 ret->d_ino = inum++;-
96 if (!inum)
!inumDescription
TRUEnever evaluated
FALSEnever evaluated
0
97 inum = 1;
never executed: inum = 1;
0
98#endif /* __GNU_LIBRARY__ */-
99-
100 return(ret);
never executed: return(ret);
0
101}-
102-
103static void-
104fudge_closedir(struct SFTP_OPENDIR *od)-
105{-
106 free_sftp_dirents(od->dir);-
107 free(od);-
108}
never executed: end of block
0
109-
110static int-
111fudge_lstat(const char *path, struct stat *st)-
112{-
113 Attrib *a;-
114-
115 if (!(a = do_lstat(cur.conn, (char *)path, 1)))
!(a = do_lstat...ar *)path, 1))Description
TRUEnever evaluated
FALSEnever evaluated
0
116 return(-1);
never executed: return(-1);
0
117-
118 attrib_to_stat(a, st);-
119-
120 return(0);
never executed: return(0);
0
121}-
122-
123static int-
124fudge_stat(const char *path, struct stat *st)-
125{-
126 Attrib *a;-
127-
128 if (!(a = do_stat(cur.conn, (char *)path, 1)))
!(a = do_stat(...ar *)path, 1))Description
TRUEnever evaluated
FALSEnever evaluated
0
129 return(-1);
never executed: return(-1);
0
130-
131 attrib_to_stat(a, st);-
132-
133 return(0);
never executed: return(0);
0
134}-
135-
136int-
137remote_glob(struct sftp_conn *conn, const char *pattern, int flags,-
138 int (*errfunc)(const char *, int), glob_t *pglob)-
139{-
140 pglob->gl_opendir = fudge_opendir;-
141 pglob->gl_readdir = (struct dirent *(*)(void *))fudge_readdir;-
142 pglob->gl_closedir = (void (*)(void *))fudge_closedir;-
143 pglob->gl_lstat = fudge_lstat;-
144 pglob->gl_stat = fudge_stat;-
145-
146 memset(&cur, 0, sizeof(cur));-
147 cur.conn = conn;-
148-
149 return(glob(pattern, flags | GLOB_ALTDIRFUNC, errfunc, pglob));
never executed: return(_ssh__compat_glob(pattern, flags | 0x0040, errfunc, pglob));
0
150}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2