diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/libsmbclient.h | 189 | ||||
-rw-r--r-- | source3/libsmb/libsmbclient.c | 2779 |
2 files changed, 1509 insertions, 1459 deletions
diff --git a/source3/include/libsmbclient.h b/source3/include/libsmbclient.h index 54660c4853..c6e9be3c47 100644 --- a/source3/include/libsmbclient.h +++ b/source3/include/libsmbclient.h @@ -1,25 +1,25 @@ /*===================================================================== - Unix SMB/Netbios implementation. - Version 2.0 - SMB client library API definitions - Copyright (C) Andrew Tridgell 1998 - Copyright (C) Richard Sharpe 2000 - Copyright (C) John Terpsra 2000 + Unix SMB/Netbios implementation. + Version 2.0 + SMB client library API definitions + Copyright (C) Andrew Tridgell 1998 + Copyright (C) Richard Sharpe 2000 + Copyright (C) John Terpsra 2000 - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -=====================================================================*/ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + =====================================================================*/ #ifndef SMBCLIENT_H_INCLUDED #define SMBCLIENT_H_INCLUDED @@ -27,25 +27,25 @@ /*-------------------------------------------------------------------*/ /* The following are special comments to instruct DOXYGEN (automated * documentation tool: -*/ + */ /** \defgroup structure Data Structures Type and Constants -* Data structures, types, and constants -*/ + * Data structures, types, and constants + */ /** \defgroup file File Functions -* Functions used to access individual file contents -*/ + * Functions used to access individual file contents + */ /** \defgroup directory Directory Functions -* Functions used to access directory entries -*/ + * Functions used to access directory entries + */ /** \defgroup attribute Attributes Functions -* Functions used to view or change file and directory attributes -*/ + * Functions used to view or change file and directory attributes + */ /** \defgroup print Print Functions -* Functions used to access printing functionality -*/ + * Functions used to access printing functionality + */ /** \defgroup attribute Miscellaneous Functions -* Functions that don't fit in to other categories -*/ + * Functions that don't fit in to other categories + */ /*-------------------------------------------------------------------*/ /* Make sure we have the following includes for now ... */ @@ -67,41 +67,44 @@ #define SMBC_FILE_MODE (S_IFREG | 0444) #define SMBC_DIR_MODE (S_IFDIR | 0555) +#define SMBC_MAX_FD 10000 + + /**@ingroup structure * Structure that represents a directory entry. * -*/ + */ struct smbc_dirent { - /** Type of entity. - SMBC_WORKGROUP=1, - SMBC_SERVER=2, - SMBC_FILE_SHARE=3, - SMBC_PRINTER_SHARE=4, - SMBC_COMMS_SHARE=5, - SMBC_IPC_SHARE=6, - SMBC_DIR=7, - SMBC_FILE=8, - SMBC_LINK=9,*/ - uint smbc_type; - - /** Length of this smbc_dirent in bytes - */ - uint dirlen; - /** The length of the comment string in bytes (includes null - * terminator) - */ - uint commentlen; - /** Points to the null terminated comment string - */ - char *comment; - /** The length of the name string in bytes (includes null - * terminator) - */ - uint namelen; - /** Points to the null terminated name string - */ - char name[1]; + /** Type of entity. + SMBC_WORKGROUP=1, + SMBC_SERVER=2, + SMBC_FILE_SHARE=3, + SMBC_PRINTER_SHARE=4, + SMBC_COMMS_SHARE=5, + SMBC_IPC_SHARE=6, + SMBC_DIR=7, + SMBC_FILE=8, + SMBC_LINK=9,*/ + uint smbc_type; + + /** Length of this smbc_dirent in bytes + */ + uint dirlen; + /** The length of the comment string in bytes (includes null + * terminator) + */ + uint commentlen; + /** Points to the null terminated comment string + */ + char *comment; + /** The length of the name string in bytes (includes null + * terminator) + */ + uint namelen; + /** Points to the null terminated name string + */ + char name[1]; }; @@ -114,30 +117,30 @@ typedef unsigned short uint16; */ struct print_job_info { - /** numeric ID of the print job - */ - uint16 id; + /** numeric ID of the print job + */ + uint16 id; - /** represents print job priority (lower numbers mean higher priority) - */ - uint16 priority; + /** represents print job priority (lower numbers mean higher priority) + */ + uint16 priority; - /** Size of the print job - */ - size_t size; + /** Size of the print job + */ + size_t size; - /** Name of the user that owns the print job - */ - char user[128]; + /** Name of the user that owns the print job + */ + char user[128]; - /** Name of the print job. This will have no name if an anonymous print - * file was opened. Ie smb://server/printer - */ - char name[128]; - - /** Time the print job was spooled - */ - time_t t; + /** Name of the print job. This will have no name if an anonymous print + * file was opened. Ie smb://server/printer + */ + char name[128]; + + /** Time the print job was spooled + */ + time_t t; }; #endif @@ -257,7 +260,7 @@ int smbc_init(smbc_get_auth_data_fn fn, int debug); * auth_fn in the smbc_init call, fail, this call will * try again with an empty username and password. This * often gets mapped to the guest account on some machines. -*/ + */ int smbc_open(const char *furl, int flags, mode_t mode); @@ -291,7 +294,7 @@ int smbc_open(const char *furl, int flags, mode_t mode); * - ENODEV The requested share does not exist. * @see smbc_open() * -*/ + */ int smbc_creat(const char *furl, mode_t mode); @@ -368,7 +371,7 @@ ssize_t smbc_write(int fd, void *buf, size_t bufsize); * @todo Are all the whence values really supported? * * @todo Are errno values complete and correct? -*/ + */ off_t smbc_lseek(int fd, off_t offset, int whence); @@ -382,7 +385,7 @@ off_t smbc_lseek(int fd, off_t offset, int whence); * - EINVAL smbc_init() failed or has not been called * * @see smbc_open(), smbc_creat() -*/ + */ int smbc_close(int fd); @@ -406,7 +409,7 @@ int smbc_close(int fd); * @see smbc_rmdir()s * * @todo Are errno values complete and correct? -*/ + */ int smbc_unlink(const char *furl); @@ -449,7 +452,7 @@ int smbc_unlink(const char *furl); * @todo Are we going to support copying when urls are not on the same * share? I say no... NOTE. I agree for the moment. * -*/ + */ int smbc_rename(const char *ourl, const char *nurl); @@ -472,7 +475,7 @@ int smbc_rename(const char *ourl, const char *nurl); * * @see smbc_getdents(), smbc_readdir(), smbc_closedir() * -*/ + */ int smbc_opendir(const char *durl); @@ -485,7 +488,7 @@ int smbc_opendir(const char *durl); * - EBADF dh is an invalid directory handle * * @see smbc_opendir() -*/ + */ int smbc_closedir(int dh); @@ -529,7 +532,7 @@ int smbc_getdents(unsigned int dh, struct smbc_dirent *dirp, int count); * - EINVAL smbc_init() failed or has not been called * * @see smbc_dirent, smbc_getdents(), smbc_open() -*/ + */ struct smbc_dirent* smbc_readdir(unsigned int dh); @@ -552,7 +555,7 @@ struct smbc_dirent* smbc_readdir(unsigned int dh); * * @see smbc_readdir() * -*/ + */ off_t smbc_telldir(int dh); @@ -600,7 +603,7 @@ int smbc_lseekdir(int fd, off_t offset); * * @see smbc_rmdir() * -*/ + */ int smbc_mkdir(const char *durl, mode_t mode); @@ -731,7 +734,7 @@ int smbc_chmod(const char *url, mode_t mode); * not called. * and errors returned by smbc_open * -*/ + */ int smbc_print_file(const char *fname, const char *printq); /**@ingroup print diff --git a/source3/libsmb/libsmbclient.c b/source3/libsmb/libsmbclient.c index d6c37ff9b2..74a42990f7 100644 --- a/source3/libsmb/libsmbclient.c +++ b/source3/libsmb/libsmbclient.c @@ -29,31 +29,31 @@ */ struct smbc_server { - struct smbc_server *next, *prev; - struct cli_state cli; - dev_t dev; - char *server_name; - char *share_name; - char *workgroup; - char *username; - BOOL no_pathinfo2; + struct smbc_server *next, *prev; + struct cli_state cli; + dev_t dev; + char *server_name; + char *share_name; + char *workgroup; + char *username; + BOOL no_pathinfo2; }; /* Keep directory entries in a list */ struct smbc_dir_list { - struct smbc_dir_list *next; - struct smbc_dirent *dirent; + struct smbc_dir_list *next; + struct smbc_dirent *dirent; }; struct smbc_file { - int cli_fd; - int smbc_fd; - char *fname; - off_t offset; - struct smbc_server *srv; - BOOL file; - struct smbc_dir_list *dir_list, *dir_end, *dir_next; - int dir_type, dir_error; + int cli_fd; + int smbc_fd; + char *fname; + off_t offset; + struct smbc_server *srv; + BOOL file; + struct smbc_dir_list *dir_list, *dir_end, *dir_next; + int dir_type, dir_error; }; int smbc_fstatdir(int fd, struct stat *st); /* Forward decl */ @@ -63,6 +63,7 @@ BOOL smbc_getatr(struct smbc_server *srv, char *path, SMB_INO_T *ino); extern BOOL in_client; +extern pstring global_myname; static int smbc_initialized = 0; static smbc_get_auth_data_fn smbc_auth_fn = NULL; /*static int smbc_debug;*/ @@ -89,108 +90,108 @@ static int smbc_parse_path(const char *fname, char *server, char *share, char *path, char *user, char *password) /* FIXME, lengths of strings */ { - static pstring s; - pstring userinfo; - char *p; - char *q, *r; - int len; + static pstring s; + pstring userinfo; + char *p; + char *q, *r; + int len; - server[0] = share[0] = path[0] = user[0] = password[0] = (char)0; - pstrcpy(s, fname); + server[0] = share[0] = path[0] = user[0] = password[0] = (char)0; + pstrcpy(s, fname); - /* clean_fname(s); causing problems ... */ + /* clean_fname(s); causing problems ... */ - /* see if it has the right prefix */ - len = strlen(smbc_prefix); - if (strncmp(s,smbc_prefix,len) || - (s[len] != '/' && s[len] != 0)) return -1; /* What about no smb: ? */ + /* see if it has the right prefix */ + len = strlen(smbc_prefix); + if (strncmp(s,smbc_prefix,len) || + (s[len] != '/' && s[len] != 0)) return -1; /* What about no smb: ? */ - p = s + len; + p = s + len; - /* Watch the test below, we are testing to see if we should exit */ + /* Watch the test below, we are testing to see if we should exit */ - if (strncmp(p, "//", 2) && strncmp(p, "\\\\", 2)) { + if (strncmp(p, "//", 2) && strncmp(p, "\\\\", 2)) { - return -1; + return -1; - } - - p += 2; /* Skip the // or \\ */ + } - if (*p == (char)0) - return 0; + p += 2; /* Skip the // or \\ */ - if (*p == '/') { + if (*p == (char)0) + return 0; - strncpy(server, (char *)lp_workgroup(), 16); /* FIXME: Danger here */ - return 0; + if (*p == '/') { - } + strncpy(server, (char *)lp_workgroup(), 16); /* FIXME: Danger here */ + return 0; + + } - /* - * ok, its for us. Now parse out the server, share etc. - * - * However, we want to parse out [[domain;]user[:password]@] if it - * exists ... - */ + /* + * ok, its for us. Now parse out the server, share etc. + * + * However, we want to parse out [[domain;]user[:password]@] if it + * exists ... + */ - /* check that '@' occurs before '/', if '/' exists at all */ - q = strchr_m(p, '@'); - r = strchr_m(p, '/'); - if (q && (!r || q < r)) { - pstring username, passwd, domain; - char *u = userinfo; + /* check that '@' occurs before '/', if '/' exists at all */ + q = strchr_m(p, '@'); + r = strchr_m(p, '/'); + if (q && (!r || q < r)) { + pstring username, passwd, domain; + char *u = userinfo; - next_token(&p, userinfo, "@", sizeof(fstring)); + next_token(&p, userinfo, "@", sizeof(fstring)); - username[0] = passwd[0] = domain[0] = 0; + username[0] = passwd[0] = domain[0] = 0; - if (strchr_m(u, ';')) { + if (strchr_m(u, ';')) { - next_token(&u, domain, ";", sizeof(fstring)); - - } - - if (strchr_m(u, ':')) { + next_token(&u, domain, ";", sizeof(fstring)); + + } - next_token(&u, username, ":", sizeof(fstring)); + if (strchr_m(u, ':')) { - pstrcpy(passwd, u); + next_token(&u, username, ":", sizeof(fstring)); - } - else { + pstrcpy(passwd, u); - pstrcpy(username, u); + } + else { - } + pstrcpy(username, u); - if (username[0]) - strncpy(user, username, sizeof(fstring)); /* FIXME, size and domain */ + } - if (passwd[0]) - strncpy(password, passwd, sizeof(fstring)); /* FIXME, size */ + if (username[0]) + strncpy(user, username, sizeof(fstring)); /* FIXME, size and domain */ - } + if (passwd[0]) + strncpy(password, passwd, sizeof(fstring)); /* FIXME, size */ - if (!next_token(&p, server, "/", sizeof(fstring))) { - - return -1; + } - } + if (!next_token(&p, server, "/", sizeof(fstring))) { + + return -1; + + } - if (*p == (char)0) return 0; /* That's it ... */ + if (*p == (char)0) return 0; /* That's it ... */ - if (!next_token(&p, share, "/", sizeof(fstring))) { + if (!next_token(&p, share, "/", sizeof(fstring))) { - return -1; + return -1; - } + } - pstrcpy(path, p); + pstrcpy(path, p); - all_string_sub(path, "/", "\\", 0); + all_string_sub(path, "/", "\\", 0); - return 0; + return 0; } /* @@ -238,297 +239,332 @@ struct smbc_server *smbc_server(char *server, char *share, char *workgroup, char *username, char *password) { - struct smbc_server *srv=NULL; - struct cli_state c; - struct nmb_name called, calling; - char *p, *server_n = server; - fstring group; - pstring ipenv; - struct in_addr ip; - extern struct in_addr ipzero; + struct smbc_server *srv=NULL; + struct cli_state c; + struct nmb_name called, calling; + char *p, *server_n = server; + fstring group; + pstring ipenv; + struct in_addr ip; + extern struct in_addr ipzero; - ip = ipzero; - ZERO_STRUCT(c); - - /* try to use an existing connection */ - for (srv=smbc_srvs;srv;srv=srv->next) { - if (strcmp(server,srv->server_name)==0 && - strcmp(share,srv->share_name)==0 && - strcmp(workgroup,srv->workgroup)==0 && - strcmp(username, srv->username) == 0) - return srv; - } - - if (server[0] == 0) { - errno = EPERM; - return NULL; - } - - /* - * Pick up the auth info here, once we know we need to connect - * But only if we do not have a username and password ... - */ - - if (!username[0] || !password[0]) - smbc_auth_fn(server, share, workgroup, sizeof(fstring), - username, sizeof(fstring), password, sizeof(fstring)); - - /* - * However, smbc_auth_fn may have picked up info relating to an - * existing connection, so try for an existing connection again ... - */ - - for (srv=smbc_srvs;srv;srv=srv->next) { - if (strcmp(server,srv->server_name)==0 && - strcmp(share,srv->share_name)==0 && - strcmp(workgroup,srv->workgroup)==0 && - strcmp(username, srv->username) == 0) - return srv; - } - - make_nmb_name(&calling, my_netbios_name, 0x0); - make_nmb_name(&called , server, 0x20); - - DEBUG(4,("smbc_server: server_n=[%s] server=[%s]\n", server_n, server)); + ip = ipzero; + ZERO_STRUCT(c); + + /* try to use an existing connection */ + for (srv=smbc_srvs;srv;srv=srv->next) { + if (strcmp(server,srv->server_name)==0 && + strcmp(share,srv->share_name)==0 && + strcmp(workgroup,srv->workgroup)==0 && + strcmp(username, srv->username) == 0) + return srv; + } + + if (server[0] == 0) { + errno = EPERM; + return NULL; + } + + /* + * Pick up the auth info here, once we know we need to connect + * But only if we do not have a username and password ... + */ + + if (!username[0] || !password[0]) + smbc_auth_fn(server, share, workgroup, sizeof(fstring), + username, sizeof(fstring), password, sizeof(fstring)); + + /* + * However, smbc_auth_fn may have picked up info relating to an + * existing connection, so try for an existing connection again ... + */ + + for (srv=smbc_srvs;srv;srv=srv->next) { + if (strcmp(server,srv->server_name)==0 && + strcmp(share,srv->share_name)==0 && + strcmp(workgroup,srv->workgroup)==0 && + strcmp(username, srv->username) == 0) + return srv; + } + + make_nmb_name(&calling, my_netbios_name, 0x0); + make_nmb_name(&called , server, 0x20); + + DEBUG(4,("smbc_server: server_n=[%s] server=[%s]\n", server_n, server)); - if ((p=strchr_m(server_n,'#')) && - (strcmp(p+1,"1D")==0 || strcmp(p+1,"01")==0)) { + if ((p=strchr_m(server_n,'#')) && + (strcmp(p+1,"1D")==0 || strcmp(p+1,"01")==0)) { - fstrcpy(group, server_n); - p = strchr_m(group,'#'); - *p = 0; + fstrcpy(group, server_n); + p = strchr_m(group,'#'); + *p = 0; - } + } - DEBUG(4,(" -> server_n=[%s] server=[%s]\n", server_n, server)); + DEBUG(4,(" -> server_n=[%s] server=[%s]\n", server_n, server)); again: - slprintf(ipenv,sizeof(ipenv)-1,"HOST_%s", server_n); - - ip = ipzero; - - /* have to open a new connection */ - if (!cli_initialise(&c) || !cli_connect(&c, server_n, &ip)) { - errno = ENOENT; - return NULL; - } - - if (!cli_session_request(&c, &calling, &called)) { - cli_shutdown(&c); - if (strcmp(called.name, "*SMBSERVER")) { - make_nmb_name(&called , "*SMBSERVER", 0x20); - goto again; - } - errno = ENOENT; - return NULL; - } + slprintf(ipenv,sizeof(ipenv)-1,"HOST_%s", server_n); + + ip = ipzero; + + /* have to open a new connection */ + if (!cli_initialise(&c) || !cli_connect(&c, server_n, &ip)) { + errno = ENOENT; + return NULL; + } + + if (!cli_session_request(&c, &calling, &called)) { + cli_shutdown(&c); + if (strcmp(called.name, "*SMBSERVER")) { + make_nmb_name(&called , "*SMBSERVER", 0x20); + goto again; + } + errno = ENOENT; + return NULL; + } - DEBUG(4,(" session request ok\n")); + DEBUG(4,(" session request ok\n")); - if (!cli_negprot(&c)) { - cli_shutdown(&c); - errno = ENOENT; - return NULL; - } - - if (!cli_session_setup(&c, username, - password, strlen(password), - password, strlen(password), - workgroup) && - /* try an anonymous login if it failed */ - !cli_session_setup(&c, "", "", 1,"", 0, workgroup)) { - cli_shutdown(&c); - errno = EPERM; - return NULL; - } - - DEBUG(4,(" session setup ok\n")); - - if (!cli_send_tconX(&c, share, "?????", - password, strlen(password)+1)) { - errno = smbc_errno(&c); - cli_shutdown(&c); - return NULL; - } + if (!cli_negprot(&c)) { + cli_shutdown(&c); + errno = ENOENT; + return NULL; + } + + if (!cli_session_setup(&c, username, + password, strlen(password), + password, strlen(password), + workgroup) && + /* try an anonymous login if it failed */ + !cli_session_setup(&c, "", "", 1,"", 0, workgroup)) { + cli_shutdown(&c); + errno = EPERM; + return NULL; + } + + DEBUG(4,(" session setup ok\n")); + + if (!cli_send_tconX(&c, share, "?????", + password, strlen(password)+1)) { + errno = smbc_errno(&c); + cli_shutdown(&c); + return NULL; + } - DEBUG(4,(" tconx ok\n")); + DEBUG(4,(" tconx ok\n")); - srv = (struct smbc_server *)malloc(sizeof(*srv)); - if (!srv) { - errno = ENOMEM; - goto failed; - } + srv = (struct smbc_server *)malloc(sizeof(*srv)); + if (!srv) { + errno = ENOMEM; + goto failed; + } - ZERO_STRUCTP(srv); + ZERO_STRUCTP(srv); - srv->cli = c; + srv->cli = c; - srv->dev = (dev_t)(str_checksum(server) ^ str_checksum(share)); + srv->dev = (dev_t)(str_checksum(server) ^ str_checksum(share)); - srv->server_name = strdup(server); - if (!srv->server_name) { - errno = ENOMEM; - goto failed; - } + srv->server_name = strdup(server); + if (!srv->server_name) { + errno = ENOMEM; + goto failed; + } - srv->share_name = strdup(share); - if (!srv->share_name) { - errno = ENOMEM; - goto failed; - } + srv->share_name = strdup(share); + if (!srv->share_name) { + errno = ENOMEM; + goto failed; + } - srv->workgroup = strdup(workgroup); - if (!srv->workgroup) { - errno = ENOMEM; - goto failed; - } + srv->workgroup = strdup(workgroup); + if (!srv->workgroup) { + errno = ENOMEM; + goto failed; + } - srv->username = strdup(username); - if (!srv->username) { - errno = ENOMEM; - goto failed; - } + srv->username = strdup(username); + if (!srv->username) { + errno = ENOMEM; + goto failed; + } - DLIST_ADD(smbc_srvs, srv); + DLIST_ADD(smbc_srvs, srv); - return srv; + return srv; failed: - cli_shutdown(&c); - if (!srv) return NULL; + cli_shutdown(&c); + if (!srv) return NULL; - SAFE_FREE(srv->server_name); - SAFE_FREE(srv->share_name); - SAFE_FREE(srv); - return NULL; + SAFE_FREE(srv->server_name); + SAFE_FREE(srv->share_name); + SAFE_FREE(srv->workgroup); + SAFE_FREE(srv->username); + SAFE_FREE(srv); + return NULL; +} + +/* + *Remove a server from the list smbc_srvs if it's unused -- Tom (tom@ninja.nl) + * + * We accept a *srv + */ +BOOL smbc_remove_unused_server(struct smbc_server * s) +{ + int p; + + /* are we being fooled ? */ + if (!s) return False; + + /* close all open files/directories on this server */ + for (p = 0; p < SMBC_MAX_FD; p++) { + if (smbc_file_table[p] && + smbc_file_table[p]->srv == s) { + /* Still used .. DARN */ + DEBUG(3, ("smbc_remove_usused_server: %x still used by %s (%d).\n", (int) s, + smbc_file_table[p]->fname, smbc_file_table[p]->smbc_fd)); + return False; + } + } + + cli_shutdown(&s->cli); + + SAFE_FREE(s->username); + SAFE_FREE(s->workgroup); + SAFE_FREE(s->server_name); + SAFE_FREE(s->share_name); + DLIST_REMOVE(smbc_srvs, s); + DEBUG(3, ("smbc_remove_usused_server: %x removed.\n", (int) s)); + SAFE_FREE(s); + return True; } /* *Initialise the library etc * - * We accept valiv values for debug from 0 to 100, + * We accept valid values for debug from 0 to 100, * and insist that fn must be non-null. */ int smbc_init(smbc_get_auth_data_fn fn, int debug) { - pstring conf; - int p, pid; - char *user = NULL, *home = NULL, *pname="libsmbclient"; - - /* - * Next lot ifdef'd out until test suite fixed ... - */ - - if (!fn || debug < 0 || debug > 100) { - - errno = EINVAL; - return -1; - - } + pstring conf; + int p, pid; + char *user = NULL, *home = NULL, *pname="libsmbclient"; - if (smbc_initialized) { /* Don't go through this if we have already done it */ + if (!fn || debug < 0 || debug > 100) { - return 0; + errno = EINVAL; + return -1; - } - - smbc_initialized = 1; - smbc_auth_fn = fn; - /* smbc_debug = debug; */ - - DEBUGLEVEL = -1; + } - setup_logging(pname, False); + if (smbc_initialized) { /* Don't go through this if we have already done it */ - /* - * We try to construct our netbios name from our hostname etc - */ + return 0; - user = getenv("USER"); - if (!user) user = ""; /* FIXME: What to do about this? */ + } - /* - * FIXME: Is this the best way to get the user info? */ + smbc_initialized = 1; + smbc_auth_fn = fn; + /* smbc_debug = debug; */ - pstrcpy(smbc_user, user); /* Save for use elsewhere */ + DEBUGLEVEL = -1; - pid = getpid(); + setup_logging(pname, False); - /* - * Hmmm, I want to get hostname as well, but I am too lazy for the moment - */ + /* Here we would open the smb.conf file if needed ... */ - slprintf(my_netbios_name, 16, "smbc%s%d", user, pid); + home = getenv("HOME"); - /* Here we would open the smb.conf file if needed ... */ + slprintf(conf, sizeof(conf), "%s/.smb/smb.conf", home); - home = getenv("HOME"); + load_interfaces(); /* Load the list of interfaces ... */ - slprintf(conf, sizeof(conf), "%s/.smb/smb.conf", home); + in_client = True; /* FIXME, make a param */ - load_interfaces(); /* Load the list of interfaces ... */ + if (!lp_load(conf, True, False, False)) { - in_client = True; /* FIXME, make a param */ + /* + * Hmmm, what the hell do we do here ... we could not parse the + * config file ... We must return an error ... and keep info around + * about why we failed + */ + + errno = ENOENT; /* FIXME: Figure out the correct error response */ + return -1; - if (!lp_load(conf, True, False, False)) { + } - /* - * Hmmm, what the hell do we do here ... we could not parse the - * config file ... We must return an error ... and keep info around - * about why we failed - */ - - errno = ENOENT; /* FIXME: Figure out the correct error response */ - return -1; + reopen_logs(); /* Get logging working ... */ - } + /* + * FIXME: Is this the best way to get the user info? + */ - reopen_logs(); /* Get logging working ... */ + user = getenv("USER"); + /* walk around as "guest" if no username can be found */ + if (!user) user = strdup("guest"); + pstrcpy(smbc_user, user); /* Save for use elsewhere */ + + /* + * We try to get our netbios name from the config. If that fails we fall + * back on constructing our netbios name from our hostname etc + */ + if (global_myname) { + pstrcpy(my_netbios_name, global_myname); + } + else { + /* + * Hmmm, I want to get hostname as well, but I am too lazy for the moment + */ + pid = getpid(); + slprintf(my_netbios_name, 16, "smbc%s%d", user, pid); + } + DEBUG(0,("Using netbios name %s.\n", my_netbios_name)); - name_register_wins(my_netbios_name, 0); + name_register_wins(my_netbios_name, 0); - /* - * Now initialize the file descriptor array and figure out what the - * max open files is, so we can return FD's that are above the max - * open file, and separated by a guard band - */ + /* + * Now initialize the file descriptor array and figure out what the + * max open files is, so we can return FD's that are above the max + * open file, and separated by a guard band + */ #if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE)) - do { - struct rlimit rlp; + do { + struct rlimit rlp; - if (getrlimit(RLIMIT_NOFILE, &rlp)) { + if (getrlimit(RLIMIT_NOFILE, &rlp)) { - DEBUG(0, ("smbc_init: getrlimit(1) for RLIMIT_NOFILE failed with error %s\n", strerror(errno))); + DEBUG(0, ("smbc_init: getrlimit(1) for RLIMIT_NOFILE failed with error %s\n", strerror(errno))); - smbc_start_fd = 1000000; - smbc_max_fd = 10000; /* FIXME, should be a define ... */ + smbc_start_fd = 1000000; - } - else { + } + else { - smbc_start_fd = rlp.rlim_max + 10000; /* Leave a guard space of 10,000 */ - smbc_max_fd = 10000; + smbc_start_fd = rlp.rlim_max + 10000; /* Leave a guard space of 10,000 */ - } - } while ( 0 ); + } + } while ( 0 ); #else /* !defined(HAVE_GETRLIMIT) || !defined(RLIMIT_NOFILE) */ - smbc_start_fd = 1000000; - smbc_max_fd = 10000; /* FIXME, should be a define ... */ + smbc_start_fd = 1000000; #endif - smbc_file_table = malloc(smbc_max_fd * sizeof(struct smbc_file *)); + smbc_file_table = malloc(SMBC_MAX_FD * sizeof(struct smbc_file *)); - for (p = 0; p < smbc_max_fd; p++) - smbc_file_table[p] = NULL; + for (p = 0; p < SMBC_MAX_FD; p++) + smbc_file_table[p] = NULL; - if (!smbc_file_table) - return ENOMEM; + if (!smbc_file_table) + return ENOMEM; - return 0; /* Success */ + return 0; /* Success */ } @@ -538,108 +574,108 @@ int smbc_init(smbc_get_auth_data_fn fn, int debug) int smbc_open(const char *fname, int flags, mode_t mode) { - fstring server, share, user, password, workgroup; - pstring path; - struct smbc_server *srv = NULL; - int fd; + fstring server, share, user, password, workgroup; + pstring path; + struct smbc_server *srv = NULL; + int fd; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; /* Best I can think of ... */ - return -1; + errno = EINVAL; /* Best I can think of ... */ + return -1; - } + } - if (!fname) { + if (!fname) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - smbc_parse_path(fname, server, share, path, user, password); /* FIXME, check errors */ + smbc_parse_path(fname, server, share, path, user, password); /* FIXME, check errors */ - if (user[0] == (char)0) pstrcpy(user, smbc_user); + if (user[0] == (char)0) pstrcpy(user, smbc_user); - pstrcpy(workgroup, lp_workgroup()); + pstrcpy(workgroup, lp_workgroup()); - srv = smbc_server(server, share, workgroup, user, password); + srv = smbc_server(server, share, workgroup, user, password); - if (!srv) { + if (!srv) { - if (errno == EPERM) errno = EACCES; - return -1; /* smbc_server sets errno */ + if (errno == EPERM) errno = EACCES; + return -1; /* smbc_server sets errno */ - } + } - /* Hmmm, the test for a directory is suspect here ... FIXME */ + /* Hmmm, the test for a directory is suspect here ... FIXME */ - if (strlen(path) > 0 && path[strlen(path) - 1] == '\\') { + if (strlen(path) > 0 && path[strlen(path) - 1] == '\\') { - fd = -1; + fd = -1; - } - else { + } + else { - int slot = 0; + int slot = 0; - /* Find a free slot first */ + /* Find a free slot first */ - while (smbc_file_table[slot]) - slot++; + while (smbc_file_table[slot]) + slot++; - if (slot > smbc_max_fd) { + if (slot > SMBC_MAX_FD) { - errno = ENOMEM; /* FIXME, is this best? */ - return -1; + errno = ENOMEM; /* FIXME, is this best? */ + return -1; - } + } - smbc_file_table[slot] = malloc(sizeof(struct smbc_file)); + smbc_file_table[slot] = malloc(sizeof(struct smbc_file)); - if (!smbc_file_table[slot]) { + if (!smbc_file_table[slot]) { - errno = ENOMEM; - return -1; + errno = ENOMEM; + return -1; - } + } - if ((fd = cli_open(&srv->cli, path, flags, DENY_NONE)) < 0) { + if ((fd = cli_open(&srv->cli, path, flags, DENY_NONE)) < 0) { - /* Handle the error ... */ + /* Handle the error ... */ - SAFE_FREE(smbc_file_table[slot]); - errno = smbc_errno(&srv->cli); - return -1; + SAFE_FREE(smbc_file_table[slot]); + errno = smbc_errno(&srv->cli); + return -1; - } + } - /* Fill in file struct */ + /* Fill in file struct */ - smbc_file_table[slot]->cli_fd = fd; - smbc_file_table[slot]->smbc_fd = slot + smbc_start_fd; - smbc_file_table[slot]->fname = strdup(fname); - smbc_file_table[slot]->srv = srv; - smbc_file_table[slot]->offset = 0; - smbc_file_table[slot]->file = True; + smbc_file_table[slot]->cli_fd = fd; + smbc_file_table[slot]->smbc_fd = slot + smbc_start_fd; + smbc_file_table[slot]->fname = strdup(fname); + smbc_file_table[slot]->srv = srv; + smbc_file_table[slot]->offset = 0; + smbc_file_table[slot]->file = True; - return smbc_file_table[slot]->smbc_fd; + return smbc_file_table[slot]->smbc_fd; - } + } - /* Check if opendir needed ... */ + /* Check if opendir needed ... */ - if (fd == -1) { - int eno = 0; + if (fd == -1) { + int eno = 0; - eno = smbc_errno(&srv->cli); - fd = smbc_opendir(fname); - if (fd < 0) errno = eno; - return fd; + eno = smbc_errno(&srv->cli); + fd = smbc_opendir(fname); + if (fd < 0) errno = eno; + return fd; - } + } - return 1; /* Success, with fd ... */ + return 1; /* Success, with fd ... */ } @@ -652,14 +688,14 @@ static int creat_bits = O_WRONLY | O_CREAT | O_TRUNC; /* FIXME: Do we need this int smbc_creat(const char *path, mode_t mode) { - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - return smbc_open(path, creat_bits, mode); + return smbc_open(path, creat_bits, mode); } /* @@ -668,57 +704,57 @@ int smbc_creat(const char *path, mode_t mode) ssize_t smbc_read(int fd, void *buf, size_t count) { - struct smbc_file *fe; - int ret; + struct smbc_file *fe; + int ret; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - DEBUG(4, ("smbc_read(%d, %d)\n", fd, (int)count)); + DEBUG(4, ("smbc_read(%d, %d)\n", fd, (int)count)); - if (fd < smbc_start_fd || fd >= (smbc_start_fd + smbc_max_fd)) { + if (fd < smbc_start_fd || fd >= (smbc_start_fd + SMBC_MAX_FD)) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - /* Check that the buffer exists ... */ + /* Check that the buffer exists ... */ - if (buf == NULL) { + if (buf == NULL) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - fe = smbc_file_table[fd - smbc_start_fd]; + fe = smbc_file_table[fd - smbc_start_fd]; - if (!fe || !fe->file) { + if (!fe || !fe->file) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - ret = cli_read(&fe->srv->cli, fe->cli_fd, buf, fe->offset, count); + ret = cli_read(&fe->srv->cli, fe->cli_fd, buf, fe->offset, count); - if (ret < 0) { + if (ret < 0) { - errno = smbc_errno(&fe->srv->cli); - return -1; + errno = smbc_errno(&fe->srv->cli); + return -1; - } + } - fe->offset += ret; + fe->offset += ret; - DEBUG(4, (" --> %d\n", ret)); + DEBUG(4, (" --> %d\n", ret)); - return ret; /* Success, ret bytes of data ... */ + return ret; /* Success, ret bytes of data ... */ } @@ -728,53 +764,53 @@ ssize_t smbc_read(int fd, void *buf, size_t count) ssize_t smbc_write(int fd, void *buf, size_t count) { - int ret; - struct smbc_file *fe; + int ret; + struct smbc_file *fe; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (fd < smbc_start_fd || fd >= (smbc_start_fd + smbc_max_fd)) { + if (fd < smbc_start_fd || fd >= (smbc_start_fd + SMBC_MAX_FD)) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - /* Check that the buffer exists ... */ + /* Check that the buffer exists ... */ - if (buf == NULL) { + if (buf == NULL) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - fe = smbc_file_table[fd - smbc_start_fd]; + fe = smbc_file_table[fd - smbc_start_fd]; - if (!fe || !fe->file) { + if (!fe || !fe->file) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - ret = cli_write(&fe->srv->cli, fe->cli_fd, 0, buf, fe->offset, count); + ret = cli_write(&fe->srv->cli, fe->cli_fd, 0, buf, fe->offset, count); - if (ret <= 0) { + if (ret <= 0) { - errno = smbc_errno(&fe->srv->cli); - return -1; + errno = smbc_errno(&fe->srv->cli); + return -1; - } + } - fe->offset += ret; + fe->offset += ret; - return ret; /* Success, 0 bytes of data ... */ + return ret; /* Success, 0 bytes of data ... */ } /* @@ -783,49 +819,60 @@ ssize_t smbc_write(int fd, void *buf, size_t count) int smbc_close(int fd) { - struct smbc_file *fe; + struct smbc_file *fe; + struct smbc_server *srv; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (fd < smbc_start_fd || fd >= (smbc_start_fd + smbc_max_fd)) { + if (fd < smbc_start_fd || fd >= (smbc_start_fd + SMBC_MAX_FD)) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - fe = smbc_file_table[fd - smbc_start_fd]; + fe = smbc_file_table[fd - smbc_start_fd]; - if (!fe) { + if (!fe) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - if (!fe->file) { + if (!fe->file) { - return smbc_closedir(fd); + return smbc_closedir(fd); - } + } + + if (!cli_close(&fe->srv->cli, fe->cli_fd)) { - if (!cli_close(&fe->srv->cli, fe->cli_fd)) { + DEBUG(3, ("cli_close failed on %s (%d). purging server.\n", + fe->fname, fe->smbc_fd)); + /* Deallocate slot and remove the server + * from the server cache if unused */ + errno = smbc_errno(&fe->srv->cli); + srv = fe->srv; + SAFE_FREE(fe->fname); + SAFE_FREE(fe); + smbc_file_table[fd - smbc_start_fd] = NULL; + smbc_remove_unused_server(srv); - errno = smbc_errno(&fe->srv->cli); /* FIXME, should we deallocate slot? */ - return -1; + return -1; - } + } - SAFE_FREE(fe->fname); - SAFE_FREE(fe); - smbc_file_table[fd - smbc_start_fd] = NULL; + SAFE_FREE(fe->fname); + SAFE_FREE(fe); + smbc_file_table[fd - smbc_start_fd] = NULL; - return 0; + return 0; } /* @@ -834,90 +881,90 @@ int smbc_close(int fd) int smbc_unlink(const char *fname) { - fstring server, share, user, password, workgroup; - pstring path; - struct smbc_server *srv = NULL; + fstring server, share, user, password, workgroup; + pstring path; + struct smbc_server *srv = NULL; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; /* Best I can think of ... */ - return -1; + errno = EINVAL; /* Best I can think of ... */ + return -1; - } + } - if (!fname) { + if (!fname) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - smbc_parse_path(fname, server, share, path, user, password); /* FIXME, check errors */ + smbc_parse_path(fname, server, share, path, user, password); /* FIXME, check errors */ - if (user[0] == (char)0) pstrcpy(user, smbc_user); + if (user[0] == (char)0) pstrcpy(user, smbc_user); - pstrcpy(workgroup, lp_workgroup()); + pstrcpy(workgroup, lp_workgroup()); - srv = smbc_server(server, share, workgroup, user, password); + srv = smbc_server(server, share, workgroup, user, password); - if (!srv) { + if (!srv) { - return -1; /* smbc_server sets errno */ + return -1; /* smbc_server sets errno */ - } + } - /* if (strncmp(srv->cli.dev, "LPT", 3) == 0) { + /* if (strncmp(srv->cli.dev, "LPT", 3) == 0) { - int job = smbc_stat_printjob(srv, path, NULL, NULL); - if (job == -1) { + int job = smbc_stat_printjob(srv, path, NULL, NULL); + if (job == -1) { - return -1; + return -1; - } - if ((err = cli_printjob_del(&srv->cli, job)) != 0) { + } + if ((err = cli_printjob_del(&srv->cli, job)) != 0) { - return -1; + return -1; - } - } else */ + } + } else */ - if (!cli_unlink(&srv->cli, path)) { + if (!cli_unlink(&srv->cli, path)) { - errno = smbc_errno(&srv->cli); + errno = smbc_errno(&srv->cli); - if (errno == EACCES) { /* Check if the file is a directory */ + if (errno == EACCES) { /* Check if the file is a directory */ - int saverr = errno; - size_t size = 0; - uint16 mode = 0; - time_t m_time = 0, a_time = 0, c_time = 0; - SMB_INO_T ino = 0; + int saverr = errno; + size_t size = 0; + uint16 mode = 0; + time_t m_time = 0, a_time = 0, c_time = 0; + SMB_INO_T ino = 0; - if (!smbc_getatr(srv, path, &mode, &size, - &c_time, &a_time, &m_time, &ino)) { + if (!smbc_getatr(srv, path, &mode, &size, + &c_time, &a_time, &m_time, &ino)) { - /* Hmmm, bad error ... What? */ + /* Hmmm, bad error ... What? */ - errno = smbc_errno(&srv->cli); - return -1; + errno = smbc_errno(&srv->cli); + return -1; - } - else { + } + else { - if (IS_DOS_DIR(mode)) - errno = EISDIR; - else - errno = saverr; /* Restore this */ + if (IS_DOS_DIR(mode)) + errno = EISDIR; + else + errno = saverr; /* Restore this */ - } - } + } + } - return -1; + return -1; - } + } - return 0; /* Success ... */ + return 0; /* Success ... */ } @@ -927,67 +974,67 @@ int smbc_unlink(const char *fname) int smbc_rename(const char *oname, const char *nname) { - fstring server1, share1, server2, share2, user1, user2, password1, password2, workgroup; - pstring path1, path2; - struct smbc_server *srv = NULL; + fstring server1, share1, server2, share2, user1, user2, password1, password2, workgroup; + pstring path1, path2; + struct smbc_server *srv = NULL; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; /* Best I can think of ... */ - return -1; + errno = EINVAL; /* Best I can think of ... */ + return -1; - } + } - if (!oname || !nname) { + if (!oname || !nname) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - DEBUG(4, ("smbc_rename(%s,%s)\n", oname, nname)); + DEBUG(4, ("smbc_rename(%s,%s)\n", oname, nname)); - smbc_parse_path(oname, server1, share1, path1, user1, password1); + smbc_parse_path(oname, server1, share1, path1, user1, password1); - if (user1[0] == (char)0) pstrcpy(user1, smbc_user); + if (user1[0] == (char)0) pstrcpy(user1, smbc_user); - smbc_parse_path(nname, server2, share2, path2, user2, password2); + smbc_parse_path(nname, server2, share2, path2, user2, password2); - if (user2[0] == (char)0) pstrcpy(user2, smbc_user); + if (user2[0] == (char)0) pstrcpy(user2, smbc_user); - if (strcmp(server1, server2) || strcmp(share1, share2) || - strcmp(user1, user2)) { + if (strcmp(server1, server2) || strcmp(share1, share2) || + strcmp(user1, user2)) { - /* Can't rename across file systems, or users?? */ + /* Can't rename across file systems, or users?? */ - errno = EXDEV; - return -1; + errno = EXDEV; + return -1; - } + } - pstrcpy(workgroup, lp_workgroup()); + pstrcpy(workgroup, lp_workgroup()); - srv = smbc_server(server1, share1, workgroup, user1, password1); - if (!srv) { + srv = smbc_server(server1, share1, workgroup, user1, password1); + if (!srv) { - return -1; + return -1; - } + } - if (!cli_rename(&srv->cli, path1, path2)) { - int eno = smbc_errno(&srv->cli); + if (!cli_rename(&srv->cli, path1, path2)) { + int eno = smbc_errno(&srv->cli); - if (eno != EEXIST || - !cli_unlink(&srv->cli, path2) || - !cli_rename(&srv->cli, path1, path2)) { + if (eno != EEXIST || + !cli_unlink(&srv->cli, path2) || + !cli_rename(&srv->cli, path1, path2)) { - errno = eno; - return -1; + errno = eno; + return -1; - } - } + } + } - return 0; /* Success */ + return 0; /* Success */ } @@ -997,67 +1044,67 @@ int smbc_rename(const char *oname, const char *nname) off_t smbc_lseek(int fd, off_t offset, int whence) { - struct smbc_file *fe; - size_t size; + struct smbc_file *fe; + size_t size; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (fd < smbc_start_fd || fd >= (smbc_start_fd + smbc_max_fd)) { + if (fd < smbc_start_fd || fd >= (smbc_start_fd + SMBC_MAX_FD)) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - fe = smbc_file_table[fd - smbc_start_fd]; + fe = smbc_file_table[fd - smbc_start_fd]; - if (!fe) { + if (!fe) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - if (!fe->file) { + if (!fe->file) { - errno = EINVAL; - return -1; /* Can't lseek a dir ... */ + errno = EINVAL; + return -1; /* Can't lseek a dir ... */ - } + } - switch (whence) { - case SEEK_SET: - fe->offset = offset; - break; + switch (whence) { + case SEEK_SET: + fe->offset = offset; + break; - case SEEK_CUR: - fe->offset += offset; - break; + case SEEK_CUR: + fe->offset += offset; + break; - case SEEK_END: - if (!cli_qfileinfo(&fe->srv->cli, fe->cli_fd, NULL, &size, NULL, NULL, - NULL, NULL, NULL) && - !cli_getattrE(&fe->srv->cli, fe->cli_fd, NULL, &size, NULL, NULL, - NULL)) { + case SEEK_END: + if (!cli_qfileinfo(&fe->srv->cli, fe->cli_fd, NULL, &size, NULL, NULL, + NULL, NULL, NULL) && + !cli_getattrE(&fe->srv->cli, fe->cli_fd, NULL, &size, NULL, NULL, + NULL)) { - errno = EINVAL; - return -1; - } - fe->offset = size + offset; - break; + errno = EINVAL; + return -1; + } + fe->offset = size + offset; + break; - default: - errno = EINVAL; - break; + default: + errno = EINVAL; + break; - } + } - return fe->offset; + return fe->offset; } @@ -1069,8 +1116,8 @@ static ino_t smbc_inode(const char *name) { - if (!*name) return 2; /* FIXME, why 2 ??? */ - return (ino_t)str_checksum(name); + if (!*name) return 2; /* FIXME, why 2 ??? */ + return (ino_t)str_checksum(name); } @@ -1083,36 +1130,36 @@ static int smbc_setup_stat(struct stat *st, char *fname, size_t size, int mode) { - st->st_mode = 0; - - if (IS_DOS_DIR(mode)) { - st->st_mode = SMBC_DIR_MODE; - } else { - st->st_mode = SMBC_FILE_MODE; - } - - if (IS_DOS_ARCHIVE(mode)) st->st_mode |= S_IXUSR; - if (IS_DOS_SYSTEM(mode)) st->st_mode |= S_IXGRP; - if (IS_DOS_HIDDEN(mode)) st->st_mode |= S_IXOTH; - if (!IS_DOS_READONLY(mode)) st->st_mode |= S_IWUSR; + st->st_mode = 0; - st->st_size = size; - st->st_blksize = 512; - st->st_blocks = (size+511)/512; - st->st_uid = getuid(); - st->st_gid = getgid(); + if (IS_DOS_DIR(mode)) { + st->st_mode = SMBC_DIR_MODE; + } else { + st->st_mode = SMBC_FILE_MODE; + } - if (IS_DOS_DIR(mode)) { - st->st_nlink = 2; - } else { - st->st_nlink = 1; - } + if (IS_DOS_ARCHIVE(mode)) st->st_mode |= S_IXUSR; + if (IS_DOS_SYSTEM(mode)) st->st_mode |= S_IXGRP; + if (IS_DOS_HIDDEN(mode)) st->st_mode |= S_IXOTH; + if (!IS_DOS_READONLY(mode)) st->st_mode |= S_IWUSR; + + st->st_size = size; + st->st_blksize = 512; + st->st_blocks = (size+511)/512; + st->st_uid = getuid(); + st->st_gid = getgid(); + + if (IS_DOS_DIR(mode)) { + st->st_nlink = 2; + } else { + st->st_nlink = 1; + } - if (st->st_ino == 0) { - st->st_ino = smbc_inode(fname); - } + if (st->st_ino == 0) { + st->st_ino = smbc_inode(fname); + } - return True; /* FIXME: Is this needed ? */ + return True; /* FIXME: Is this needed ? */ } @@ -1127,28 +1174,28 @@ BOOL smbc_getatr(struct smbc_server *srv, char *path, SMB_INO_T *ino) { - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - DEBUG(4,("smbc_getatr: sending qpathinfo\n")); + DEBUG(4,("smbc_getatr: sending qpathinfo\n")); - if (!srv->no_pathinfo2 && - cli_qpathinfo2(&srv->cli, path, c_time, a_time, m_time, NULL, - size, mode, ino)) return True; - - /* if this is NT then don't bother with the getatr */ - if (srv->cli.capabilities & CAP_NT_SMBS) return False; - - if (cli_getatr(&srv->cli, path, mode, size, m_time)) { - a_time = c_time = m_time; - srv->no_pathinfo2 = True; - return True; - } - return False; + if (!srv->no_pathinfo2 && + cli_qpathinfo2(&srv->cli, path, c_time, a_time, m_time, NULL, + size, mode, ino)) return True; + + /* if this is NT then don't bother with the getatr */ + if (srv->cli.capabilities & CAP_NT_SMBS) return False; + + if (cli_getatr(&srv->cli, path, mode, size, m_time)) { + a_time = c_time = m_time; + srv->no_pathinfo2 = True; + return True; + } + return False; } /* @@ -1157,85 +1204,85 @@ BOOL smbc_getatr(struct smbc_server *srv, char *path, int smbc_stat(const char *fname, struct stat *st) { - struct smbc_server *srv; - fstring server, share, user, password, workgroup; - pstring path; - time_t m_time = 0, a_time = 0, c_time = 0; - size_t size = 0; - uint16 mode = 0; - SMB_INO_T ino = 0; + struct smbc_server *srv; + fstring server, share, user, password, workgroup; + pstring path; + time_t m_time = 0, a_time = 0, c_time = 0; + size_t size = 0; + uint16 mode = 0; + SMB_INO_T ino = 0; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; /* Best I can think of ... */ - return -1; + errno = EINVAL; /* Best I can think of ... */ + return -1; - } + } - if (!fname) { + if (!fname) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - DEBUG(4, ("smbc_stat(%s)\n", fname)); + DEBUG(4, ("smbc_stat(%s)\n", fname)); - smbc_parse_path(fname, server, share, path, user, password); /*FIXME, errors*/ + smbc_parse_path(fname, server, share, path, user, password); /*FIXME, errors*/ - if (user[0] == (char)0) pstrcpy(user, smbc_user); + if (user[0] == (char)0) pstrcpy(user, smbc_user); - pstrcpy(workgroup, lp_workgroup()); + pstrcpy(workgroup, lp_workgroup()); - srv = smbc_server(server, share, workgroup, user, password); + srv = smbc_server(server, share, workgroup, user, password); - if (!srv) { + if (!srv) { - return -1; /* errno set by smbc_server */ + return -1; /* errno set by smbc_server */ - } + } - /* if (strncmp(srv->cli.dev, "IPC", 3) == 0) { + /* if (strncmp(srv->cli.dev, "IPC", 3) == 0) { - mode = aDIR | aRONLY; + mode = aDIR | aRONLY; - } - else if (strncmp(srv->cli.dev, "LPT", 3) == 0) { + } + else if (strncmp(srv->cli.dev, "LPT", 3) == 0) { - if (strcmp(path, "\\") == 0) { + if (strcmp(path, "\\") == 0) { - mode = aDIR | aRONLY; + mode = aDIR | aRONLY; - } - else { + } + else { - mode = aRONLY; - smbc_stat_printjob(srv, path, &size, &m_time); - c_time = a_time = m_time; + mode = aRONLY; + smbc_stat_printjob(srv, path, &size, &m_time); + c_time = a_time = m_time; - } - else { */ + } + else { */ - if (!smbc_getatr(srv, path, &mode, &size, - &c_time, &a_time, &m_time, &ino)) { + if (!smbc_getatr(srv, path, &mode, &size, + &c_time, &a_time, &m_time, &ino)) { - errno = smbc_errno(&srv->cli); - return -1; + errno = smbc_errno(&srv->cli); + return -1; - } + } - /* } */ + /* } */ - st->st_ino = ino; + st->st_ino = ino; - smbc_setup_stat(st, path, size, mode); + smbc_setup_stat(st, path, size, mode); - st->st_atime = a_time; - st->st_ctime = c_time; - st->st_mtime = m_time; - st->st_dev = srv->dev; + st->st_atime = a_time; + st->st_ctime = c_time; + st->st_mtime = m_time; + st->st_dev = srv->dev; - return 0; + return 0; } @@ -1245,61 +1292,61 @@ int smbc_stat(const char *fname, struct stat *st) int smbc_fstat(int fd, struct stat *st) { - struct smbc_file *fe; - time_t c_time, a_time, m_time; - size_t size; - uint16 mode; - SMB_INO_T ino = 0; + struct smbc_file *fe; + time_t c_time, a_time, m_time; + size_t size; + uint16 mode; + SMB_INO_T ino = 0; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (fd < smbc_start_fd || fd >= (smbc_start_fd + smbc_max_fd)) { + if (fd < smbc_start_fd || fd >= (smbc_start_fd + SMBC_MAX_FD)) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - fe = smbc_file_table[fd - smbc_start_fd]; + fe = smbc_file_table[fd - smbc_start_fd]; - if (!fe) { + if (!fe) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - if (!fe->file) { + if (!fe->file) { - return smbc_fstatdir(fd, st); + return smbc_fstatdir(fd, st); - } + } - if (!cli_qfileinfo(&fe->srv->cli, fe->cli_fd, - &mode, &size, &c_time, &a_time, &m_time, NULL, &ino) && - !cli_getattrE(&fe->srv->cli, fe->cli_fd, - &mode, &size, &c_time, &a_time, &m_time)) { + if (!cli_qfileinfo(&fe->srv->cli, fe->cli_fd, + &mode, &size, &c_time, &a_time, &m_time, NULL, &ino) && + !cli_getattrE(&fe->srv->cli, fe->cli_fd, + &mode, &size, &c_time, &a_time, &m_time)) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - st->st_ino = ino; + st->st_ino = ino; - smbc_setup_stat(st, fe->fname, size, mode); + smbc_setup_stat(st, fe->fname, size, mode); - st->st_atime = a_time; - st->st_ctime = c_time; - st->st_mtime = m_time; - st->st_dev = fe->srv->dev; + st->st_atime = a_time; + st->st_ctime = c_time; + st->st_mtime = m_time; + st->st_dev = fe->srv->dev; - return 0; + return 0; } @@ -1313,136 +1360,139 @@ int smbc_fstat(int fd, struct stat *st) * smb:workgroup//server * smb://server * smb://server/share + * smb://<IP-addr> which should list shares on server + * smb://<IP-addr>/share which should list files on share */ static void smbc_remove_dir(struct smbc_file *dir) { - struct smbc_dir_list *d,*f; + struct smbc_dir_list *d,*f; - d = dir->dir_list; - while (d) { + d = dir->dir_list; + while (d) { - f = d; d = d->next; + f = d; d = d->next; - SAFE_FREE(f->dirent); - SAFE_FREE(f); + SAFE_FREE(f->dirent); + SAFE_FREE(f); - } + } - dir->dir_list = dir->dir_end = dir->dir_next = NULL; + dir->dir_list = dir->dir_end = dir->dir_next = NULL; } static int add_dirent(struct smbc_file *dir, const char *name, const char *comment, uint32 type) { - struct smbc_dirent *dirent; - int size; + struct smbc_dirent *dirent; + int size; - /* - * Allocate space for the dirent, which must be increased by the - * size of the name and the comment and 1 for the null on the comment. - * The null on the name is already accounted for. - */ + /* + * Allocate space for the dirent, which must be increased by the + * size of the name and the comment and 1 for the null on the comment. + * The null on the name is already accounted for. + */ - size = sizeof(struct smbc_dirent) + (name?strlen(name):0) + - (comment?strlen(comment):0) + 1; + size = sizeof(struct smbc_dirent) + (name?strlen(name):0) + + (comment?strlen(comment):0) + 1; - dirent = malloc(size); + dirent = malloc(size); - if (!dirent) { + if (!dirent) { - dir->dir_error = ENOMEM; - return -1; + dir->dir_error = ENOMEM; + return -1; - } + } - if (dir->dir_list == NULL) { + if (dir->dir_list == NULL) { - dir->dir_list = malloc(sizeof(struct smbc_dir_list)); - if (!dir->dir_list) { + dir->dir_list = malloc(sizeof(struct smbc_dir_list)); + if (!dir->dir_list) { - SAFE_FREE(dirent); - dir->dir_error = ENOMEM; - return -1; + SAFE_FREE(dirent); + dir->dir_error = ENOMEM; + return -1; - } + } - dir->dir_end = dir->dir_next = dir->dir_list; + dir->dir_end = dir->dir_next = dir->dir_list; - } - else { + } + else { - dir->dir_end->next = malloc(sizeof(struct smbc_dir_list)); + dir->dir_end->next = malloc(sizeof(struct smbc_dir_list)); - if (!dir->dir_end) { + if (!dir->dir_end) { - SAFE_FREE(dirent); - dir->dir_error = ENOMEM; - return -1; + SAFE_FREE(dirent); + dir->dir_error = ENOMEM; + return -1; - } + } - dir->dir_end = dir->dir_end->next; + dir->dir_end = dir->dir_end->next; - } + } - dir->dir_end->next = NULL; - dir->dir_end->dirent = dirent; + dir->dir_end->next = NULL; + dir->dir_end->dirent = dirent; - dirent->smbc_type = type; - dirent->namelen = (name?strlen(name):0); - dirent->commentlen = (comment?strlen(comment):0); - dirent->dirlen = size; + dirent->smbc_type = type; + dirent->namelen = (name?strlen(name):0); + dirent->commentlen = (comment?strlen(comment):0); + dirent->dirlen = size; - strncpy(dirent->name, (name?name:""), dirent->namelen + 1); + strncpy(dirent->name, (name?name:""), dirent->namelen + 1); - dirent->comment = (char *)(&dirent->name + dirent->namelen + 1); - strncpy(dirent->comment, (comment?comment:""), dirent->commentlen + 1); + dirent->comment = (char *)(&dirent->name + dirent->namelen + 1); + strncpy(dirent->comment, (comment?comment:""), dirent->commentlen + 1); - return 0; + return 0; } static void list_fn(const char *name, uint32 type, const char *comment, void *state) { - struct smbc_file *dir = (struct smbc_file *)state; - int dirent_type; + struct smbc_file *dir = (struct smbc_file *)state; + int dirent_type; - /* We need to process the type a little ... */ + /* We need to process the type a little ... */ - if (dir->dir_type == SMBC_FILE_SHARE) { + if (dir->dir_type == SMBC_FILE_SHARE) { - switch (type) { - case 0: /* Directory tree */ - dirent_type = SMBC_FILE_SHARE; - break; + switch (type) { + case 0: /* Directory tree */ + dirent_type = SMBC_FILE_SHARE; + break; - case 1: - dirent_type = SMBC_PRINTER_SHARE; - break; + case 1: + dirent_type = SMBC_PRINTER_SHARE; + break; - case 2: - dirent_type = SMBC_COMMS_SHARE; - break; + case 2: + dirent_type = SMBC_COMMS_SHARE; + break; - case 3: - dirent_type = SMBC_IPC_SHARE; - break; + case 3: + dirent_type = SMBC_IPC_SHARE; + break; - default: - dirent_type = SMBC_FILE_SHARE; /* FIXME, error? */ - break; - } + default: + dirent_type = SMBC_FILE_SHARE; /* FIXME, error? */ + break; + } - } - else dirent_type = dir->dir_type; + } + else dirent_type = dir->dir_type; - if (add_dirent(dir, name, comment, dirent_type) < 0) { + if (add_dirent(dir, name, comment, dirent_type) < 0) { - /* An error occurred, what do we do? */ + /* An error occurred, what do we do? */ + /* FIXME: Add some code here */ - } + } } @@ -1450,312 +1500,309 @@ static void dir_list_fn(file_info *finfo, const char *mask, void *state) { - /* fprintf(stderr, "Finfo->name=%s, mask=%s, mode=%0X\n", finfo->name, mask, finfo->mode);*/ - if (add_dirent((struct smbc_file *)state, finfo->name, "", - (finfo->mode&aDIR?SMBC_DIR:SMBC_FILE)) < 0) { + if (add_dirent((struct smbc_file *)state, finfo->name, "", + (finfo->mode&aDIR?SMBC_DIR:SMBC_FILE)) < 0) { - /* Handle an error ... */ + /* Handle an error ... */ + /* FIXME: Add some code ... */ - } + } } int smbc_opendir(const char *fname) { - fstring server, share, user, password, workgroup; - pstring path; - struct smbc_server *srv = NULL; - struct in_addr rem_ip; - int slot = 0; + fstring server, share, user, password, workgroup; + pstring path; + struct smbc_server *srv = NULL; + struct in_addr rem_ip; + int slot = 0; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (!fname) { + if (!fname) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (smbc_parse_path(fname, server, share, path, user, password)) { + if (smbc_parse_path(fname, server, share, path, user, password)) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (user[0] == (char)0) pstrcpy(user, smbc_user); + if (user[0] == (char)0) pstrcpy(user, smbc_user); - pstrcpy(workgroup, lp_workgroup()); + pstrcpy(workgroup, lp_workgroup()); - /* Get a file entry ... */ + /* Get a file entry ... */ - slot = 0; + slot = 0; - while (smbc_file_table[slot]) - slot++; + while (smbc_file_table[slot]) + slot++; - if (slot > smbc_max_fd) { + if (slot > SMBC_MAX_FD) { - errno = ENOMEM; - return -1; /* FIXME, ... move into a func */ + errno = ENOMEM; + return -1; /* FIXME, ... move into a func */ - } + } - smbc_file_table[slot] = malloc(sizeof(struct smbc_file)); + smbc_file_table[slot] = malloc(sizeof(struct smbc_file)); - if (!smbc_file_table[slot]) { + if (!smbc_file_table[slot]) { - errno = ENOMEM; - return -1; + errno = ENOMEM; + return -1; - } + } - smbc_file_table[slot]->cli_fd = 0; - smbc_file_table[slot]->smbc_fd = slot + smbc_start_fd; - smbc_file_table[slot]->fname = strdup(fname); - smbc_file_table[slot]->srv = NULL; - smbc_file_table[slot]->offset = 0; - smbc_file_table[slot]->file = False; - smbc_file_table[slot]->dir_list = - smbc_file_table[slot]->dir_next = - smbc_file_table[slot]->dir_end = NULL; + smbc_file_table[slot]->cli_fd = 0; + smbc_file_table[slot]->smbc_fd = slot + smbc_start_fd; + smbc_file_table[slot]->fname = strdup(fname); + smbc_file_table[slot]->srv = NULL; + smbc_file_table[slot]->offset = 0; + smbc_file_table[slot]->file = False; + smbc_file_table[slot]->dir_list = + smbc_file_table[slot]->dir_next = + smbc_file_table[slot]->dir_end = NULL; - if (server[0] == (char)0) { + if (server[0] == (char)0) { - if (share[0] != (char)0 || path[0] != (char)0) { + if (share[0] != (char)0 || path[0] != (char)0) { - errno = EINVAL; - if (smbc_file_table[slot]) { - SAFE_FREE(smbc_file_table[slot]->fname); - SAFE_FREE(smbc_file_table[slot]); - } - return -1; - - } + errno = EINVAL; + if (smbc_file_table[slot]) { + SAFE_FREE(smbc_file_table[slot]->fname); + SAFE_FREE(smbc_file_table[slot]); + } + return -1; - /* We have server and share and path empty ... so list the workgroups */ + } - /*cli_get_backup_server(my_netbios_name, workgroup, server, sizeof(server));*/ + /* We have server and share and path empty ... so list the workgroups */ - if (!resolve_name(lp_workgroup(), &rem_ip, 0x1d)) { + if (!resolve_name(lp_workgroup(), &rem_ip, 0x1d)) { - errno = EINVAL; /* Something wrong with smb.conf? */ - return -1; + errno = EINVAL; /* Something wrong with smb.conf? */ + return -1; - } + } - smbc_file_table[slot]->dir_type = SMBC_WORKGROUP; + smbc_file_table[slot]->dir_type = SMBC_WORKGROUP; - /* find the name of the server ... */ + /* find the name of the server ... */ - if (!name_status_find(0, rem_ip, server)) { + if (!name_status_find(0, rem_ip, server)) { - fprintf(stderr, "Could not get the name of local master browser ...\n"); - errno = EINVAL; - return -1; + DEBUG(0, ("Could not get the name of local master browser for server %s\n", server); + errno = EINVAL; + return -1; - } + } - /* - * Get a connection to IPC$ on the server if we do not already have one - */ + /* + * Get a connection to IPC$ on the server if we do not already have one + */ - srv = smbc_server(server, "IPC$", workgroup, user, password); + srv = smbc_server(server, "IPC$", workgroup, user, password); - if (!srv) { + if (!srv) { - if (smbc_file_table[slot]) { - SAFE_FREE(smbc_file_table[slot]->fname); - SAFE_FREE(smbc_file_table[slot]); - } - return -1; + if (smbc_file_table[slot]) { + SAFE_FREE(smbc_file_table[slot]->fname); + SAFE_FREE(smbc_file_table[slot]); + } + return -1; - } + } - smbc_file_table[slot]->srv = srv; + smbc_file_table[slot]->srv = srv; - /* Now, list the stuff ... */ + /* Now, list the stuff ... */ - if (!cli_NetServerEnum(&srv->cli, workgroup, 0x80000000, list_fn, - (void *)smbc_file_table[slot])) { + if (!cli_NetServerEnum(&srv->cli, workgroup, 0x80000000, list_fn, + (void *)smbc_file_table[slot])) { - if (smbc_file_table[slot]) { - SAFE_FREE(smbc_file_table[slot]->fname); - SAFE_FREE(smbc_file_table[slot]); - } - errno = cli_errno(&srv->cli); - return -1; + if (smbc_file_table[slot]) { + SAFE_FREE(smbc_file_table[slot]->fname); + SAFE_FREE(smbc_file_table[slot]); + } + errno = cli_errno(&srv->cli); + return -1; - } - } - else { /* Server not an empty string ... Check the rest and see what gives */ + } + } + else { /* Server not an empty string ... Check the rest and see what gives */ - if (share[0] == (char)0) { + if (share[0] == (char)0) { - if (path[0] != (char)0) { /* Should not have empty share with path */ + if (path[0] != (char)0) { /* Should not have empty share with path */ - errno = EINVAL; - if (smbc_file_table[slot]) { - SAFE_FREE(smbc_file_table[slot]->fname); - SAFE_FREE(smbc_file_table[slot]); - } - return -1; + errno = EINVAL; + if (smbc_file_table[slot]) { + SAFE_FREE(smbc_file_table[slot]->fname); + SAFE_FREE(smbc_file_table[slot]); + } + return -1; - } + } - /* Check to see if <server><1D> translates, or <server><20> translates */ - /* However, we check to see if <server> is an IP address first */ + /* Check to see if <server><1D> translates, or <server><20> translates */ + /* However, we check to see if <server> is an IP address first */ - if (!is_ipaddress(server) && /* Not an IP addr so check next */ - resolve_name(server, &rem_ip, 0x1d)) { /* Found LMB */ - pstring buserver; + if (!is_ipaddress(server) && /* Not an IP addr so check next */ + resolve_name(server, &rem_ip, 0x1d)) { /* Found LMB */ + pstring buserver; - smbc_file_table[slot]->dir_type = SMBC_SERVER; + smbc_file_table[slot]->dir_type = SMBC_SERVER; - /* - * Get the backup list ... - */ + /* + * Get the backup list ... + */ - /*cli_get_backup_server(my_netbios_name, server, buserver, sizeof(buserver)); */ - if (!name_status_find(0, rem_ip, buserver)) { + if (!name_status_find(0, rem_ip, buserver)) { - fprintf(stderr, "Could not get name of local master browser ...\n"); - errno = EPERM; /* FIXME, is this correct */ - return -1; + DEBUG(0, ("Could not get name of local master browser %s\n", server)); + errno = EPERM; /* FIXME, is this correct */ + return -1; - } + } - /* - * Get a connection to IPC$ on the server if we do not already have one - */ + /* + * Get a connection to IPC$ on the server if we do not already have one + */ - srv = smbc_server(buserver, "IPC$", workgroup, user, password); + srv = smbc_server(buserver, "IPC$", workgroup, user, password); - if (!srv) { + if (!srv) { - if (smbc_file_table[slot]) { - SAFE_FREE(smbc_file_table[slot]->fname); - SAFE_FREE(smbc_file_table[slot]); - } - return -1; + if (smbc_file_table[slot]) { + SAFE_FREE(smbc_file_table[slot]->fname); + SAFE_FREE(smbc_file_table[slot]); + } + return -1; - } + } - smbc_file_table[slot]->srv = srv; + smbc_file_table[slot]->srv = srv; - /* Now, list the servers ... */ + /* Now, list the servers ... */ - if (!cli_NetServerEnum(&srv->cli, server, 0x0000FFFE, list_fn, - (void *)smbc_file_table[slot])) { + if (!cli_NetServerEnum(&srv->cli, server, 0x0000FFFE, list_fn, + (void *)smbc_file_table[slot])) { - if (smbc_file_table[slot]) { - SAFE_FREE(smbc_file_table[slot]->fname); - SAFE_FREE(smbc_file_table[slot]); - } - errno = cli_errno(&srv->cli); - return -1; + if (smbc_file_table[slot]) { + SAFE_FREE(smbc_file_table[slot]->fname); + SAFE_FREE(smbc_file_table[slot]); + } + errno = cli_errno(&srv->cli); + return -1; - } + } - } - else { + } + else { - if (resolve_name(server, &rem_ip, 0x20)) { + if (resolve_name(server, &rem_ip, 0x20)) { - /* Now, list the shares ... */ + /* Now, list the shares ... */ - smbc_file_table[slot]->dir_type = SMBC_FILE_SHARE; + smbc_file_table[slot]->dir_type = SMBC_FILE_SHARE; - srv = smbc_server(server, "IPC$", workgroup, user, password); + srv = smbc_server(server, "IPC$", workgroup, user, password); - if (!srv) { + if (!srv) { - if (smbc_file_table[slot]) { - SAFE_FREE(smbc_file_table[slot]->fname); - SAFE_FREE(smbc_file_table[slot]); - } - return -1; + if (smbc_file_table[slot]) { + SAFE_FREE(smbc_file_table[slot]->fname); + SAFE_FREE(smbc_file_table[slot]); + } + return -1; - } + } - smbc_file_table[slot]->srv = srv; + smbc_file_table[slot]->srv = srv; - /* Now, list the servers ... */ + /* Now, list the servers ... */ - if (cli_RNetShareEnum(&srv->cli, list_fn, - (void *)smbc_file_table[slot]) < 0) { + if (cli_RNetShareEnum(&srv->cli, list_fn, + (void *)smbc_file_table[slot]) < 0) { - errno = cli_errno(&srv->cli); - if (smbc_file_table[slot]) { - SAFE_FREE(smbc_file_table[slot]->fname); - SAFE_FREE(smbc_file_table[slot]); - } - return -1; + errno = cli_errno(&srv->cli); + if (smbc_file_table[slot]) { + SAFE_FREE(smbc_file_table[slot]->fname); + SAFE_FREE(smbc_file_table[slot]); + } + return -1; - } + } - } - else { + } + else { - errno = ENODEV; /* Neither the workgroup nor server exists */ - if (smbc_file_table[slot]) { - SAFE_FREE(smbc_file_table[slot]->fname); - SAFE_FREE(smbc_file_table[slot]); - } - return -1; + errno = ENODEV; /* Neither the workgroup nor server exists */ + if (smbc_file_table[slot]) { + SAFE_FREE(smbc_file_table[slot]->fname); + SAFE_FREE(smbc_file_table[slot]); + } + return -1; - } + } - } + } - } - else { /* The server and share are specified ... work from there ... */ + } + else { /* The server and share are specified ... work from there ... */ - /* Well, we connect to the server and list the directory */ + /* Well, we connect to the server and list the directory */ - smbc_file_table[slot]->dir_type = SMBC_FILE_SHARE; + smbc_file_table[slot]->dir_type = SMBC_FILE_SHARE; - srv = smbc_server(server, share, workgroup, user, password); + srv = smbc_server(server, share, workgroup, user, password); - if (!srv) { + if (!srv) { - if (smbc_file_table[slot]) { - SAFE_FREE(smbc_file_table[slot]->fname); - SAFE_FREE(smbc_file_table[slot]); - } - return -1; + if (smbc_file_table[slot]) { + SAFE_FREE(smbc_file_table[slot]->fname); + SAFE_FREE(smbc_file_table[slot]); + } + return -1; - } + } - smbc_file_table[slot]->srv = srv; + smbc_file_table[slot]->srv = srv; - /* Now, list the files ... */ + /* Now, list the files ... */ - pstrcat(path, "\\*"); + pstrcat(path, "\\*"); - if (cli_list(&srv->cli, path, aDIR | aSYSTEM | aHIDDEN, dir_list_fn, - (void *)smbc_file_table[slot]) < 0) { + if (cli_list(&srv->cli, path, aDIR | aSYSTEM | aHIDDEN, dir_list_fn, + (void *)smbc_file_table[slot]) < 0) { - if (smbc_file_table[slot]) { - SAFE_FREE(smbc_file_table[slot]->fname); - SAFE_FREE(smbc_file_table[slot]); - } - errno = smbc_errno(&srv->cli); - return -1; + if (smbc_file_table[slot]) { + SAFE_FREE(smbc_file_table[slot]->fname); + SAFE_FREE(smbc_file_table[slot]); + } + errno = smbc_errno(&srv->cli); + return -1; - } - } + } + } - } + } - return smbc_file_table[slot]->smbc_fd; + return smbc_file_table[slot]->smbc_fd; } @@ -1765,43 +1812,43 @@ int smbc_opendir(const char *fname) int smbc_closedir(int fd) { - struct smbc_file *fe; + struct smbc_file *fe; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (fd < smbc_start_fd || fd >= (smbc_start_fd + smbc_max_fd)) { + if (fd < smbc_start_fd || fd >= (smbc_start_fd + SMBC_MAX_FD)) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - fe = smbc_file_table[fd - smbc_start_fd]; + fe = smbc_file_table[fd - smbc_start_fd]; - if (!fe) { + if (!fe) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - smbc_remove_dir(fe); /* Clean it up */ + smbc_remove_dir(fe); /* Clean it up */ - if (fe) { + if (fe) { - SAFE_FREE(fe->fname); - SAFE_FREE(fe); /* Free the space too */ + SAFE_FREE(fe->fname); + SAFE_FREE(fe); /* Free the space too */ - } + } - smbc_file_table[fd - smbc_start_fd] = NULL; + smbc_file_table[fd - smbc_start_fd] = NULL; - return 0; + return 0; } @@ -1813,66 +1860,66 @@ static char smbc_local_dirent[512]; /* Make big enough */ struct smbc_dirent *smbc_readdir(unsigned int fd) { - struct smbc_file *fe; - struct smbc_dirent *dirp, *dirent; + struct smbc_file *fe; + struct smbc_dirent *dirp, *dirent; - /* Check that all is ok first ... */ + /* Check that all is ok first ... */ - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return NULL; + errno = EINVAL; + return NULL; - } + } - if (fd < smbc_start_fd || fd >= (smbc_start_fd + smbc_max_fd)) { + if (fd < smbc_start_fd || fd >= (smbc_start_fd + SMBC_MAX_FD)) { - errno = EBADF; - return NULL; + errno = EBADF; + return NULL; - } + } - fe = smbc_file_table[fd - smbc_start_fd]; + fe = smbc_file_table[fd - smbc_start_fd]; - if (!fe) { + if (!fe) { - errno = EBADF; - return NULL; + errno = EBADF; + return NULL; - } + } - if (fe->file != False) { /* FIXME, should be dir, perhaps */ + if (fe->file != False) { /* FIXME, should be dir, perhaps */ - errno = ENOTDIR; - return NULL; + errno = ENOTDIR; + return NULL; - } + } - if (!fe->dir_next) - return NULL; - else { + if (!fe->dir_next) + return NULL; + else { - dirent = fe->dir_next->dirent; + dirent = fe->dir_next->dirent; - if (!dirent) { + if (!dirent) { - errno = ENOENT; - return NULL; + errno = ENOENT; + return NULL; - } + } - /* Hmmm, do I even need to copy it? */ + /* Hmmm, do I even need to copy it? */ - bcopy(dirent, smbc_local_dirent, dirent->dirlen); /* Copy the dirent */ + bcopy(dirent, smbc_local_dirent, dirent->dirlen); /* Copy the dirent */ - dirp = (struct smbc_dirent *)smbc_local_dirent; + dirp = (struct smbc_dirent *)smbc_local_dirent; - dirp->comment = (char *)(&dirp->name + dirent->namelen + 1); + dirp->comment = (char *)(&dirp->name + dirent->namelen + 1); - fe->dir_next = fe->dir_next->next; + fe->dir_next = fe->dir_next->next; - return (struct smbc_dirent *)smbc_local_dirent; - } + return (struct smbc_dirent *)smbc_local_dirent; + } } @@ -1882,95 +1929,95 @@ struct smbc_dirent *smbc_readdir(unsigned int fd) int smbc_getdents(unsigned int fd, struct smbc_dirent *dirp, int count) { - struct smbc_file *fe; - struct smbc_dir_list *dir; - int rem = count, reqd; - char *ndir = (char *)dirp; + struct smbc_file *fe; + struct smbc_dir_list *dir; + int rem = count, reqd; + char *ndir = (char *)dirp; - /* Check that all is ok first ... */ + /* Check that all is ok first ... */ - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (fd < smbc_start_fd || fd >= (smbc_start_fd + smbc_max_fd)) { + if (fd < smbc_start_fd || fd >= (smbc_start_fd + SMBC_MAX_FD)) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - fe = smbc_file_table[fd - smbc_start_fd]; + fe = smbc_file_table[fd - smbc_start_fd]; - if (!fe) { + if (!fe) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - if (fe->file != False) { /* FIXME, should be dir, perhaps */ + if (fe->file != False) { /* FIXME, should be dir, perhaps */ - errno = ENOTDIR; - return -1; + errno = ENOTDIR; + return -1; - } + } - /* - * Now, retrieve the number of entries that will fit in what was passed - * We have to figure out if the info is in the list, or we need to - * send a request to the server to get the info. - */ + /* + * Now, retrieve the number of entries that will fit in what was passed + * We have to figure out if the info is in the list, or we need to + * send a request to the server to get the info. + */ - while ((dir = fe->dir_next)) { - struct smbc_dirent *dirent; + while ((dir = fe->dir_next)) { + struct smbc_dirent *dirent; - if (!dir->dirent) { + if (!dir->dirent) { - errno = ENOENT; /* Bad error */ - return -1; + errno = ENOENT; /* Bad error */ + return -1; - } + } - if (rem < (reqd = (sizeof(struct smbc_dirent) + dir->dirent->namelen + - dir->dirent->commentlen + 1))) { + if (rem < (reqd = (sizeof(struct smbc_dirent) + dir->dirent->namelen + + dir->dirent->commentlen + 1))) { - if (rem < count) { /* We managed to copy something */ + if (rem < count) { /* We managed to copy something */ - errno = 0; - return count - rem; + errno = 0; + return count - rem; - } - else { /* Nothing copied ... */ + } + else { /* Nothing copied ... */ - errno = EINVAL; /* Not enough space ... */ - return -1; + errno = EINVAL; /* Not enough space ... */ + return -1; - } + } - } + } - dirent = dir->dirent; + dirent = dir->dirent; - bcopy(dirent, ndir, reqd); /* Copy the data in ... */ + bcopy(dirent, ndir, reqd); /* Copy the data in ... */ - ((struct smbc_dirent *)ndir)->comment = - (char *)(&((struct smbc_dirent *)ndir)->name + dirent->namelen + 1); + ((struct smbc_dirent *)ndir)->comment = + (char *)(&((struct smbc_dirent *)ndir)->name + dirent->namelen + 1); - ndir += reqd; + ndir += reqd; - rem -= reqd; + rem -= reqd; - fe->dir_next = dir = dir -> next; - } + fe->dir_next = dir = dir -> next; + } - if (rem == count) - return 0; - else - return count - rem; + if (rem == count) + return 0; + else + return count - rem; } @@ -1980,69 +2027,69 @@ int smbc_getdents(unsigned int fd, struct smbc_dirent *dirp, int count) int smbc_mkdir(const char *fname, mode_t mode) { - struct smbc_server *srv; - fstring server, share, user, password, workgroup; - pstring path; + struct smbc_server *srv; + fstring server, share, user, password, workgroup; + pstring path; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (!fname) { + if (!fname) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - DEBUG(4, ("smbc_mkdir(%s)\n", fname)); + DEBUG(4, ("smbc_mkdir(%s)\n", fname)); - smbc_parse_path(fname, server, share, path, user, password); /*FIXME, errors*/ + smbc_parse_path(fname, server, share, path, user, password); /*FIXME, errors*/ - if (user[0] == (char)0) pstrcpy(user, smbc_user); + if (user[0] == (char)0) pstrcpy(user, smbc_user); - pstrcpy(workgroup, lp_workgroup()); + pstrcpy(workgroup, lp_workgroup()); - srv = smbc_server(server, share, workgroup, user, password); + srv = smbc_server(server, share, workgroup, user, password); - if (!srv) { + if (!srv) { - return -1; /* errno set by smbc_server */ + return -1; /* errno set by smbc_server */ - } + } - /* if (strncmp(srv->cli.dev, "IPC", 3) == 0) { + /* if (strncmp(srv->cli.dev, "IPC", 3) == 0) { - mode = aDIR | aRONLY; + mode = aDIR | aRONLY; - } - else if (strncmp(srv->cli.dev, "LPT", 3) == 0) { + } + else if (strncmp(srv->cli.dev, "LPT", 3) == 0) { - if (strcmp(path, "\\") == 0) { + if (strcmp(path, "\\") == 0) { - mode = aDIR | aRONLY; + mode = aDIR | aRONLY; - } - else { + } + else { - mode = aRONLY; - smbc_stat_printjob(srv, path, &size, &m_time); - c_time = a_time = m_time; + mode = aRONLY; + smbc_stat_printjob(srv, path, &size, &m_time); + c_time = a_time = m_time; - } - else { */ + } + else { */ - if (!cli_mkdir(&srv->cli, path)) { + if (!cli_mkdir(&srv->cli, path)) { - errno = smbc_errno(&srv->cli); - return -1; + errno = smbc_errno(&srv->cli); + return -1; - } + } - return 0; + return 0; } @@ -2055,8 +2102,8 @@ static int smbc_rmdir_dirempty = True; static void rmdir_list_fn(file_info *finfo, const char *mask, void *state) { - if (strncmp(finfo->name, ".", 1) != 0 && strncmp(finfo->name, "..", 2) != 0) - smbc_rmdir_dirempty = False; + if (strncmp(finfo->name, ".", 1) != 0 && strncmp(finfo->name, "..", 2) != 0) + smbc_rmdir_dirempty = False; } @@ -2066,97 +2113,97 @@ static void rmdir_list_fn(file_info *finfo, const char *mask, void *state) int smbc_rmdir(const char *fname) { - struct smbc_server *srv; - fstring server, share, user, password, workgroup; - pstring path; + struct smbc_server *srv; + fstring server, share, user, password, workgroup; + pstring path; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (!fname) { + if (!fname) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - DEBUG(4, ("smbc_rmdir(%s)\n", fname)); + DEBUG(4, ("smbc_rmdir(%s)\n", fname)); - smbc_parse_path(fname, server, share, path, user, password); /*FIXME, errors*/ + smbc_parse_path(fname, server, share, path, user, password); /*FIXME, errors*/ - if (user[0] == (char)0) pstrcpy(user, smbc_user); + if (user[0] == (char)0) pstrcpy(user, smbc_user); - pstrcpy(workgroup, lp_workgroup()); + pstrcpy(workgroup, lp_workgroup()); - srv = smbc_server(server, share, workgroup, user, password); + srv = smbc_server(server, share, workgroup, user, password); - if (!srv) { + if (!srv) { - return -1; /* errno set by smbc_server */ + return -1; /* errno set by smbc_server */ - } + } - /* if (strncmp(srv->cli.dev, "IPC", 3) == 0) { + /* if (strncmp(srv->cli.dev, "IPC", 3) == 0) { - mode = aDIR | aRONLY; + mode = aDIR | aRONLY; - } - else if (strncmp(srv->cli.dev, "LPT", 3) == 0) { + } + else if (strncmp(srv->cli.dev, "LPT", 3) == 0) { - if (strcmp(path, "\\") == 0) { + if (strcmp(path, "\\") == 0) { - mode = aDIR | aRONLY; + mode = aDIR | aRONLY; - } - else { + } + else { - mode = aRONLY; - smbc_stat_printjob(srv, path, &size, &m_time); - c_time = a_time = m_time; + mode = aRONLY; + smbc_stat_printjob(srv, path, &size, &m_time); + c_time = a_time = m_time; - } - else { */ + } + else { */ - if (!cli_rmdir(&srv->cli, path)) { + if (!cli_rmdir(&srv->cli, path)) { - errno = smbc_errno(&srv->cli); + errno = smbc_errno(&srv->cli); - if (errno == EACCES) { /* Check if the dir empty or not */ + if (errno == EACCES) { /* Check if the dir empty or not */ - pstring lpath; /* Local storage to avoid buffer overflows */ + pstring lpath; /* Local storage to avoid buffer overflows */ - smbc_rmdir_dirempty = True; /* Make this so ... */ + smbc_rmdir_dirempty = True; /* Make this so ... */ - pstrcpy(lpath, path); - pstrcat(lpath, "\\*"); + pstrcpy(lpath, path); + pstrcat(lpath, "\\*"); - if (cli_list(&srv->cli, lpath, aDIR | aSYSTEM | aHIDDEN, rmdir_list_fn, - NULL) < 0) { + if (cli_list(&srv->cli, lpath, aDIR | aSYSTEM | aHIDDEN, rmdir_list_fn, + NULL) < 0) { - /* Fix errno to ignore latest error ... */ + /* Fix errno to ignore latest error ... */ - DEBUG(5, ("smbc_rmdir: cli_list returned an error: %d\n", - smbc_errno(&srv->cli))); - errno = EACCES; + DEBUG(5, ("smbc_rmdir: cli_list returned an error: %d\n", + smbc_errno(&srv->cli))); + errno = EACCES; - } + } - if (smbc_rmdir_dirempty) - errno = EACCES; - else - errno = ENOTEMPTY; + if (smbc_rmdir_dirempty) + errno = EACCES; + else + errno = ENOTEMPTY; - } + } - return -1; + return -1; - } + } - return 0; + return 0; } @@ -2166,39 +2213,39 @@ int smbc_rmdir(const char *fname) off_t smbc_telldir(int fd) { - struct smbc_file *fe; + struct smbc_file *fe; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (fd < smbc_start_fd || fd >= (smbc_start_fd + smbc_max_fd)) { + if (fd < smbc_start_fd || fd >= (smbc_start_fd + SMBC_MAX_FD)) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - fe = smbc_file_table[fd - smbc_start_fd]; + fe = smbc_file_table[fd - smbc_start_fd]; - if (!fe) { + if (!fe) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - if (fe->file != False) { /* FIXME, should be dir, perhaps */ + if (fe->file != False) { /* FIXME, should be dir, perhaps */ - errno = ENOTDIR; - return -1; + errno = ENOTDIR; + return -1; - } + } - return (off_t) fe->dir_next; + return (off_t) fe->dir_next; } @@ -2210,24 +2257,24 @@ struct smbc_dir_list *smbc_check_dir_ent(struct smbc_dir_list *list, struct smbc_dirent *dirent) { - /* Run down the list looking for what we want */ + /* Run down the list looking for what we want */ - if (dirent) { + if (dirent) { - struct smbc_dir_list *tmp = list; + struct smbc_dir_list *tmp = list; - while (tmp) { + while (tmp) { - if (tmp->dirent == dirent) - return tmp; + if (tmp->dirent == dirent) + return tmp; - tmp = tmp->next; + tmp = tmp->next; - } + } - } + } - return NULL; /* Not found, or an error */ + return NULL; /* Not found, or an error */ } @@ -2238,62 +2285,62 @@ struct smbc_dir_list *smbc_check_dir_ent(struct smbc_dir_list *list, int smbc_lseekdir(int fd, off_t offset) { - struct smbc_file *fe; - struct smbc_dirent *dirent = (struct smbc_dirent *)offset; - struct smbc_dir_list *list_ent = NULL; + struct smbc_file *fe; + struct smbc_dirent *dirent = (struct smbc_dirent *)offset; + struct smbc_dir_list *list_ent = NULL; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (fd < smbc_start_fd || fd >= (smbc_start_fd + smbc_max_fd)) { + if (fd < smbc_start_fd || fd >= (smbc_start_fd + SMBC_MAX_FD)) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - fe = smbc_file_table[fd - smbc_start_fd]; + fe = smbc_file_table[fd - smbc_start_fd]; - if (!fe) { + if (!fe) { - errno = EBADF; - return -1; + errno = EBADF; + return -1; - } + } - if (fe->file != False) { /* FIXME, should be dir, perhaps */ + if (fe->file != False) { /* FIXME, should be dir, perhaps */ - errno = ENOTDIR; - return -1; + errno = ENOTDIR; + return -1; - } + } - /* Now, check what we were passed and see if it is OK ... */ + /* Now, check what we were passed and see if it is OK ... */ - if (dirent == NULL) { /* Seek to the begining of the list */ + if (dirent == NULL) { /* Seek to the begining of the list */ - fe->dir_next = fe->dir_list; - return 0; + fe->dir_next = fe->dir_list; + return 0; - } + } - /* Now, run down the list and make sure that the entry is OK */ - /* This may need to be changed if we change the format of the list */ + /* Now, run down the list and make sure that the entry is OK */ + /* This may need to be changed if we change the format of the list */ - if ((list_ent = smbc_check_dir_ent(fe->dir_list, dirent)) == NULL) { + if ((list_ent = smbc_check_dir_ent(fe->dir_list, dirent)) == NULL) { - errno = EINVAL; /* Bad entry */ - return -1; + errno = EINVAL; /* Bad entry */ + return -1; - } + } - fe->dir_next = list_ent; + fe->dir_next = list_ent; - return 0; + return 0; } @@ -2304,16 +2351,16 @@ int smbc_lseekdir(int fd, off_t offset) int smbc_fstatdir(int fd, struct stat *st) { - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - /* No code yet ... */ + /* No code yet ... */ - return 0; + return 0; } @@ -2326,71 +2373,71 @@ int smbc_fstatdir(int fd, struct stat *st) int smbc_print_file(const char *fname, const char *printq) { - int fid1, fid2, bytes, saverr, tot_bytes = 0; - char buf[4096]; + int fid1, fid2, bytes, saverr, tot_bytes = 0; + char buf[4096]; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (!fname && !printq) { + if (!fname && !printq) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - /* Try to open the file for reading ... */ + /* Try to open the file for reading ... */ - if ((fid1 = smbc_open(fname, O_RDONLY, 0666)) < 0) { + if ((fid1 = smbc_open(fname, O_RDONLY, 0666)) < 0) { - fprintf(stderr, "Error, fname=%s, errno=%i\n", fname, errno); - return -1; /* smbc_open sets errno */ + DEBUG(3, ("Error, fname=%s, errno=%i\n", fname, errno)); + return -1; /* smbc_open sets errno */ - } + } - /* Now, try to open the printer file for writing */ + /* Now, try to open the printer file for writing */ - if ((fid2 = smbc_open_print_job(printq)) < 0) { + if ((fid2 = smbc_open_print_job(printq)) < 0) { - saverr = errno; /* Save errno */ - smbc_close(fid1); - errno = saverr; - return -1; + saverr = errno; /* Save errno */ + smbc_close(fid1); + errno = saverr; + return -1; - } + } - while ((bytes = smbc_read(fid1, buf, sizeof(buf))) > 0) { + while ((bytes = smbc_read(fid1, buf, sizeof(buf))) > 0) { - tot_bytes += bytes; + tot_bytes += bytes; - if ((smbc_write(fid2, buf, bytes)) < 0) { + if ((smbc_write(fid2, buf, bytes)) < 0) { - saverr = errno; - smbc_close(fid1); - smbc_close(fid2); - errno = saverr; + saverr = errno; + smbc_close(fid1); + smbc_close(fid2); + errno = saverr; - } + } - } + } - saverr = errno; + saverr = errno; - smbc_close(fid1); /* We have to close these anyway */ - smbc_close(fid2); + smbc_close(fid1); /* We have to close these anyway */ + smbc_close(fid2); - if (bytes < 0) { + if (bytes < 0) { - errno = saverr; - return -1; + errno = saverr; + return -1; - } + } - return tot_bytes; + return tot_bytes; } @@ -2400,30 +2447,30 @@ int smbc_print_file(const char *fname, const char *printq) int smbc_open_print_job(const char *fname) { - fstring server, share, user, password; - pstring path; + fstring server, share, user, password; + pstring path; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (!fname) { + if (!fname) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - DEBUG(4, ("smbc_open_print_job(%s)\n", fname)); + DEBUG(4, ("smbc_open_print_job(%s)\n", fname)); - smbc_parse_path(fname, server, share, path, user, password); /*FIXME, errors*/ + smbc_parse_path(fname, server, share, path, user, password); /*FIXME, errors*/ - /* What if the path is empty, or the file exists? */ + /* What if the path is empty, or the file exists? */ - return smbc_open(fname, O_WRONLY, 666); + return smbc_open(fname, O_WRONLY, 666); } @@ -2433,48 +2480,48 @@ int smbc_open_print_job(const char *fname) int smbc_list_print_jobs(const char *fname, void (*fn)(struct print_job_info *)) { - struct smbc_server *srv; - fstring server, share, user, password, workgroup; - pstring path; + struct smbc_server *srv; + fstring server, share, user, password, workgroup; + pstring path; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (!fname) { + if (!fname) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - DEBUG(4, ("smbc_list_print_jobs(%s)\n", fname)); + DEBUG(4, ("smbc_list_print_jobs(%s)\n", fname)); - smbc_parse_path(fname, server, share, path, user, password); /*FIXME, errors*/ + smbc_parse_path(fname, server, share, path, user, password); /*FIXME, errors*/ - if (user[0] == (char)0) pstrcpy(user, smbc_user); + if (user[0] == (char)0) pstrcpy(user, smbc_user); - pstrcpy(workgroup, lp_workgroup()); + pstrcpy(workgroup, lp_workgroup()); - srv = smbc_server(server, share, workgroup, user, password); + srv = smbc_server(server, share, workgroup, user, password); - if (!srv) { + if (!srv) { - return -1; /* errno set by smbc_server */ + return -1; /* errno set by smbc_server */ - } + } - if (cli_print_queue(&srv->cli, fn) < 0) { + if (cli_print_queue(&srv->cli, fn) < 0) { - errno = smbc_errno(&srv->cli); - return -1; + errno = smbc_errno(&srv->cli); + return -1; - } + } - return 0; + return 0; } @@ -2484,53 +2531,53 @@ int smbc_list_print_jobs(const char *fname, void (*fn)(struct print_job_info *)) int smbc_unlink_print_job(const char *fname, int id) { - struct smbc_server *srv; - fstring server, share, user, password, workgroup; - pstring path; - int err; + struct smbc_server *srv; + fstring server, share, user, password, workgroup; + pstring path; + int err; - if (!smbc_initialized) { + if (!smbc_initialized) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - if (!fname) { + if (!fname) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; - } + } - DEBUG(4, ("smbc_unlink_print_job(%s)\n", fname)); + DEBUG(4, ("smbc_unlink_print_job(%s)\n", fname)); - smbc_parse_path(fname, server, share, path, user, password); /*FIXME, errors*/ + smbc_parse_path(fname, server, share, path, user, password); /*FIXME, errors*/ - if (user[0] == (char)0) pstrcpy(user, smbc_user); + if (user[0] == (char)0) pstrcpy(user, smbc_user); - pstrcpy(workgroup, lp_workgroup()); + pstrcpy(workgroup, lp_workgroup()); - srv = smbc_server(server, share, workgroup, user, password); + srv = smbc_server(server, share, workgroup, user, password); - if (!srv) { + if (!srv) { - return -1; /* errno set by smbc_server */ + return -1; /* errno set by smbc_server */ - } + } - if ((err = cli_printjob_del(&srv->cli, id)) != 0) { + if ((err = cli_printjob_del(&srv->cli, id)) != 0) { - if (err < 0) - errno = smbc_errno(&srv->cli); - else if (err == ERRnosuchprintjob) - errno = EINVAL; - return -1; + if (err < 0) + errno = smbc_errno(&srv->cli); + else if (err == ERRnosuchprintjob) + errno = EINVAL; + return -1; - } + } - return 0; + return 0; } |