diff options
Diffstat (limited to 'mount.cifs.c')
-rw-r--r-- | mount.cifs.c | 618 |
1 files changed, 336 insertions, 282 deletions
diff --git a/mount.cifs.c b/mount.cifs.c index b960de3..903518b 100644 --- a/mount.cifs.c +++ b/mount.cifs.c @@ -1,20 +1,21 @@ -/* - Mount helper utility for Linux CIFS VFS (virtual filesystem) client - Copyright (C) 2003,2008 Steve French (sfrench@us.ibm.com) - Copyright (C) 2008 Jeremy Allison (jra@samba.org) - - 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 3 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/* + * Mount helper utility for Linux CIFS VFS (virtual filesystem) client + * Copyright (C) 2003,2008 Steve French (sfrench@us.ibm.com) + * Copyright (C) 2008 Jeremy Allison (jra@samba.org) + * + * 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 3 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -80,7 +81,7 @@ #define MAX_ADDR_LIST_LEN ((MAX_ADDRESS_LEN + 1) * 16) #ifndef SAFE_FREE -#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0) +#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x = NULL; } } while (0) #endif #define MOUNT_PASSWD_SIZE 128 @@ -111,41 +112,39 @@ /* struct for holding parsed mount info for use by privleged process */ struct parsed_mount_info { - unsigned long flags; - char host[NI_MAXHOST + 1]; - char share[MAX_SHARE_LEN + 1]; - char prefix[PATH_MAX + 1]; - char options[MAX_OPTIONS_LEN]; - char domain[DOMAIN_SIZE + 1]; - char username[MAX_USERNAME_SIZE + 1]; - char password[MOUNT_PASSWD_SIZE + 1]; - char addrlist[MAX_ADDR_LIST_LEN]; - unsigned int got_user:1; - unsigned int got_password:1; + unsigned long flags; + char host[NI_MAXHOST + 1]; + char share[MAX_SHARE_LEN + 1]; + char prefix[PATH_MAX + 1]; + char options[MAX_OPTIONS_LEN]; + char domain[DOMAIN_SIZE + 1]; + char username[MAX_USERNAME_SIZE + 1]; + char password[MOUNT_PASSWD_SIZE + 1]; + char addrlist[MAX_ADDR_LIST_LEN]; + unsigned int got_user:1; + unsigned int got_password:1; }; const char *thisprogram; -int verboseflag = 0; +int verboseflag; const char *cifs_fstype = "cifs"; static int parse_unc(char *unc_name, struct parsed_mount_info *parsed_info); #if CIFS_DISABLE_SETUID_CHECK -static int -check_setuid(void) +static int check_setuid(void) { return 0; } #else /* CIFS_DISABLE_SETUID_CHECK */ -static int -check_setuid(void) +static int check_setuid(void) { if (getuid() && !geteuid()) { printf("This mount.cifs program has been built with the " - "ability to run as a setuid root program disabled.\n" - "mount.cifs has not been well audited for security " - "holes. Therefore the Samba team does not recommend " - "installing it as a setuid root program.\n"); + "ability to run as a setuid root program disabled.\n" + "mount.cifs has not been well audited for security " + "holes. Therefore the Samba team does not recommend " + "installing it as a setuid root program.\n"); return 1; } @@ -163,12 +162,11 @@ check_fstab(const char *progname, char *mountpoint, char *devname, /* make sure this mount is listed in /etc/fstab */ fstab = setmntent(_PATH_FSTAB, "r"); if (!fstab) { - fprintf(stderr, "Couldn't open %s for reading!\n", - _PATH_FSTAB); + fprintf(stderr, "Couldn't open %s for reading!\n", _PATH_FSTAB); return EX_FILEIO; } - while((mnt = getmntent(fstab))) { + while ((mnt = getmntent(fstab))) { if (!strcmp(mountpoint, mnt->mnt_dir)) break; } @@ -176,8 +174,7 @@ check_fstab(const char *progname, char *mountpoint, char *devname, if (mnt == NULL || strcmp(mnt->mnt_fsname, devname)) { fprintf(stderr, "%s: permission denied: no match for " - "%s found in %s\n", progname, mountpoint, - _PATH_FSTAB); + "%s found in %s\n", progname, mountpoint, _PATH_FSTAB); return EX_USAGE; } @@ -194,36 +191,47 @@ check_fstab(const char *progname, char *mountpoint, char *devname, /* BB finish BB - cifs_umount - open nofollow - avoid symlink exposure? - get owner of dir see if matches self or if root - call system(umount argv) etc. - + cifs_umount + open nofollow - avoid symlink exposure? + get owner of dir see if matches self or if root + call system(umount argv) etc. + BB end finish BB */ -static int -mount_cifs_usage(FILE *stream) +static int mount_cifs_usage(FILE * stream) { - fprintf(stream, "\nUsage: %s <remotetarget> <dir> -o <options>\n", thisprogram); + fprintf(stream, "\nUsage: %s <remotetarget> <dir> -o <options>\n", + thisprogram); fprintf(stream, "\nMount the remote target, specified as a UNC name,"); fprintf(stream, " to a local directory.\n\nOptions:\n"); fprintf(stream, "\tuser=<arg>\n\tpass=<arg>\n\tdom=<arg>\n"); fprintf(stream, "\nLess commonly used options:"); - fprintf(stream, "\n\tcredentials=<filename>,guest,perm,noperm,setuids,nosetuids,rw,ro,"); - fprintf(stream, "\n\tsep=<char>,iocharset=<codepage>,suid,nosuid,exec,noexec,serverino,"); - fprintf(stream, "\n\tmapchars,nomapchars,nolock,servernetbiosname=<SRV_RFC1001NAME>"); - fprintf(stream, "\n\tdirectio,nounix,cifsacl,sec=<authentication mechanism>,sign"); - fprintf(stream, "\n\nOptions not needed for servers supporting CIFS Unix extensions"); - fprintf(stream, "\n\t(e.g. unneeded for mounts to most Samba versions):"); - fprintf(stream, "\n\tuid=<uid>,gid=<gid>,dir_mode=<mode>,file_mode=<mode>,sfu"); + fprintf(stream, + "\n\tcredentials=<filename>,guest,perm,noperm,setuids,nosetuids,rw,ro,"); + fprintf(stream, + "\n\tsep=<char>,iocharset=<codepage>,suid,nosuid,exec,noexec,serverino,"); + fprintf(stream, + "\n\tmapchars,nomapchars,nolock,servernetbiosname=<SRV_RFC1001NAME>"); + fprintf(stream, + "\n\tdirectio,nounix,cifsacl,sec=<authentication mechanism>,sign"); + fprintf(stream, + "\n\nOptions not needed for servers supporting CIFS Unix extensions"); + fprintf(stream, + "\n\t(e.g. unneeded for mounts to most Samba versions):"); + fprintf(stream, + "\n\tuid=<uid>,gid=<gid>,dir_mode=<mode>,file_mode=<mode>,sfu"); fprintf(stream, "\n\nRarely used options:"); - fprintf(stream, "\n\tport=<tcpport>,rsize=<size>,wsize=<size>,unc=<unc_name>,ip=<ip_address>,"); - fprintf(stream, "\n\tdev,nodev,nouser_xattr,netbiosname=<OUR_RFC1001NAME>,hard,soft,intr,"); - fprintf(stream, "\n\tnointr,ignorecase,noposixpaths,noacl,prefixpath=<path>,nobrl"); - fprintf(stream, "\n\nOptions are described in more detail in the manual page"); + fprintf(stream, + "\n\tport=<tcpport>,rsize=<size>,wsize=<size>,unc=<unc_name>,ip=<ip_address>,"); + fprintf(stream, + "\n\tdev,nodev,nouser_xattr,netbiosname=<OUR_RFC1001NAME>,hard,soft,intr,"); + fprintf(stream, + "\n\tnointr,ignorecase,noposixpaths,noacl,prefixpath=<path>,nobrl"); + fprintf(stream, + "\n\nOptions are described in more detail in the manual page"); fprintf(stream, "\n\tman 8 mount.cifs\n"); fprintf(stream, "\nTo display the version number of the mount helper:"); - fprintf(stream, "\n\t%s -V\n",thisprogram); + fprintf(stream, "\n\t%s -V\n", thisprogram); if (stream == stderr) return EX_USAGE; @@ -235,8 +243,7 @@ mount_cifs_usage(FILE *stream) * end up getting confused for option delimiters. Copy password into pw * field, turning any commas into double commas. */ -static int -set_password(struct parsed_mount_info *parsed_info, const char *src) +static int set_password(struct parsed_mount_info *parsed_info, const char *src) { char *dst = parsed_info->password; unsigned int i = 0, j = 0; @@ -256,7 +263,8 @@ set_password(struct parsed_mount_info *parsed_info, const char *src) } /* caller frees username if necessary */ -static char * getusername(void) { +static char *getusername(void) +{ char *username = NULL; struct passwd *password = getpwuid(getuid()); @@ -273,8 +281,7 @@ static char * getusername(void) { * ...obviously the only required component is "username". The source string * is modified in the process, but it should remain unchanged at the end. */ -static int -parse_username(char *rawuser, struct parsed_mount_info *parsed_info) +static int parse_username(char *rawuser, struct parsed_mount_info *parsed_info) { char *user, *password, slash; int rc = 0; @@ -297,7 +304,7 @@ parse_username(char *rawuser, struct parsed_mount_info *parsed_info) slash = *user; *user = '\0'; strlcpy(parsed_info->domain, rawuser, - sizeof(parsed_info->domain)); + sizeof(parsed_info->domain)); *(user++) = slash; } else { user = rawuser; @@ -311,32 +318,33 @@ parse_username(char *rawuser, struct parsed_mount_info *parsed_info) return 0; } -static int open_cred_file(char *file_name, struct parsed_mount_info *parsed_info) +static int open_cred_file(char *file_name, + struct parsed_mount_info *parsed_info) { - char * line_buf; - char * temp_val, *newline; - FILE * fs; + char *line_buf; + char *temp_val, *newline; + FILE *fs; int i, length; i = access(file_name, R_OK); if (i) return i; - fs = fopen(file_name,"r"); - if(fs == NULL) + fs = fopen(file_name, "r"); + if (fs == NULL) return errno; line_buf = (char *)malloc(4096); - if(line_buf == NULL) { + if (line_buf == NULL) { fclose(fs); return EX_SYSERR; } - while(fgets(line_buf,4096,fs)) { + while (fgets(line_buf, 4096, fs)) { /* parse line from credential file */ /* eat leading white space */ - for(i=0;i<4086;i++) { - if((line_buf[i] != ' ') && (line_buf[i] != '\t')) + for (i = 0; i < 4086; i++) { + if ((line_buf[i] != ' ') && (line_buf[i] != '\t')) break; /* if whitespace - skip past it */ } @@ -346,59 +354,64 @@ static int open_cred_file(char *file_name, struct parsed_mount_info *parsed_info if (newline) *newline = '\0'; - if (strncasecmp("username",line_buf+i,8) == 0) { - temp_val = strchr(line_buf + i,'='); - if(temp_val) { + if (strncasecmp("username", line_buf + i, 8) == 0) { + temp_val = strchr(line_buf + i, '='); + if (temp_val) { /* go past equals sign */ temp_val++; - for(length = 0;length<4087;length++) { + for (length = 0; length < 4087; length++) { if ((temp_val[length] == '\n') || (temp_val[length] == '\0')) { temp_val[length] = '\0'; break; } } - if(length > 4086) { - fprintf(stderr, "mount.cifs failed due to malformed username in credentials file\n"); - memset(line_buf,0,4096); + if (length > 4086) { + fprintf(stderr, + "mount.cifs failed due to malformed username in credentials file\n"); + memset(line_buf, 0, 4096); return EX_USAGE; } parsed_info->got_user = 1; strlcpy(parsed_info->username, temp_val, - sizeof(parsed_info->username)); + sizeof(parsed_info->username)); } - } else if (strncasecmp("password",line_buf+i,8) == 0) { - temp_val = strchr(line_buf+i, '='); + } else if (strncasecmp("password", line_buf + i, 8) == 0) { + temp_val = strchr(line_buf + i, '='); if (!temp_val) continue; ++temp_val; i = set_password(parsed_info, temp_val); if (i) return i; - } else if (strncasecmp("domain",line_buf+i,6) == 0) { - temp_val = strchr(line_buf+i,'='); - if(temp_val) { - /* go past equals sign */ - temp_val++; - if(verboseflag) - fprintf(stderr, "\nDomain %s\n",temp_val); - - for(length = 0;length<DOMAIN_SIZE+1;length++) { + } else if (strncasecmp("domain", line_buf + i, 6) == 0) { + temp_val = strchr(line_buf + i, '='); + if (temp_val) { + /* go past equals sign */ + temp_val++; + if (verboseflag) + fprintf(stderr, "\nDomain %s\n", + temp_val); + + for (length = 0; length < DOMAIN_SIZE + 1; + length++) { if ((temp_val[length] == '\n') || (temp_val[length] == '\0')) { temp_val[length] = '\0'; break; } - } + } - if(length > DOMAIN_SIZE) { - fprintf(stderr, "mount.cifs failed: domain in credentials file too long\n"); - return EX_USAGE; - } + if (length > DOMAIN_SIZE) { + fprintf(stderr, + "mount.cifs failed: domain in credentials file too long\n"); + return EX_USAGE; + } - strlcpy(parsed_info->domain, temp_val, sizeof(parsed_info->domain)); - } - } + strlcpy(parsed_info->domain, temp_val, + sizeof(parsed_info->domain)); + } + } } fclose(fs); @@ -407,22 +420,25 @@ static int open_cred_file(char *file_name, struct parsed_mount_info *parsed_info } static int -get_password_from_file(int file_descript, char *filename, struct parsed_mount_info *parsed_info) +get_password_from_file(int file_descript, char *filename, + struct parsed_mount_info *parsed_info) { int rc = 0; char buf[sizeof(parsed_info->password) + 1]; - if(filename != NULL) { + if (filename != NULL) { rc = access(filename, R_OK); if (rc) { - fprintf(stderr, "mount.cifs failed: access check of %s failed: %s\n", - filename, strerror(errno)); + fprintf(stderr, + "mount.cifs failed: access check of %s failed: %s\n", + filename, strerror(errno)); return EX_SYSERR; } file_descript = open(filename, O_RDONLY); - if(file_descript < 0) { - fprintf(stderr, "mount.cifs failed. %s attempting to open password file %s\n", - strerror(errno),filename); + if (file_descript < 0) { + fprintf(stderr, + "mount.cifs failed. %s attempting to open password file %s\n", + strerror(errno), filename); return EX_SYSERR; } } @@ -430,7 +446,9 @@ get_password_from_file(int file_descript, char *filename, struct parsed_mount_in memset(buf, 0, sizeof(buf)); rc = read(file_descript, buf, sizeof(buf) - 1); if (rc < 0) { - fprintf(stderr, "mount.cifs failed. Error %s reading password file\n",strerror(errno)); + fprintf(stderr, + "mount.cifs failed. Error %s reading password file\n", + strerror(errno)); rc = EX_SYSERR; goto get_pw_exit; } @@ -438,7 +456,7 @@ get_password_from_file(int file_descript, char *filename, struct parsed_mount_in rc = set_password(parsed_info, buf); get_pw_exit: - if(filename != NULL) { + if (filename != NULL) { close(file_descript); } return rc; @@ -464,9 +482,9 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info) /* BB fixme check for separator override BB */ if (getuid()) { got_uid = 1; - snprintf(user,sizeof(user),"%u",getuid()); + snprintf(user, sizeof(user), "%u", getuid()); got_gid = 1; - snprintf(group,sizeof(group),"%u",getgid()); + snprintf(group, sizeof(group), "%u", getgid()); } if (!data) @@ -478,10 +496,10 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info) * value = next value ie stuff after equal sign */ while (data && *data) { - next_keyword = strchr(data,','); /* BB handle sep= */ - + next_keyword = strchr(data, ','); /* BB handle sep= */ + /* temporarily null terminate end of keyword=value pair */ - if(next_keyword) + if (next_keyword) *next_keyword++ = 0; /* temporarily null terminate keyword if there's a value */ @@ -492,20 +510,21 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info) } /* FIXME: turn into a token parser? */ - if (strncmp(data, "users",5) == 0) { - if(!value || !*value) { + if (strncmp(data, "users", 5) == 0) { + if (!value || !*value) { *filesys_flags |= MS_USERS; goto nocopy; } - } else if (strncmp(data, "user_xattr",10) == 0) { - /* do nothing - need to skip so not parsed as user name */ + } else if (strncmp(data, "user_xattr", 10) == 0) { + /* do nothing - need to skip so not parsed as user name */ } else if (strncmp(data, "user", 4) == 0) { if (!value || !*value) { - if(data[4] == '\0') { + if (data[4] == '\0') { *filesys_flags |= MS_USER; goto nocopy; } else { - fprintf(stderr, "username specified with no parameter\n"); + fprintf(stderr, + "username specified with no parameter\n"); return EX_USAGE; } } else { @@ -515,14 +534,16 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info) } rc = parse_username(value, parsed_info); if (rc) { - fprintf(stderr, "problem parsing username\n"); + fprintf(stderr, + "problem parsing username\n"); return rc; } goto nocopy; } } else if (strncmp(data, "pass", 4) == 0) { if (parsed_info->got_password) { - fprintf(stderr, "password specified twice, ignoring second\n"); + fprintf(stderr, + "password specified twice, ignoring second\n"); goto nocopy; } if (!value || !*value) { @@ -541,25 +562,30 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info) } } else if (strncmp(data, "ip", 2) == 0) { if (!value || !*value) { - fprintf(stderr, "target ip address argument missing"); - } else if (strnlen(value, MAX_ADDRESS_LEN) <= MAX_ADDRESS_LEN) { - if(verboseflag) - fprintf(stderr, "ip address %s override specified\n",value); + fprintf(stderr, + "target ip address argument missing"); + } else if (strnlen(value, MAX_ADDRESS_LEN) <= + MAX_ADDRESS_LEN) { + if (verboseflag) + fprintf(stderr, + "ip address %s override specified\n", + value); } else { fprintf(stderr, "ip address too long\n"); return EX_USAGE; } } else if ((strncmp(data, "unc", 3) == 0) - || (strncmp(data, "target", 6) == 0) - || (strncmp(data, "path", 4) == 0)) { + || (strncmp(data, "target", 6) == 0) + || (strncmp(data, "path", 4) == 0)) { if (!value || !*value) { - fprintf(stderr, "invalid path to network resource\n"); - return EX_USAGE; /* needs_arg; */ + fprintf(stderr, + "invalid path to network resource\n"); + return EX_USAGE; /* needs_arg; */ } rc = parse_unc(value, parsed_info); if (rc) return rc; - } else if ((strncmp(data, "dom" /* domain */, 3) == 0) + } else if ((strncmp(data, "dom" /* domain */ , 3) == 0) || (strncmp(data, "workg", 5) == 0)) { /* note this allows for synonyms of "domain" such as "DOM" and "dom" and "workgroup" @@ -568,22 +594,26 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info) fprintf(stderr, "CIFS: invalid domain name\n"); return EX_USAGE; } - if (strnlen(value, sizeof(parsed_info->domain)) >= sizeof(parsed_info->domain)) { + if (strnlen(value, sizeof(parsed_info->domain)) >= + sizeof(parsed_info->domain)) { fprintf(stderr, "domain name too long\n"); return EX_USAGE; } - strlcpy(parsed_info->domain, value, sizeof(parsed_info->domain)); + strlcpy(parsed_info->domain, value, + sizeof(parsed_info->domain)); goto nocopy; } else if (strncmp(data, "cred", 4) == 0) { if (value && *value) { rc = open_cred_file(value, parsed_info); if (rc) { - fprintf(stderr, "error %d (%s) opening credential file %s\n", + fprintf(stderr, + "error %d (%s) opening credential file %s\n", rc, strerror(rc), value); return rc; } } else { - fprintf(stderr, "invalid credential file name specified\n"); + fprintf(stderr, + "invalid credential file name specified\n"); return EX_USAGE; } } else if (strncmp(data, "uid", 3) == 0) { @@ -593,12 +623,15 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info) struct passwd *pw; if (!(pw = getpwnam(value))) { - fprintf(stderr, "bad user name \"%s\"\n", value); + fprintf(stderr, + "bad user name \"%s\"\n", + value); return EX_USAGE; } - snprintf(user, sizeof(user), "%u", pw->pw_uid); + snprintf(user, sizeof(user), "%u", + pw->pw_uid); } else { - strlcpy(user,value,sizeof(user)); + strlcpy(user, value, sizeof(user)); } } goto nocopy; @@ -609,57 +642,72 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info) struct group *gr; if (!(gr = getgrnam(value))) { - fprintf(stderr, "bad group name \"%s\"\n", value); + fprintf(stderr, + "bad group name \"%s\"\n", + value); return EX_USAGE; } - snprintf(group, sizeof(group), "%u", gr->gr_gid); + snprintf(group, sizeof(group), "%u", + gr->gr_gid); } else { - strlcpy(group,value,sizeof(group)); + strlcpy(group, value, sizeof(group)); } } goto nocopy; - /* fmask and dmask synonyms for people used to smbfs syntax */ - } else if (strcmp(data, "file_mode") == 0 || strcmp(data, "fmask")==0) { + /* fmask and dmask synonyms for people used to smbfs syntax */ + } else if (strcmp(data, "file_mode") == 0 + || strcmp(data, "fmask") == 0) { if (!value || !*value) { - fprintf(stderr, "Option '%s' requires a numerical argument\n", data); + fprintf(stderr, + "Option '%s' requires a numerical argument\n", + data); return EX_USAGE; } if (value[0] != '0') { - fprintf(stderr, "WARNING: '%s' not expressed in octal.\n", data); + fprintf(stderr, + "WARNING: '%s' not expressed in octal.\n", + data); } - if (strcmp (data, "fmask") == 0) { - fprintf(stderr, "WARNING: CIFS mount option 'fmask' is deprecated. Use 'file_mode' instead.\n"); - data = "file_mode"; /* BB fix this */ + if (strcmp(data, "fmask") == 0) { + fprintf(stderr, + "WARNING: CIFS mount option 'fmask' is deprecated. Use 'file_mode' instead.\n"); + data = "file_mode"; /* BB fix this */ } - } else if (strcmp(data, "dir_mode") == 0 || strcmp(data, "dmask")==0) { + } else if (strcmp(data, "dir_mode") == 0 + || strcmp(data, "dmask") == 0) { if (!value || !*value) { - fprintf(stderr, "Option '%s' requires a numerical argument\n", data); + fprintf(stderr, + "Option '%s' requires a numerical argument\n", + data); return EX_USAGE; } if (value[0] != '0') { - fprintf(stderr, "WARNING: '%s' not expressed in octal.\n", data); + fprintf(stderr, + "WARNING: '%s' not expressed in octal.\n", + data); } - if (strcmp (data, "dmask") == 0) { - fprintf(stderr, "WARNING: CIFS mount option 'dmask' is deprecated. Use 'dir_mode' instead.\n"); + if (strcmp(data, "dmask") == 0) { + fprintf(stderr, + "WARNING: CIFS mount option 'dmask' is deprecated. Use 'dir_mode' instead.\n"); data = "dir_mode"; } /* the following eight mount options should be - stripped out from what is passed into the kernel - since these eight options are best passed as the - mount flags rather than redundantly to the kernel - and could generate spurious warnings depending on the - level of the corresponding cifs vfs kernel code */ + stripped out from what is passed into the kernel + since these eight options are best passed as the + mount flags rather than redundantly to the kernel + and could generate spurious warnings depending on the + level of the corresponding cifs vfs kernel code */ } else if (strncmp(data, "nosuid", 6) == 0) { *filesys_flags |= MS_NOSUID; } else if (strncmp(data, "suid", 4) == 0) { *filesys_flags &= ~MS_NOSUID; } else if (strncmp(data, "nodev", 5) == 0) { *filesys_flags |= MS_NODEV; - } else if ((strncmp(data, "nobrl", 5) == 0) || + } else if ((strncmp(data, "nobrl", 5) == 0) || (strncmp(data, "nolock", 6) == 0)) { *filesys_flags &= ~MS_MANDLOCK; } else if (strncmp(data, "dev", 3) == 0) { @@ -677,8 +725,8 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info) } else if (strncmp(data, "rw", 2) == 0) { *filesys_flags &= ~MS_RDONLY; goto nocopy; - } else if (strncmp(data, "remount", 7) == 0) { - *filesys_flags |= MS_REMOUNT; + } else if (strncmp(data, "remount", 7) == 0) { + *filesys_flags |= MS_REMOUNT; } /* check size before copying option to buffer */ @@ -741,13 +789,11 @@ nocopy: return 0; } - /* * resolve "host" portion of parsed info to comma-separated list of * address(es) */ -static int -resolve_host(struct parsed_mount_info *parsed_info) +static int resolve_host(struct parsed_mount_info *parsed_info) { int rc; /* 10 for max width of decimal scopeid */ @@ -761,9 +807,8 @@ resolve_host(struct parsed_mount_info *parsed_info) rc = getaddrinfo(parsed_info->host, NULL, NULL, &addrlist); if (rc != 0) { fprintf(stderr, "mount error: could not resolve address for " - "%s: %s\n", parsed_info->host, - rc == EAI_SYSTEM ? strerror(errno) : - gai_strerror(rc)); + "%s: %s\n", parsed_info->host, + rc == EAI_SYSTEM ? strerror(errno) : gai_strerror(rc)); /* FIXME: return better error based on rc? */ return EX_USAGE; } @@ -779,12 +824,13 @@ resolve_host(struct parsed_mount_info *parsed_info) switch (addr->ai_addr->sa_family) { case AF_INET6: - sin6 = (struct sockaddr_in6 *) addr->ai_addr; + sin6 = (struct sockaddr_in6 *)addr->ai_addr; ipaddr = inet_ntop(AF_INET6, &sin6->sin6_addr, tmpbuf, sizeof(tmpbuf)); if (!ipaddr) { rc = EX_SYSERR; - fprintf(stderr, "mount error: problem parsing address " + fprintf(stderr, + "mount error: problem parsing address " "list: %s\n", strerror(errno)); goto resolve_host_out; } @@ -792,17 +838,18 @@ resolve_host(struct parsed_mount_info *parsed_info) if (sin6->sin6_scope_id) { len = strnlen(tmpbuf, sizeof(tmpbuf)); ipaddr = tmpbuf + len; - snprintf(tmpbuf, sizeof(tmpbuf) - len, "%%%u", - sin6->sin6_scope_id); + snprintf(tmpbuf, sizeof(tmpbuf) - len, "%%%u", + sin6->sin6_scope_id); } break; case AF_INET: - sin = (struct sockaddr_in *) addr->ai_addr; + sin = (struct sockaddr_in *)addr->ai_addr; ipaddr = inet_ntop(AF_INET, &sin->sin_addr, tmpbuf, sizeof(tmpbuf)); if (!ipaddr) { rc = EX_SYSERR; - fprintf(stderr, "mount error: problem parsing address " + fprintf(stderr, + "mount error: problem parsing address " "list: %s\n", strerror(errno)); goto resolve_host_out; } @@ -817,7 +864,7 @@ resolve_host(struct parsed_mount_info *parsed_info) strlcat(parsed_info->addrlist, ",", sizeof(parsed_info->addrlist)); strlcat(parsed_info->addrlist, tmpbuf, - sizeof(parsed_info->addrlist)); + sizeof(parsed_info->addrlist)); addr = addr->ai_next; } @@ -826,31 +873,32 @@ resolve_host_out: return rc; } -static int -parse_unc(char *unc_name, struct parsed_mount_info *parsed_info) +static int parse_unc(char *unc_name, struct parsed_mount_info *parsed_info) { int length = strnlen(unc_name, MAX_UNC_LEN); char *host, *share, *prepath; size_t hostlen, sharelen, prepathlen; - if(length > (MAX_UNC_LEN - 1)) { + if (length > (MAX_UNC_LEN - 1)) { fprintf(stderr, "mount error: UNC name too long\n"); return EX_USAGE; } - if(length < 3) { + if (length < 3) { fprintf(stderr, "mount error: UNC name too short\n"); return EX_USAGE; } if ((strncasecmp("cifs://", unc_name, 7) == 0) || (strncasecmp("smb://", unc_name, 6) == 0)) { - fprintf(stderr, "Mounting cifs URL not implemented yet. Attempt to mount %s\n", unc_name); + fprintf(stderr, + "Mounting cifs URL not implemented yet. Attempt to mount %s\n", + unc_name); return EX_USAGE; } /* Set up "host" and "share" pointers based on UNC format. */ - if(strncmp(unc_name, "//", 2) && strncmp(unc_name, "\\\\", 2)) { + if (strncmp(unc_name, "//", 2) && strncmp(unc_name, "\\\\", 2)) { /* * check for nfs syntax (server:/share/prepath) * @@ -858,7 +906,7 @@ parse_unc(char *unc_name, struct parsed_mount_info *parsed_info) */ host = unc_name; share = strchr(host, ':'); - if(!share) { + if (!share) { fprintf(stderr, "mount.cifs: bad UNC (%s)\n", unc_name); return EX_USAGE; } @@ -903,60 +951,60 @@ parse_unc(char *unc_name, struct parsed_mount_info *parsed_info) return 0; } -static int -get_pw_from_env(struct parsed_mount_info *parsed_info) +static int get_pw_from_env(struct parsed_mount_info *parsed_info) { int rc = 0; if (getenv("PASSWD")) rc = set_password(parsed_info, getenv("PASSWD")); else if (getenv("PASSWD_FD")) - rc = get_password_from_file(atoi(getenv("PASSWD_FD")), NULL, parsed_info); + rc = get_password_from_file(atoi(getenv("PASSWD_FD")), NULL, + parsed_info); else if (getenv("PASSWD_FILE")) - rc = get_password_from_file(0, getenv("PASSWD_FILE"), parsed_info); + rc = get_password_from_file(0, getenv("PASSWD_FILE"), + parsed_info); return rc; } static struct option longopts[] = { - { "all", 0, NULL, 'a' }, - { "help",0, NULL, 'h' }, - { "move",0, NULL, 'm' }, - { "bind",0, NULL, 'b' }, - { "read-only", 0, NULL, 'r' }, - { "ro", 0, NULL, 'r' }, - { "verbose", 0, NULL, 'v' }, - { "version", 0, NULL, 'V' }, - { "read-write", 0, NULL, 'w' }, - { "rw", 0, NULL, 'w' }, - { "options", 1, NULL, 'o' }, - { "type", 1, NULL, 't' }, - { "uid", 1, NULL, '1'}, - { "gid", 1, NULL, '2'}, - { "user",1,NULL,'u'}, - { "username",1,NULL,'u'}, - { "dom",1,NULL,'d'}, - { "domain",1,NULL,'d'}, - { "password",1,NULL,'p'}, - { "pass",1,NULL,'p'}, - { "credentials",1,NULL,'c'}, - { "port",1,NULL,'P'}, - { NULL, 0, NULL, 0 } + {"all", 0, NULL, 'a'}, + {"help", 0, NULL, 'h'}, + {"move", 0, NULL, 'm'}, + {"bind", 0, NULL, 'b'}, + {"read-only", 0, NULL, 'r'}, + {"ro", 0, NULL, 'r'}, + {"verbose", 0, NULL, 'v'}, + {"version", 0, NULL, 'V'}, + {"read-write", 0, NULL, 'w'}, + {"rw", 0, NULL, 'w'}, + {"options", 1, NULL, 'o'}, + {"type", 1, NULL, 't'}, + {"uid", 1, NULL, '1'}, + {"gid", 1, NULL, '2'}, + {"user", 1, NULL, 'u'}, + {"username", 1, NULL, 'u'}, + {"dom", 1, NULL, 'd'}, + {"domain", 1, NULL, 'd'}, + {"password", 1, NULL, 'p'}, + {"pass", 1, NULL, 'p'}, + {"credentials", 1, NULL, 'c'}, + {"port", 1, NULL, 'P'}, + {NULL, 0, NULL, 0} }; /* convert a string to uppercase. return false if the string * wasn't ASCII. Return success on a NULL ptr */ -static int -uppercase_string(char *string) +static int uppercase_string(char *string) { if (!string) return 1; while (*string) { /* check for unicode */ - if ((unsigned char) string[0] & 0x80) + if ((unsigned char)string[0] & 0x80) return 0; - *string = toupper((unsigned char) *string); + *string = toupper((unsigned char)*string); string++; } @@ -977,19 +1025,20 @@ static void print_cifs_mount_version(void) */ static int check_newline(const char *progname, const char *name) { - const char *s; - for (s = "\n"; *s; s++) { - if (strchr(name, *s)) { - fprintf(stderr, "%s: illegal character 0x%02x in mount entry\n", - progname, *s); - return EX_USAGE; - } - } - return 0; + const char *s; + for (s = "\n"; *s; s++) { + if (strchr(name, *s)) { + fprintf(stderr, + "%s: illegal character 0x%02x in mount entry\n", + progname, *s); + return EX_USAGE; + } + } + return 0; } static int check_mtab(const char *progname, const char *devname, - const char *dir) + const char *dir) { if (check_newline(progname, devname) == -1 || check_newline(progname, dir) == -1) @@ -1025,23 +1074,23 @@ add_mtab(char *devname, char *mountpoint, unsigned long flags) mountent.mnt_dir = mountpoint; mountent.mnt_type = (char *)(void *)cifs_fstype; mountent.mnt_opts = (char *)calloc(MTAB_OPTIONS_LEN, 1); - if(mountent.mnt_opts) { + if (mountent.mnt_opts) { if (flags & MS_RDONLY) - strlcat(mountent.mnt_opts,"ro", MTAB_OPTIONS_LEN); + strlcat(mountent.mnt_opts, "ro", MTAB_OPTIONS_LEN); else - strlcat(mountent.mnt_opts,"rw", MTAB_OPTIONS_LEN); - - if(flags & MS_MANDLOCK) - strlcat(mountent.mnt_opts,",mand", MTAB_OPTIONS_LEN); - if(flags & MS_NOEXEC) - strlcat(mountent.mnt_opts,",noexec", MTAB_OPTIONS_LEN); - if(flags & MS_NOSUID) - strlcat(mountent.mnt_opts,",nosuid", MTAB_OPTIONS_LEN); - if(flags & MS_NODEV) - strlcat(mountent.mnt_opts,",nodev", MTAB_OPTIONS_LEN); - if(flags & MS_SYNCHRONOUS) - strlcat(mountent.mnt_opts,",sync", MTAB_OPTIONS_LEN); - if(getuid() != 0) { + strlcat(mountent.mnt_opts, "rw", MTAB_OPTIONS_LEN); + + if (flags & MS_MANDLOCK) + strlcat(mountent.mnt_opts, ",mand", MTAB_OPTIONS_LEN); + if (flags & MS_NOEXEC) + strlcat(mountent.mnt_opts, ",noexec", MTAB_OPTIONS_LEN); + if (flags & MS_NOSUID) + strlcat(mountent.mnt_opts, ",nosuid", MTAB_OPTIONS_LEN); + if (flags & MS_NODEV) + strlcat(mountent.mnt_opts, ",nodev", MTAB_OPTIONS_LEN); + if (flags & MS_SYNCHRONOUS) + strlcat(mountent.mnt_opts, ",sync", MTAB_OPTIONS_LEN); + if (getuid() != 0) { strlcat(mountent.mnt_opts, ",user=", MTAB_OPTIONS_LEN); mount_user = getusername(); if (mount_user) @@ -1064,13 +1113,13 @@ add_mtab_exit: return rc; } -int main(int argc, char ** argv) +int main(int argc, char **argv) { int c; - char * orgoptions = NULL; - char * mountpoint = NULL; - char * options = NULL; - char * dev_name = NULL, *orig_dev = NULL; + char *orgoptions = NULL; + char *mountpoint = NULL; + char *options = NULL; + char *dev_name = NULL, *orig_dev = NULL; char *currentaddress, *nextaddress; int rc = 0; int nomtab = 0; @@ -1084,8 +1133,8 @@ int main(int argc, char ** argv) return EX_USAGE; /* setlocale(LC_ALL, ""); - bindtextdomain(PACKAGE, LOCALEDIR); - textdomain(PACKAGE); */ + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); */ if (!argc || !argv) { rc = mount_cifs_usage(stderr); @@ -1093,7 +1142,7 @@ int main(int argc, char ** argv) } thisprogram = argv[0]; - if(thisprogram == NULL) + if (thisprogram == NULL) thisprogram = "mount.cifs"; parsed_info = calloc(1, sizeof(*parsed_info)); @@ -1105,11 +1154,11 @@ int main(int argc, char ** argv) parsed_info->flags = MS_MANDLOCK; /* add sharename in opts string as unc= parm */ - while ((c = getopt_long (argc, argv, "?fhno:rvVw", - longopts, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "?fhno:rvVw", + longopts, NULL)) != -1) { switch (c) { case '?': - case 'h': /* help */ + case 'h': /* help */ rc = mount_cifs_usage(stdout); goto mount_exit; case 'n': @@ -1130,7 +1179,7 @@ int main(int argc, char ** argv) break; case 'V': print_cifs_mount_version(); - exit (0); + exit(0); case 'w': parsed_info->flags &= ~MS_RDONLY; break; @@ -1144,7 +1193,7 @@ int main(int argc, char ** argv) } } - if(argc < 3 || argv[optind] == NULL || argv[optind + 1] == NULL) { + if (argc < 3 || argv[optind] == NULL || argv[optind + 1] == NULL) { rc = mount_cifs_usage(stderr); goto mount_exit; } @@ -1156,15 +1205,15 @@ int main(int argc, char ** argv) rc = chdir(mountpoint); if (rc) { fprintf(stderr, "Couldn't chdir to %s: %s\n", mountpoint, - strerror(errno)); + strerror(errno)); rc = EX_USAGE; goto mount_exit; } mountpoint = realpath(".", NULL); - if(!mountpoint) { + if (!mountpoint) { fprintf(stderr, "Unable to resolve %s to canonical p |