2 Unix SMB/CIFS implementation.
3 SMB client library implementation (Old interface compatibility)
4 Copyright (C) Andrew Tridgell 1998
5 Copyright (C) Richard Sharpe 2000
6 Copyright (C) John Terpstra 2000
7 Copyright (C) Tom Jansen (Ninja ISD) 2002
8 Copyright (C) Derrell Lipman 2003
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #include "../include/libsmb_internal.h"
30 struct smbc_compat_fdlist
{
33 struct smbc_compat_fdlist
*next
, *prev
;
36 static SMBCCTX
* statcont
= NULL
;
37 static int smbc_compat_initialized
= 0;
38 static int smbc_compat_nextfd
= 0;
39 static struct smbc_compat_fdlist
* smbc_compat_fd_in_use
= NULL
;
40 static struct smbc_compat_fdlist
* smbc_compat_fd_avail
= NULL
;
42 /* Find an fd and return the SMBCFILE * or NULL on failure */
43 static SMBCFILE
* find_fd(int fd
)
45 struct smbc_compat_fdlist
* f
= smbc_compat_fd_in_use
;
54 /* Add an fd, returns 0 on success, -1 on error with errno set */
55 static int add_fd(SMBCFILE
* file
)
57 struct smbc_compat_fdlist
* f
= smbc_compat_fd_avail
;
60 /* We found one that's available */
61 DLIST_REMOVE(smbc_compat_fd_avail
, f
);
65 * None were available, so allocate one. Keep the number of
66 * file descriptors determinate. This allows the application
67 * to allocate bitmaps or mapping of file descriptors based on
68 * a known maximum number of file descriptors that will ever
71 if (smbc_compat_nextfd
>= FD_SETSIZE
) {
76 f
= malloc(sizeof(struct smbc_compat_fdlist
));
82 f
->fd
= SMBC_BASE_FD
+ smbc_compat_nextfd
++;
86 DLIST_ADD(smbc_compat_fd_in_use
, f
);
93 /* Delete an fd, returns 0 on success */
94 static int del_fd(int fd
)
96 struct smbc_compat_fdlist
* f
= smbc_compat_fd_in_use
;
106 DLIST_REMOVE(smbc_compat_fd_in_use
, f
);
108 DLIST_ADD(smbc_compat_fd_avail
, f
);
116 int smbc_init(smbc_get_auth_data_fn fn
, int debug
)
119 struct smbc_compat_fdlist
* f
;
121 if (!smbc_compat_initialized
) {
122 statcont
= smbc_new_context();
126 statcont
->debug
= debug
;
127 statcont
->callbacks
.auth_fn
= fn
;
129 if (!smbc_init_context(statcont
)) {
130 smbc_free_context(statcont
, False
);
134 smbc_compat_initialized
= 1;
142 SMBCCTX
*smbc_set_context(SMBCCTX
* context
)
144 SMBCCTX
*old_context
= statcont
;
147 /* Save provided context. It must have been initialized! */
150 /* You'd better know what you're doing. We won't help you. */
151 smbc_compat_initialized
= 1;
158 int smbc_open(const char *furl
, int flags
, mode_t mode
)
163 file
= statcont
->open(statcont
, furl
, flags
, mode
);
169 statcont
->close(statcont
, file
);
174 int smbc_creat(const char *furl
, mode_t mode
)
179 file
= statcont
->creat(statcont
, furl
, mode
);
185 /* Hmm... should we delete the file too ? I guess we could try */
186 statcont
->close(statcont
, file
);
187 statcont
->unlink(statcont
, furl
);
193 ssize_t
smbc_read(int fd
, void *buf
, size_t bufsize
)
195 SMBCFILE
* file
= find_fd(fd
);
196 return statcont
->read(statcont
, file
, buf
, bufsize
);
199 ssize_t
smbc_write(int fd
, void *buf
, size_t bufsize
)
201 SMBCFILE
* file
= find_fd(fd
);
202 return statcont
->write(statcont
, file
, buf
, bufsize
);
205 off_t
smbc_lseek(int fd
, off_t offset
, int whence
)
207 SMBCFILE
* file
= find_fd(fd
);
208 return statcont
->lseek(statcont
, file
, offset
, whence
);
211 int smbc_close(int fd
)
213 SMBCFILE
* file
= find_fd(fd
);
215 return statcont
->close(statcont
, file
);
218 int smbc_unlink(const char *fname
)
220 return statcont
->unlink(statcont
, fname
);
223 int smbc_rename(const char *ourl
, const char *nurl
)
225 return statcont
->rename(statcont
, ourl
, statcont
, nurl
);
228 int smbc_opendir(const char *durl
)
233 file
= statcont
->opendir(statcont
, durl
);
239 statcont
->closedir(statcont
, file
);
244 int smbc_closedir(int dh
)
246 SMBCFILE
* file
= find_fd(dh
);
248 return statcont
->closedir(statcont
, file
);
251 int smbc_getdents(unsigned int dh
, struct smbc_dirent
*dirp
, int count
)
253 SMBCFILE
* file
= find_fd(dh
);
254 return statcont
->getdents(statcont
, file
,dirp
, count
);
257 struct smbc_dirent
* smbc_readdir(unsigned int dh
)
259 SMBCFILE
* file
= find_fd(dh
);
260 return statcont
->readdir(statcont
, file
);
263 off_t
smbc_telldir(int dh
)
265 SMBCFILE
* file
= find_fd(dh
);
266 return statcont
->telldir(statcont
, file
);
269 int smbc_lseekdir(int fd
, off_t offset
)
271 SMBCFILE
* file
= find_fd(fd
);
272 return statcont
->lseekdir(statcont
, file
, offset
);
275 int smbc_mkdir(const char *durl
, mode_t mode
)
277 return statcont
->mkdir(statcont
, durl
, mode
);
280 int smbc_rmdir(const char *durl
)
282 return statcont
->rmdir(statcont
, durl
);
285 int smbc_stat(const char *url
, struct stat
*st
)
287 return statcont
->stat(statcont
, url
, st
);
290 int smbc_fstat(int fd
, struct stat
*st
)
292 SMBCFILE
* file
= find_fd(fd
);
293 return statcont
->fstat(statcont
, file
, st
);
296 int smbc_chmod(const char *url
, mode_t mode
)
298 return statcont
->chmod(statcont
, url
, mode
);
301 int smbc_utimes(const char *fname
, struct timeval
*tbuf
)
303 return statcont
->utimes(statcont
, fname
, tbuf
);
307 int smbc_utime(const char *fname
, struct utimbuf
*utbuf
)
312 return statcont
->utimes(statcont
, fname
, NULL
);
314 tv
.tv_sec
= utbuf
->modtime
;
316 return statcont
->utimes(statcont
, fname
, &tv
);
320 int smbc_setxattr(const char *fname
,
326 return statcont
->setxattr(statcont
, fname
, name
, value
, size
, flags
);
329 int smbc_lsetxattr(const char *fname
,
335 return statcont
->setxattr(statcont
, fname
, name
, value
, size
, flags
);
338 int smbc_fsetxattr(int fd
,
344 SMBCFILE
* file
= find_fd(fd
);
345 return statcont
->setxattr(statcont
, file
->fname
,
346 name
, value
, size
, flags
);
349 int smbc_getxattr(const char *fname
,
354 return statcont
->getxattr(statcont
, fname
, name
, value
, size
);
357 int smbc_lgetxattr(const char *fname
,
362 return statcont
->getxattr(statcont
, fname
, name
, value
, size
);
365 int smbc_fgetxattr(int fd
,
370 SMBCFILE
* file
= find_fd(fd
);
371 return statcont
->getxattr(statcont
, file
->fname
, name
, value
, size
);
374 int smbc_removexattr(const char *fname
,
377 return statcont
->removexattr(statcont
, fname
, name
);
380 int smbc_lremovexattr(const char *fname
,
383 return statcont
->removexattr(statcont
, fname
, name
);
386 int smbc_fremovexattr(int fd
,
389 SMBCFILE
* file
= find_fd(fd
);
390 return statcont
->removexattr(statcont
, file
->fname
, name
);
393 int smbc_listxattr(const char *fname
,
397 return statcont
->listxattr(statcont
, fname
, list
, size
);
400 int smbc_llistxattr(const char *fname
,
404 return statcont
->listxattr(statcont
, fname
, list
, size
);
407 int smbc_flistxattr(int fd
,
411 SMBCFILE
* file
= find_fd(fd
);
412 return statcont
->listxattr(statcont
, file
->fname
, list
, size
);
415 int smbc_print_file(const char *fname
, const char *printq
)
417 return statcont
->print_file(statcont
, fname
, statcont
, printq
);
420 int smbc_open_print_job(const char *fname
)
422 SMBCFILE
* file
= statcont
->open_print_job(statcont
, fname
);
423 if (!file
) return -1;
427 int smbc_list_print_jobs(const char *purl
, smbc_list_print_job_fn fn
)
429 return statcont
->list_print_jobs(statcont
, purl
, fn
);
432 int smbc_unlink_print_job(const char *purl
, int id
)
434 return statcont
->unlink_print_job(statcont
, purl
, id
);