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, 2008
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 3 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, see <http://www.gnu.org/licenses/>.
26 #include "libsmb_internal.h"
28 struct smbc_compat_fdlist
{
31 struct smbc_compat_fdlist
*next
, *prev
;
34 static SMBCCTX
* statcont
= NULL
;
35 static int smbc_compat_initialized
= 0;
36 static int smbc_compat_nextfd
= 0;
37 static struct smbc_compat_fdlist
* smbc_compat_fd_in_use
= NULL
;
38 static struct smbc_compat_fdlist
* smbc_compat_fd_avail
= NULL
;
40 /* Find an fd and return the SMBCFILE * or NULL on failure */
44 struct smbc_compat_fdlist
* f
= smbc_compat_fd_in_use
;
53 /* Add an fd, returns 0 on success, -1 on error with errno set */
55 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
);
64 * None were available, so allocate one. Keep the number of
65 * file descriptors determinate. This allows the application
66 * to allocate bitmaps or mapping of file descriptors based on
67 * a known maximum number of file descriptors that will ever
70 if (smbc_compat_nextfd
>= FD_SETSIZE
) {
75 f
= SMB_MALLOC_P(struct smbc_compat_fdlist
);
81 f
->fd
= SMBC_BASE_FD
+ smbc_compat_nextfd
++;
85 DLIST_ADD(smbc_compat_fd_in_use
, f
);
92 /* Delete an fd, returns 0 on success */
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
);
117 smbc_init(smbc_get_auth_data_fn fn
,
120 if (!smbc_compat_initialized
) {
121 statcont
= smbc_new_context();
125 smbc_setDebug(statcont
, debug
);
126 smbc_setFunctionAuthData(statcont
, fn
);
128 if (!smbc_init_context(statcont
)) {
129 smbc_free_context(statcont
, False
);
133 smbc_compat_initialized
= 1;
142 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;
159 smbc_open(const char *furl
,
166 file
= smbc_getFunctionOpen(statcont
)(statcont
, furl
, flags
, mode
);
172 smbc_getFunctionClose(statcont
)(statcont
, file
);
178 smbc_creat(const char *furl
,
184 file
= smbc_getFunctionCreat(statcont
)(statcont
, furl
, mode
);
190 /* Hmm... should we delete the file too ? I guess we could try */
191 smbc_getFunctionClose(statcont
)(statcont
, file
);
192 smbc_getFunctionUnlink(statcont
)(statcont
, furl
);
203 SMBCFILE
* file
= find_fd(fd
);
204 return smbc_getFunctionRead(statcont
)(statcont
, file
, buf
, bufsize
);
212 SMBCFILE
* file
= find_fd(fd
);
213 return smbc_getFunctionWrite(statcont
)(statcont
, file
, buf
, bufsize
);
221 SMBCFILE
* file
= find_fd(fd
);
222 return smbc_getFunctionLseek(statcont
)(statcont
, file
, offset
, whence
);
228 SMBCFILE
* file
= find_fd(fd
);
230 return smbc_getFunctionClose(statcont
)(statcont
, file
);
234 smbc_unlink(const char *fname
)
236 return smbc_getFunctionUnlink(statcont
)(statcont
, fname
);
240 smbc_rename(const char *ourl
,
243 return smbc_getFunctionRename(statcont
)(statcont
, ourl
,
248 smbc_opendir(const char *durl
)
253 file
= smbc_getFunctionOpendir(statcont
)(statcont
, durl
);
259 smbc_getFunctionClosedir(statcont
)(statcont
, file
);
265 smbc_closedir(int dh
)
267 SMBCFILE
* file
= find_fd(dh
);
269 return smbc_getFunctionClosedir(statcont
)(statcont
, file
);
273 smbc_getdents(unsigned int dh
,
274 struct smbc_dirent
*dirp
,
277 SMBCFILE
* file
= find_fd(dh
);
278 return smbc_getFunctionGetdents(statcont
)(statcont
, file
, dirp
, count
);
282 smbc_readdir(unsigned int dh
)
284 SMBCFILE
* file
= find_fd(dh
);
285 return smbc_getFunctionReaddir(statcont
)(statcont
, file
);
288 const struct libsmb_file_info
*smbc_readdirplus(unsigned int dh
)
290 SMBCFILE
* file
= find_fd(dh
);
291 return smbc_getFunctionReaddirPlus(statcont
)(statcont
, file
);
294 const struct libsmb_file_info
*smbc_readdirplus2(unsigned int dh
,
297 SMBCFILE
*file
= find_fd(dh
);
298 return smbc_getFunctionReaddirPlus2(statcont
)(statcont
, file
, st
);
304 SMBCFILE
* file
= find_fd(dh
);
305 return smbc_getFunctionTelldir(statcont
)(statcont
, file
);
309 smbc_lseekdir(int fd
,
312 SMBCFILE
* file
= find_fd(fd
);
313 return smbc_getFunctionLseekdir(statcont
)(statcont
, file
, offset
);
317 smbc_mkdir(const char *durl
,
320 return smbc_getFunctionMkdir(statcont
)(statcont
, durl
, mode
);
324 smbc_rmdir(const char *durl
)
326 return smbc_getFunctionRmdir(statcont
)(statcont
, durl
);
330 smbc_notify(int dh
, smbc_bool recursive
, uint32_t completion_filter
,
331 unsigned callback_timeout_ms
,
332 smbc_notify_callback_fn cb
, void *private_data
)
334 SMBCFILE
*dir
= find_fd(dh
);
335 return smbc_getFunctionNotify(statcont
)(
336 statcont
, dir
, recursive
, completion_filter
,
337 callback_timeout_ms
, cb
, private_data
);
341 smbc_stat(const char *url
,
344 return smbc_getFunctionStat(statcont
)(statcont
, url
, st
);
351 SMBCFILE
* file
= find_fd(fd
);
352 return smbc_getFunctionFstat(statcont
)(statcont
, file
, st
);
356 smbc_statvfs(char *path
,
359 return smbc_getFunctionStatVFS(statcont
)(statcont
, path
, st
);
363 smbc_fstatvfs(int fd
,
366 SMBCFILE
* file
= find_fd(fd
);
367 return smbc_getFunctionFstatVFS(statcont
)(statcont
, file
, st
);
371 smbc_ftruncate(int fd
,
374 SMBCFILE
* file
= find_fd(fd
);
375 return smbc_getFunctionFtruncate(statcont
)(statcont
, file
, size
);
379 smbc_chmod(const char *url
,
382 return smbc_getFunctionChmod(statcont
)(statcont
, url
, mode
);
386 smbc_utimes(const char *fname
,
387 struct timeval
*tbuf
)
389 return smbc_getFunctionUtimes(statcont
)(statcont
, fname
, tbuf
);
394 smbc_utime(const char *fname
,
395 struct utimbuf
*utbuf
)
397 struct timeval tv
[2];
400 return smbc_getFunctionUtimes(statcont
)(statcont
, fname
, NULL
);
402 tv
[0].tv_sec
= utbuf
->actime
;
403 tv
[1].tv_sec
= utbuf
->modtime
;
404 tv
[0].tv_usec
= tv
[1].tv_usec
= 0;
406 return smbc_getFunctionUtimes(statcont
)(statcont
, fname
, tv
);
411 smbc_setxattr(const char *fname
,
417 return smbc_getFunctionSetxattr(statcont
)(statcont
,
423 smbc_lsetxattr(const char *fname
,
429 return smbc_getFunctionSetxattr(statcont
)(statcont
,
435 smbc_fsetxattr(int fd
,
441 SMBCFILE
* file
= find_fd(fd
);
446 return smbc_getFunctionSetxattr(statcont
)(statcont
,
452 smbc_getxattr(const char *fname
,
457 return smbc_getFunctionGetxattr(statcont
)(statcont
,
463 smbc_lgetxattr(const char *fname
,
468 return smbc_getFunctionGetxattr(statcont
)(statcont
,
474 smbc_fgetxattr(int fd
,
479 SMBCFILE
* file
= find_fd(fd
);
484 return smbc_getFunctionGetxattr(statcont
)(statcont
,
490 smbc_removexattr(const char *fname
,
493 return smbc_getFunctionRemovexattr(statcont
)(statcont
, fname
, name
);
497 smbc_lremovexattr(const char *fname
,
500 return smbc_getFunctionRemovexattr(statcont
)(statcont
, fname
, name
);
504 smbc_fremovexattr(int fd
,
507 SMBCFILE
* file
= find_fd(fd
);
512 return smbc_getFunctionRemovexattr(statcont
)(statcont
,
517 smbc_listxattr(const char *fname
,
521 return smbc_getFunctionListxattr(statcont
)(statcont
,
526 smbc_llistxattr(const char *fname
,
530 return smbc_getFunctionListxattr(statcont
)(statcont
,
535 smbc_flistxattr(int fd
,
539 SMBCFILE
* file
= find_fd(fd
);
544 return smbc_getFunctionListxattr(statcont
)(statcont
,
545 file
->fname
, list
, size
);
549 smbc_print_file(const char *fname
,
552 return smbc_getFunctionPrintFile(statcont
)(statcont
, fname
,
557 smbc_open_print_job(const char *fname
)
561 file
= smbc_getFunctionOpenPrintJob(statcont
)(statcont
, fname
);
562 if (!file
) return -1;
567 smbc_list_print_jobs(const char *purl
,
568 smbc_list_print_job_fn fn
)
570 return smbc_getFunctionListPrintJobs(statcont
)(statcont
, purl
, fn
);
574 smbc_unlink_print_job(const char *purl
,
577 return smbc_getFunctionUnlinkPrintJob(statcont
)(statcont
, purl
, id
);