1/* 2 Unix SMB/Netbios implementation. 3 SMB client library implementation 4 Copyright (C) Andrew Tridgell 1998 5 Copyright (C) Richard Sharpe 2000, 2002 6 Copyright (C) John Terpstra 2000 7 Copyright (C) Tom Jansen (Ninja ISD) 2002 8 Copyright (C) Derrell Lipman 2003-2008 9 Copyright (C) Jeremy Allison 2007, 2008 10 11 This program is free software; you can redistribute it and/or modify 12 it under the terms of the GNU General Public License as published by 13 the Free Software Foundation; either version 3 of the License, or 14 (at your option) any later version. 15 16 This program is distributed in the hope that it will be useful, 17 but WITHOUT ANY WARRANTY; without even the implied warranty of 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 GNU General Public License for more details. 20 21 You should have received a copy of the GNU General Public License 22 along with this program. If not, see <http://www.gnu.org/licenses/>. 23*/ 24 25#include "includes.h" 26 27 28#ifndef _LIBSMB_INTERNAL_H_ 29#define _LIBSMB_INTERNAL_H_ 30 31#include "../include/libsmbclient.h" 32 33#define SMBC_MAX_NAME 1023 34#define SMBC_FILE_MODE (S_IFREG | 0444) 35#define SMBC_DIR_MODE (S_IFDIR | 0555) 36 37/* 38 * DOS Attribute values (used internally) 39 */ 40typedef struct DOS_ATTR_DESC { 41 int mode; 42 SMB_OFF_T size; 43 time_t create_time; 44 time_t access_time; 45 time_t write_time; 46 time_t change_time; 47 SMB_INO_T inode; 48} DOS_ATTR_DESC; 49 50 51/* 52 * Internal flags for extended attributes 53 */ 54 55/* internal mode values */ 56#define SMBC_XATTR_MODE_ADD 1 57#define SMBC_XATTR_MODE_REMOVE 2 58#define SMBC_XATTR_MODE_REMOVE_ALL 3 59#define SMBC_XATTR_MODE_SET 4 60#define SMBC_XATTR_MODE_CHOWN 5 61#define SMBC_XATTR_MODE_CHGRP 6 62 63#define CREATE_ACCESS_READ READ_CONTROL_ACCESS 64 65/*We should test for this in configure ... */ 66#ifndef ENOTSUP 67#define ENOTSUP EOPNOTSUPP 68#endif 69 70 71struct _SMBCSRV { 72 struct cli_state *cli; 73 dev_t dev; 74 bool no_pathinfo; 75 bool no_pathinfo2; 76 bool no_nt_session; 77 struct policy_handle pol; 78 79 SMBCSRV *next, *prev; 80 81}; 82 83/* 84 * Keep directory entries in a list 85 */ 86struct smbc_dir_list { 87 struct smbc_dir_list *next; 88 struct smbc_dirent *dirent; 89}; 90 91 92/* 93 * Structure for open file management 94 */ 95struct _SMBCFILE { 96 int cli_fd; 97 char *fname; 98 SMB_OFF_T offset; 99 struct _SMBCSRV *srv; 100 bool file; 101 struct smbc_dir_list *dir_list, *dir_end, *dir_next; 102 int dir_type, dir_error; 103 104 SMBCFILE *next, *prev; 105}; 106 107 108/* 109 * Context structure 110 */ 111struct SMBC_internal_data { 112 113 /* True when this handle is initialized */ 114 bool initialized; 115 116 /* dirent pointer location */ 117 struct smbc_dirent dirent; 118 /* 119 * Leave room for any urlencoded filename and the comment field. 120 * 121 * We use (NAME_MAX * 3) plus whatever the max length of a comment is, 122 * plus a couple of null terminators (one after the filename, 123 * one after the comment). 124 * 125 * According to <linux/limits.h>, NAME_MAX is 255. Is it longer 126 * anyplace else? 127 */ 128 char _dirent_name[1024]; 129 130 /* 131 * server connection list 132 */ 133 SMBCSRV * servers; 134 135 /* 136 * open file/dir list 137 */ 138 SMBCFILE * files; 139 140 /* 141 * Log to standard error instead of the more typical standard output 142 */ 143 bool debug_stderr; 144 145 /* 146 * Support "Create Time" in get/set with the *xattr() functions, if 147 * true. This replaces the dos attribute strings C_TIME, A_TIME and 148 * M_TIME with CHANGE_TIME, ACCESS_TIME and WRITE_TIME, and adds 149 * CREATE_TIME. Default is FALSE, i.e. to use the old-style shorter 150 * names and to not support CREATE time, for backward compatibility. 151 */ 152 bool full_time_names; 153 154 /* 155 * The share mode of a file being opened. To match POSIX semantics 156 * (and maintain backward compatibility), DENY_NONE is the default. 157 */ 158 smbc_share_mode share_mode; 159 160 /* 161 * Authentication function which includes the context. This will be 162 * used if set; otherwise context->callbacks.auth_fn() will be used. 163 */ 164 smbc_get_auth_data_with_context_fn auth_fn_with_context; 165 166 /* 167 * An opaque (to this library) user data handle which can be set 168 * and retrieved with smbc_option_set() and smbc_option_get(). 169 */ 170 void * user_data; 171 172 /* 173 * Should we attempt UNIX smb encryption ? 174 * Set to 0 if we should never attempt, set to 1 if 175 * encryption requested, set to 2 if encryption required. 176 */ 177 smbc_smb_encrypt_level smb_encryption_level; 178 179 /* 180 * Should we request case sensitivity of file names? 181 */ 182 bool case_sensitive; 183 184 /* 185 * Auth info needed for DFS traversal. 186 */ 187 188 struct user_auth_info *auth_info; 189 190 struct smbc_server_cache * server_cache; 191 192 /* POSIX emulation functions */ 193 struct 194 { 195#if 0 /* Left in libsmbclient.h for backward compatibility */ 196 smbc_open_fn open_fn; 197 smbc_creat_fn creat_fn; 198 smbc_read_fn read_fn; 199 smbc_write_fn write_fn; 200 smbc_unlink_fn unlink_fn; 201 smbc_rename_fn rename_fn; 202 smbc_lseek_fn lseek_fn; 203 smbc_stat_fn stat_fn; 204 smbc_fstat_fn fstat_fn; 205#endif 206 smbc_statvfs_fn statvfs_fn; 207 smbc_fstatvfs_fn fstatvfs_fn; 208 smbc_ftruncate_fn ftruncate_fn; 209#if 0 /* Left in libsmbclient.h for backward compatibility */ 210 smbc_close_fn close_fn; 211 smbc_opendir_fn opendir_fn; 212 smbc_closedir_fn closedir_fn; 213 smbc_readdir_fn readdir_fn; 214 smbc_getdents_fn getdents_fn; 215 smbc_mkdir_fn mkdir_fn; 216 smbc_rmdir_fn rmdir_fn; 217 smbc_telldir_fn telldir_fn; 218 smbc_lseekdir_fn lseekdir_fn; 219 smbc_fstatdir_fn fstatdir_fn; 220 smbc_chmod_fn chmod_fn; 221 smbc_utimes_fn utimes_fn; 222 smbc_setxattr_fn setxattr_fn; 223 smbc_getxattr_fn getxattr_fn; 224 smbc_removexattr_fn removexattr_fn; 225 smbc_listxattr_fn listxattr_fn; 226#endif 227 } posix_emu; 228 229#if 0 /* Left in libsmbclient.h for backward compatibility */ 230 /* Printing-related functions */ 231 struct 232 { 233 smbc_print_file_fn print_file_fn; 234 smbc_open_print_job_fn open_print_job_fn; 235 smbc_list_print_jobs_fn list_print_jobs_fn; 236 smbc_unlink_print_job_fn unlink_print_job_fn; 237 } printing; 238#endif 239 240#if 0 /* None available yet */ 241 /* SMB high-level functions */ 242 struct 243 { 244 } smb; 245 246#endif 247}; 248 249/* Functions in libsmb_cache.c */ 250int 251SMBC_add_cached_server(SMBCCTX * context, 252 SMBCSRV * newsrv, 253 const char * server, 254 const char * share, 255 const char * workgroup, 256 const char * username); 257 258SMBCSRV * 259SMBC_get_cached_server(SMBCCTX * context, 260 const char * server, 261 const char * share, 262 const char * workgroup, 263 const char * user); 264 265int 266SMBC_remove_cached_server(SMBCCTX * context, 267 SMBCSRV * server); 268 269int 270SMBC_purge_cached_servers(SMBCCTX * context); 271 272 273/* Functions in libsmb_dir.c */ 274int 275SMBC_check_options(char *server, 276 char *share, 277 char *path, 278 char *options); 279 280SMBCFILE * 281SMBC_opendir_ctx(SMBCCTX *context, 282 const char *fname); 283 284int 285SMBC_closedir_ctx(SMBCCTX *context, 286 SMBCFILE *dir); 287 288struct smbc_dirent * 289SMBC_readdir_ctx(SMBCCTX *context, 290 SMBCFILE *dir); 291 292int 293SMBC_getdents_ctx(SMBCCTX *context, 294 SMBCFILE *dir, 295 struct smbc_dirent *dirp, 296 int count); 297 298int 299SMBC_mkdir_ctx(SMBCCTX *context, 300 const char *fname, 301 mode_t mode); 302 303int 304SMBC_rmdir_ctx(SMBCCTX *context, 305 const char *fname); 306 307off_t 308SMBC_telldir_ctx(SMBCCTX *context, 309 SMBCFILE *dir); 310 311int 312SMBC_lseekdir_ctx(SMBCCTX *context, 313 SMBCFILE *dir, 314 off_t offset); 315 316int 317SMBC_fstatdir_ctx(SMBCCTX *context, 318 SMBCFILE *dir, 319 struct stat *st); 320 321int 322SMBC_chmod_ctx(SMBCCTX *context, 323 const char *fname, 324 mode_t newmode); 325 326int 327SMBC_utimes_ctx(SMBCCTX *context, 328 const char *fname, 329 struct timeval *tbuf); 330 331int 332SMBC_unlink_ctx(SMBCCTX *context, 333 const char *fname); 334 335int 336SMBC_rename_ctx(SMBCCTX *ocontext, 337 const char *oname, 338 SMBCCTX *ncontext, 339 const char *nname); 340 341 342/* Functions in libsmb_file.c */ 343SMBCFILE * 344SMBC_open_ctx(SMBCCTX *context, 345 const char *fname, 346 int flags, 347 mode_t mode); 348 349SMBCFILE * 350SMBC_creat_ctx(SMBCCTX *context, 351 const char *path, 352 mode_t mode); 353 354ssize_t 355SMBC_read_ctx(SMBCCTX *context, 356 SMBCFILE *file, 357 void *buf, 358 size_t count); 359 360ssize_t 361SMBC_write_ctx(SMBCCTX *context, 362 SMBCFILE *file, 363 const void *buf, 364 size_t count); 365 366int 367SMBC_close_ctx(SMBCCTX *context, 368 SMBCFILE *file); 369 370bool 371SMBC_getatr(SMBCCTX * context, 372 SMBCSRV *srv, 373 char *path, 374 uint16 *mode, 375 SMB_OFF_T *size, 376 struct timespec *create_time_ts, 377 struct timespec *access_time_ts, 378 struct timespec *write_time_ts, 379 struct timespec *change_time_ts, 380 SMB_INO_T *ino); 381 382bool 383SMBC_setatr(SMBCCTX * context, SMBCSRV *srv, char *path, 384 time_t create_time, 385 time_t access_time, 386 time_t write_time, 387 time_t change_time, 388 uint16 mode); 389 390off_t 391SMBC_lseek_ctx(SMBCCTX *context, 392 SMBCFILE *file, 393 off_t offset, 394 int whence); 395 396int 397SMBC_ftruncate_ctx(SMBCCTX *context, 398 SMBCFILE *file, 399 off_t length); 400 401 402/* Functions in libsmb_misc.c */ 403int 404SMBC_dlist_contains(SMBCFILE * list, SMBCFILE *p); 405 406int 407SMBC_errno(SMBCCTX *context, 408 struct cli_state *c); 409 410 411/* Functions in libsmb_path.c */ 412int 413SMBC_parse_path(TALLOC_CTX *ctx, 414 SMBCCTX *context, 415 const char *fname, 416 char **pp_workgroup, 417 char **pp_server, 418 char **pp_share, 419 char **pp_path, 420 char **pp_user, 421 char **pp_password, 422 char **pp_options); 423 424 425/* Functions in libsmb_printjob.c */ 426SMBCFILE * 427SMBC_open_print_job_ctx(SMBCCTX *context, 428 const char *fname); 429 430int 431SMBC_print_file_ctx(SMBCCTX *c_file, 432 const char *fname, 433 SMBCCTX *c_print, 434 const char *printq); 435 436int 437SMBC_list_print_jobs_ctx(SMBCCTX *context, 438 const char *fname, 439 smbc_list_print_job_fn fn); 440 441int 442SMBC_unlink_print_job_ctx(SMBCCTX *context, 443 const char *fname, 444 int id); 445 446 447/* Functions in libsmb_server.c */ 448int 449SMBC_check_server(SMBCCTX * context, 450 SMBCSRV * server); 451 452int 453SMBC_remove_unused_server(SMBCCTX * context, 454 SMBCSRV * srv); 455 456void 457SMBC_call_auth_fn(TALLOC_CTX *ctx, 458 SMBCCTX *context, 459 const char *server, 460 const char *share, 461 char **pp_workgroup, 462 char **pp_username, 463 char **pp_password); 464 465void 466SMBC_get_auth_data(const char *server, const char *share, 467 char *workgroup_buf, int workgroup_buf_len, 468 char *username_buf, int username_buf_len, 469 char *password_buf, int password_buf_len); 470 471SMBCSRV * 472SMBC_find_server(TALLOC_CTX *ctx, 473 SMBCCTX *context, 474 const char *server, 475 const char *share, 476 char **pp_workgroup, 477 char **pp_username, 478 char **pp_password); 479 480SMBCSRV * 481SMBC_server(TALLOC_CTX *ctx, 482 SMBCCTX *context, 483 bool connect_if_not_found, 484 const char *server, 485 const char *share, 486 char **pp_workgroup, 487 char **pp_username, 488 char **pp_password); 489 490SMBCSRV * 491SMBC_attr_server(TALLOC_CTX *ctx, 492 SMBCCTX *context, 493 const char *server, 494 const char *share, 495 char **pp_workgroup, 496 char **pp_username, 497 char **pp_password); 498 499 500/* Functions in libsmb_stat.c */ 501int 502SMBC_stat_ctx(SMBCCTX *context, 503 const char *fname, 504 struct stat *st); 505 506int 507SMBC_fstat_ctx(SMBCCTX *context, 508 SMBCFILE *file, 509 struct stat *st); 510 511 512int 513SMBC_statvfs_ctx(SMBCCTX *context, 514 char *path, 515 struct statvfs *st); 516 517 518int 519SMBC_fstatvfs_ctx(SMBCCTX *context, 520 SMBCFILE *file, 521 struct statvfs *st); 522 523 524/* Functions in libsmb_xattr.c */ 525int 526SMBC_setxattr_ctx(SMBCCTX *context, 527 const char *fname, 528 const char *name, 529 const void *value, 530 size_t size, 531 int flags); 532 533int 534SMBC_getxattr_ctx(SMBCCTX *context, 535 const char *fname, 536 const char *name, 537 const void *value, 538 size_t size); 539 540int 541SMBC_removexattr_ctx(SMBCCTX *context, 542 const char *fname, 543 const char *name); 544 545int 546SMBC_listxattr_ctx(SMBCCTX *context, 547 const char *fname, 548 char *list, 549 size_t size); 550 551 552#endif 553