Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssh/src/sftp-glob.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||
---|---|---|---|---|---|---|---|---|
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 | - | |||||||
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 | fudge_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)) {
| 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 | - | |||||||
64 | static struct dirent * | - | ||||||
65 | 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 | 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)
| 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)
| 0 | ||||||
97 | inum = 1; never executed: inum = 1; | 0 | ||||||
98 | #endif /* __GNU_LIBRARY__ */ | - | ||||||
99 | - | |||||||
100 | return(ret); never executed: return(ret); | 0 | ||||||
101 | } | - | ||||||
102 | - | |||||||
103 | static void | - | ||||||
104 | fudge_closedir(struct SFTP_OPENDIR *od) | - | ||||||
105 | { | - | ||||||
106 | free_sftp_dirents(od->dir); | - | ||||||
107 | free(od); | - | ||||||
108 | } never executed: end of block | 0 | ||||||
109 | - | |||||||
110 | static int | - | ||||||
111 | fudge_lstat(const char *path, struct stat *st) | - | ||||||
112 | { | - | ||||||
113 | Attrib *a; | - | ||||||
114 | - | |||||||
115 | if (!(a = do_lstat(cur.conn, (char *)path, 1)))
| 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 | - | |||||||
123 | static int | - | ||||||
124 | fudge_stat(const char *path, struct stat *st) | - | ||||||
125 | { | - | ||||||
126 | Attrib *a; | - | ||||||
127 | - | |||||||
128 | if (!(a = do_stat(cur.conn, (char *)path, 1)))
| 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 | - | |||||||
136 | int | - | ||||||
137 | remote_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 code | Switch to Preprocessed file |