The branch, master has been updated
via 3aa147f8d20bc5124dca1f4746da678a55247b82 (commit)
from 1e4868d251a4546c92ec275e37e9c5e11f30d1b8 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 3aa147f8d20bc5124dca1f4746da678a55247b82
Author: Jeff Layton <[email protected]>
Date: Thu Sep 24 20:55:43 2009 -0400
mount.cifs: print output to stderr
When a mount fails, mount.cifs often prints an error message. In most
cases, this error goes to stdout instead of stderr like it should. Fix
it to print errors to stderr instead.
Reported-by: Jan Engelhardt <[email protected]>
Signed-off-by: Jeff Layton <[email protected]>
-----------------------------------------------------------------------
Summary of changes:
client/mount.cifs.c | 209 +++++++++++++++++++++++++--------------------------
1 files changed, 101 insertions(+), 108 deletions(-)
Changeset truncated at 500 lines:
diff --git a/client/mount.cifs.c b/client/mount.cifs.c
index 4387f59..1c04e13 100644
--- a/client/mount.cifs.c
+++ b/client/mount.cifs.c
@@ -273,31 +273,34 @@ BB end finish BB */
static char * check_for_domain(char **);
-static void mount_cifs_usage(void)
+static void mount_cifs_usage(FILE *stream)
{
- printf("\nUsage: %s <remotetarget> <dir> -o <options>\n", thisprogram);
- printf("\nMount the remote target, specified as a UNC name,");
- printf(" to a local directory.\n\nOptions:\n");
- printf("\tuser=<arg>\n\tpass=<arg>\n\tdom=<arg>\n");
- printf("\nLess commonly used options:");
-
printf("\n\tcredentials=<filename>,guest,perm,noperm,setuids,nosetuids,rw,ro,");
-
printf("\n\tsep=<char>,iocharset=<codepage>,suid,nosuid,exec,noexec,serverino,");
-
printf("\n\tmapchars,nomapchars,nolock,servernetbiosname=<SRV_RFC1001NAME>");
- printf("\n\tdirectio,nounix,cifsacl,sec=<authentication
mechanism>,sign");
- printf("\n\nOptions not needed for servers supporting CIFS Unix
extensions");
- printf("\n\t(e.g. unneeded for mounts to most Samba versions):");
- printf("\n\tuid=<uid>,gid=<gid>,dir_mode=<mode>,file_mode=<mode>,sfu");
- printf("\n\nRarely used options:");
-
printf("\n\tport=<tcpport>,rsize=<size>,wsize=<size>,unc=<unc_name>,ip=<ip_address>,");
-
printf("\n\tdev,nodev,nouser_xattr,netbiosname=<OUR_RFC1001NAME>,hard,soft,intr,");
-
printf("\n\tnointr,ignorecase,noposixpaths,noacl,prefixpath=<path>,nobrl");
- printf("\n\tin6_addr");
- printf("\n\nOptions are described in more detail in the manual page");
- printf("\n\tman 8 mount.cifs\n");
- printf("\nTo display the version number of the mount helper:");
- printf("\n\t%s -V\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\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\tman 8 mount.cifs\n");
+ fprintf(stream, "\nTo display the version number of the mount helper:");
+ fprintf(stream, "\n\t%s -V\n",thisprogram);
SAFE_FREE(mountpassword);
+
+ if (stream == stderr)
+ exit(EX_USAGE);
+ exit(0);
}
/* caller frees username if necessary */
@@ -348,7 +351,7 @@ static int open_cred_file(char * file_name)
}
}
if(length > 4086) {
- printf("mount.cifs failed due to
malformed username in credentials file");
+ fprintf(stderr, "mount.cifs failed due
to malformed username in credentials file\n");
memset(line_buf,0,4096);
exit(EX_USAGE);
} else {
@@ -372,7 +375,7 @@ static int open_cred_file(char * file_name)
}
}
if(length > MOUNT_PASSWD_SIZE) {
- printf("mount.cifs failed: password in
credentials file too long\n");
+ fprintf(stderr, "mount.cifs failed:
password in credentials file too long\n");
memset(line_buf,0, 4096);
exit(EX_USAGE);
} else {
@@ -392,7 +395,7 @@ static int open_cred_file(char * file_name)
/* go past equals sign */
temp_val++;
if(verboseflag)
- printf("\nDomain %s\n",temp_val);
+ fprintf(stderr, "\nDomain
%s\n",temp_val);
for(length = 0;length<DOMAIN_SIZE+1;length++) {
if ((temp_val[length] == '\n')
|| (temp_val[length] == '\0')) {
@@ -401,7 +404,7 @@ static int open_cred_file(char * file_name)
}
}
if(length > DOMAIN_SIZE) {
- printf("mount.cifs failed: domain in
credentials file too long\n");
+ fprintf(stderr, "mount.cifs failed:
domain in credentials file too long\n");
exit(EX_USAGE);
} else {
if(domain_name == NULL) {
@@ -434,14 +437,14 @@ static int get_password_from_file(int file_descript, char
* filename)
memset(mountpassword, 0, MOUNT_PASSWD_SIZE);
if (mountpassword == NULL) {
- printf("malloc failed\n");
+ fprintf(stderr, "malloc failed\n");
exit(EX_SYSERR);
}
if(filename != NULL) {
file_descript = open(filename, O_RDONLY);
if(file_descript < 0) {
- printf("mount.cifs failed. %s attempting to open
password file %s\n",
+ fprintf(stderr, "mount.cifs failed. %s attempting to
open password file %s\n",
strerror(errno),filename);
exit(EX_SYSERR);
}
@@ -451,14 +454,14 @@ static int get_password_from_file(int file_descript, char
* filename)
for(i=0;i<MOUNT_PASSWD_SIZE;i++) {
rc = read(file_descript,&c,1);
if(rc < 0) {
- printf("mount.cifs failed. Error %s reading password
file\n",strerror(errno));
+ fprintf(stderr, "mount.cifs failed. Error %s reading
password file\n",strerror(errno));
if(filename != NULL)
close(file_descript);
exit(EX_SYSERR);
} else if(rc == 0) {
if(mountpassword[0] == 0) {
if(verboseflag)
- printf("\nWarning: null password used
since cifs password file empty");
+ fprintf(stderr, "\nWarning: null
password used since cifs password file empty");
}
break;
} else /* read valid character */ {
@@ -470,7 +473,7 @@ static int get_password_from_file(int file_descript, char *
filename)
}
}
if((i == MOUNT_PASSWD_SIZE) && (verboseflag)) {
- printf("\nWarning: password longer than %d characters specified
in cifs password file",
+ fprintf(stderr, "\nWarning: password longer than %d characters
specified in cifs password file",
MOUNT_PASSWD_SIZE);
}
got_password = 1;
@@ -499,7 +502,7 @@ static int parse_options(char ** optionsp, unsigned long *
filesys_flags)
data = *optionsp;
if(verboseflag)
- printf("parsing options: %s\n", data);
+ fprintf(stderr, "parsing options: %s\n", data);
/* BB fixme check for separator override BB */
@@ -546,7 +549,7 @@ static int parse_options(char ** optionsp, unsigned long *
filesys_flags)
*filesys_flags |= MS_USER;
goto nocopy;
} else {
- printf("username specified with no
parameter\n");
+ fprintf(stderr, "username specified
with no parameter\n");
SAFE_FREE(out);
return 1; /* needs_arg; */
}
@@ -560,7 +563,7 @@ static int parse_options(char ** optionsp, unsigned long *
filesys_flags)
mountpassword = (char
*)calloc(MOUNT_PASSWD_SIZE+1,1);
if(mountpassword) {
if(got_password)
-
printf("\nmount.cifs warning - password specified twice\n");
+ fprintf(stderr,
"\nmount.cifs warning - password specified twice\n");
got_password = 1;
percent_char++;
strlcpy(mountpassword,
percent_char,MOUNT_PASSWD_SIZE+1);
@@ -579,7 +582,7 @@ static int parse_options(char ** optionsp, unsigned long *
filesys_flags)
invoked */
domain_name = check_for_domain(&value);
} else {
- printf("username too long\n");
+ fprintf(stderr, "username too long\n");
SAFE_FREE(out);
return 1;
}
@@ -587,15 +590,15 @@ static int parse_options(char ** optionsp, unsigned long
* filesys_flags)
} else if (strncmp(data, "pass", 4) == 0) {
if (!value || !*value) {
if(got_password) {
- printf("\npassword specified twice,
ignoring second\n");
+ fprintf(stderr, "\npassword specified
twice, ignoring second\n");
} else
got_password = 1;
} else if (strnlen(value, MOUNT_PASSWD_SIZE) <
MOUNT_PASSWD_SIZE) {
if(got_password)
- printf("\nmount.cifs warning - password
specified twice\n");
+ fprintf(stderr, "\nmount.cifs warning -
password specified twice\n");
got_password = 1;
} else {
- printf("password too long\n");
+ fprintf(stderr, "password too long\n");
SAFE_FREE(out);
return 1;
}
@@ -607,13 +610,13 @@ static int parse_options(char ** optionsp, unsigned long
* filesys_flags)
}
} else if (strncmp(data, "ip", 2) == 0) {
if (!value || !*value) {
- printf("target ip address argument missing");
+ fprintf(stderr, "target ip address argument
missing");
} else if (strnlen(value, MAX_ADDRESS_LEN) <=
MAX_ADDRESS_LEN) {
if(verboseflag)
- printf("ip address %s override
specified\n",value);
+ fprintf(stderr, "ip address %s override
specified\n",value);
got_ip = 1;
} else {
- printf("ip address too long\n");
+ fprintf(stderr, "ip address too long\n");
SAFE_FREE(out);
return 1;
}
@@ -621,32 +624,32 @@ static int parse_options(char ** optionsp, unsigned long
* filesys_flags)
|| (strncmp(data, "target", 6) == 0)
|| (strncmp(data, "path", 4) == 0)) {
if (!value || !*value) {
- printf("invalid path to network resource\n");
+ fprintf(stderr, "invalid path to network
resource\n");
SAFE_FREE(out);
return 1; /* needs_arg; */
} else if(strnlen(value,5) < 5) {
- printf("UNC name too short");
+ fprintf(stderr, "UNC name too short");
}
if (strnlen(value, 300) < 300) {
got_unc = 1;
if (strncmp(value, "//", 2) == 0) {
if(got_unc)
- printf("unc name specified
twice, ignoring second\n");
+ fprintf(stderr, "unc name
specified twice, ignoring second\n");
else
got_unc = 1;
} else if (strncmp(value, "\\\\", 2) != 0) {
- printf("UNC Path does not begin with //
or \\\\ \n");
+ fprintf(stderr, "UNC Path does not
begin with // or \\\\ \n");
SAFE_FREE(out);
return 1;
} else {
if(got_unc)
- printf("unc name specified
twice, ignoring second\n");
+ fprintf(stderr, "unc name
specified twice, ignoring second\n");
else
got_unc = 1;
}
} else {
- printf("CIFS: UNC name too long\n");
+ fprintf(stderr, "CIFS: UNC name too long\n");
SAFE_FREE(out);
return 1;
}
@@ -656,14 +659,14 @@ static int parse_options(char ** optionsp, unsigned long
* filesys_flags)
such as "DOM" and "dom" and "workgroup"
and "WORKGRP" etc. */
if (!value || !*value) {
- printf("CIFS: invalid domain name\n");
+ fprintf(stderr, "CIFS: invalid domain name\n");
SAFE_FREE(out);
return 1; /* needs_arg; */
}
if (strnlen(value, DOMAIN_SIZE+1) < DOMAIN_SIZE+1) {
got_domain = 1;
} else {
- printf("domain name too long\n");
+ fprintf(stderr, "domain name too long\n");
SAFE_FREE(out);
return 1;
}
@@ -671,13 +674,13 @@ static int parse_options(char ** optionsp, unsigned long
* filesys_flags)
if (value && *value) {
rc = open_cred_file(value);
if(rc) {
- printf("error %d (%s) opening
credential file %s\n",
+ fprintf(stderr, "error %d (%s) opening
credential file %s\n",
rc, strerror(rc), value);
SAFE_FREE(out);
return 1;
}
} else {
- printf("invalid credential file name
specified\n");
+ fprintf(stderr, "invalid credential file name
specified\n");
SAFE_FREE(out);
return 1;
}
@@ -688,7 +691,7 @@ static int parse_options(char ** optionsp, unsigned long *
filesys_flags)
struct passwd *pw;
if (!(pw = getpwnam(value))) {
- printf("bad user name
\"%s\"\n", value);
+ fprintf(stderr, "bad user name
\"%s\"\n", value);
exit(EX_USAGE);
}
snprintf(user, sizeof(user), "%u",
pw->pw_uid);
@@ -704,7 +707,7 @@ static int parse_options(char ** optionsp, unsigned long *
filesys_flags)
struct group *gr;
if (!(gr = getgrnam(value))) {
- printf("bad group name
\"%s\"\n", value);
+ fprintf(stderr, "bad group name
\"%s\"\n", value);
exit(EX_USAGE);
}
snprintf(group, sizeof(group), "%u",
gr->gr_gid);
@@ -716,32 +719,32 @@ static int parse_options(char ** optionsp, unsigned long
* filesys_flags)
/* fmask and dmask synonyms for people used to smbfs syntax */
} else if (strcmp(data, "file_mode") == 0 || strcmp(data,
"fmask")==0) {
if (!value || !*value) {
- printf ("Option '%s' requires a numerical
argument\n", data);
+ fprintf(stderr, "Option '%s' requires a
numerical argument\n", data);
SAFE_FREE(out);
return 1;
}
if (value[0] != '0') {
- printf ("WARNING: '%s' not expressed in
octal.\n", data);
+ fprintf(stderr, "WARNING: '%s' not expressed in
octal.\n", data);
}
if (strcmp (data, "fmask") == 0) {
- printf ("WARNING: CIFS mount option 'fmask' is
deprecated. Use 'file_mode' instead.\n");
+ 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) {
if (!value || !*value) {
- printf ("Option '%s' requires a numerical
argument\n", data);
+ fprintf(stderr, "Option '%s' requires a
numerical argument\n", data);
SAFE_FREE(out);
return 1;
}
if (value[0] != '0') {
- printf ("WARNING: '%s' not expressed in
octal.\n", data);
+ fprintf(stderr, "WARNING: '%s' not expressed in
octal.\n", data);
}
if (strcmp (data, "dmask") == 0) {
- printf ("WARNING: CIFS mount option 'dmask' is
deprecated. Use 'dir_mode' instead.\n");
+ fprintf(stderr, "WARNING: CIFS mount option
'dmask' is deprecated. Use 'dir_mode' instead.\n");
data = "dir_mode";
}
/* the following eight mount options should be
@@ -794,7 +797,7 @@ static int parse_options(char ** optionsp, unsigned long *
filesys_flags)
}
} else if (strnicmp(data, "version", 3) == 0) {
} else {
- printf("CIFS: Unknown mount option %s\n",data);
+ fprintf(stderr, "CIFS: Unknown mount option %s\n",data);
} */ /* nothing to do on those four mount options above.
Just pass to kernel and ignore them here */
@@ -888,7 +891,7 @@ static void check_for_comma(char ** ppasswrd)
return;
if(number_of_commas > MOUNT_PASSWD_SIZE) {
/* would otherwise overflow the mount options buffer */
- printf("\nInvalid password. Password contains too many
commas.\n");
+ fprintf(stderr, "\nInvalid password. Password contains too many
commas.\n");
return;
}
@@ -942,7 +945,7 @@ static char * check_for_domain(char **ppuser)
}
if(got_domain) {
- printf("Domain name specified twice. Username probably
malformed\n");
+ fprintf(stderr, "Domain name specified twice. Username probably
malformed\n");
return NULL;
}
@@ -951,7 +954,7 @@ static char * check_for_domain(char **ppuser)
if (domainnm[0] != 0) {
got_domain = 1;
} else {
- printf("null domain\n");
+ fprintf(stderr, "null domain\n");
}
len = strlen(domainnm);
/* reset domainm to new buffer, and copy
@@ -1010,18 +1013,18 @@ parse_server(char ** punc_name)
int rc;
if(length > (MAX_UNC_LEN - 1)) {
- printf("mount error: UNC name too long");
+ fprintf(stderr, "mount error: UNC name too long");
return NULL;
}
if ((strncasecmp("cifs://", unc_name, 7) == 0) ||
(strncasecmp("smb://", unc_name, 6) == 0)) {
- printf("\nMounting cifs URL not implemented yet. Attempt to
mount %s\n", unc_name);
+ fprintf(stderr, "\nMounting cifs URL not implemented yet.
Attempt to mount %s\n", unc_name);
return NULL;
}
if(length < 3) {
/* BB add code to find DFS root here */
- printf("\nMounting the DFS root for domain not implemented
yet\n");
+ fprintf(stderr, "\nMounting the DFS root for domain not
implemented yet\n");
return NULL;
} else {
if(strncmp(unc_name,"//",2) && strncmp(unc_name,"\\\\",2)) {
@@ -1042,8 +1045,8 @@ parse_server(char ** punc_name)
unc_name[length+2] = 0;
goto continue_unc_parsing;
} else {
- printf("mount error: improperly formatted UNC
name.");
- printf(" %s does not begin with \\\\ or
//\n",unc_name);
+ fprintf(stderr, "mount error: improperly
formatted UNC name.");
+ fprintf(stderr, " %s does not begin with \\\\
or //\n",unc_name);
return NULL;
}
} else {
@@ -1059,7 +1062,7 @@ continue_unc_parsing:
if(got_ip == 0) {
rc = getaddrinfo(unc_name, NULL, NULL,
&addrlist);
if (rc != 0) {
- printf("mount error: could not
resolve address for %s: %s\n",
+ fprintf(stderr, "mount error:
could not resolve address for %s: %s\n",
unc_name,
gai_strerror(rc));
addrlist = NULL;
}
@@ -1074,7 +1077,7 @@ continue_unc_parsing:
}
if(got_ip) {
if(verboseflag)
- printf("ip address specified
explicitly\n");
+ fprintf(stderr, "ip address
specified explicitly\n");
return NULL;
}
/* BB should we pass an alternate version of
the share name as Unicode */
@@ -1082,7 +1085,7 @@ continue_unc_parsing:
return addrlist;
} else {
/* BB add code to find DFS root (send null path
on get DFS Referral to specified server here */
- printf("Mounting the DFS root for a particular
server not implemented yet\n");
+ fprintf(stderr, "Mounting the DFS root for a
particular server not implemented yet\n");
return NULL;
}
}
@@ -1181,12 +1184,10 @@ int main(int argc, char ** argv)
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE); */
- if(argc && argv) {
+ if(argc && argv)
thisprogram = argv[0];
- } else {
- mount_cifs_usage();
- exit(EX_USAGE);
- }
+ else
+ mount_cifs_usage(stderr);
if(thisprogram == NULL)
thisprogram = "mount.cifs";
@@ -1195,7 +1196,7 @@ int main(int argc, char ** argv)
/* BB add workstation name and domain and pass down */
/* #ifdef _GNU_SOURCE
- printf(" node: %s machine: %s sysname %s domain %s\n",
sysinfo.nodename,sysinfo.machine,sysinfo.sysname,sysinfo.domainname);
+ fprintf(stderr, " node: %s machine: %s sysname %s domain %s\n",
sysinfo.nodename,sysinfo.machine,sysinfo.sysname,sysinfo.domainname);
#endif */
if(argc > 2) {
dev_name = argv[1];
@@ -1216,16 +1217,11 @@ int main(int argc, char ** argv)
if ((strcmp(argv[1], "-h") == 0) ||
(strcmp(argv[1], "-?") == 0) ||
(strcmp(argv[1], "--help") == 0))
- {
- mount_cifs_usage();
- exit(0);
- }
+ mount_cifs_usage(stdout);
- mount_cifs_usage();
- exit(EX_USAGE);
+ mount_cifs_usage(stderr);
} else {
- mount_cifs_usage();
- exit(EX_USAGE);
+ mount_cifs_usage(stderr);
}
@@ -1246,8 +1242,7 @@ int main(int argc, char ** argv)
case '?':
case 'h': /* help */
- mount_cifs_usage ();
- exit(0);
+ mount_cifs_usage(stdout);
case 'n':
++nomtab;
break;
@@ -1297,14 +1292,14 @@ int main(int argc, char ** argv)
uid = strtoul(optarg, &ep, 10);
if (*ep) {
- printf("bad uid value \"%s\"\n",
optarg);
+ fprintf(stderr, "bad uid value
\"%s\"\n", optarg);
exit(EX_USAGE);
}
--
Samba Shared Repository