summaryrefslogtreecommitdiff
path: root/source3/client/mount.cifs.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/client/mount.cifs.c')
-rw-r--r--source3/client/mount.cifs.c96
1 files changed, 58 insertions, 38 deletions
diff --git a/source3/client/mount.cifs.c b/source3/client/mount.cifs.c
index 3b56e5f861..fd8014cf9f 100644
--- a/source3/client/mount.cifs.c
+++ b/source3/client/mount.cifs.c
@@ -56,6 +56,10 @@
#endif /* _SAMBA_BUILD_ */
#endif /* MOUNT_CIFS_VENDOR_SUFFIX */
+#ifdef _SAMBA_BUILD_
+#include "include/config.h"
+#endif
+
#ifndef MS_MOVE
#define MS_MOVE 8192
#endif
@@ -75,6 +79,15 @@
#define MOUNT_PASSWD_SIZE 64
#define DOMAIN_SIZE 64
+/* exit status - bits below are ORed */
+#define EX_USAGE 1 /* incorrect invocation or permission */
+#define EX_SYSERR 2 /* out of memory, cannot fork, ... */
+#define EX_SOFTWARE 4 /* internal mount bug or wrong version */
+#define EX_USER 8 /* user interrupt */
+#define EX_FILEIO 16 /* problems writing, locking, ... mtab/fstab */
+#define EX_FAIL 32 /* mount failure */
+#define EX_SOMEOK 64 /* some mount succeeded */
+
const char *thisprogram;
int verboseflag = 0;
static int got_password = 0;
@@ -94,6 +107,8 @@ char * prefixpath = NULL;
/* like strncpy but does not 0 fill the buffer and always null
* terminates. bufsize is the size of the destination buffer */
+
+#ifndef HAVE_STRLCPY
static size_t strlcpy(char *d, const char *s, size_t bufsize)
{
size_t len = strlen(s);
@@ -104,10 +119,13 @@ static size_t strlcpy(char *d, const char *s, size_t bufsize)
d[len] = 0;
return ret;
}
+#endif
/* like strncat but does not 0 fill the buffer and always null
* terminates. bufsize is the length of the buffer, which should
* be one more than the maximum resulting string length */
+
+#ifndef HAVE_STRLCAT
static size_t strlcat(char *d, const char *s, size_t bufsize)
{
size_t len1 = strlen(d);
@@ -126,6 +144,7 @@ static size_t strlcat(char *d, const char *s, size_t bufsize)
}
return ret;
}
+#endif
/* BB finish BB
@@ -164,7 +183,7 @@ static void mount_cifs_usage(void)
printf("\n\t%s -V\n",thisprogram);
SAFE_FREE(mountpassword);
- exit(1);
+ exit(EX_USAGE);
}
/* caller frees username if necessary */
@@ -223,7 +242,7 @@ static int open_cred_file(char * file_name)
if(length > 4086) {
printf("mount.cifs failed due to malformed username in credentials file");
memset(line_buf,0,4096);
- exit(1);
+ exit(EX_USAGE);
} else {
got_user = 1;
user_name = (char *)calloc(1 + length,1);
@@ -247,7 +266,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");
memset(line_buf,0, 4096);
- exit(1);
+ exit(EX_USAGE);
} else {
if(mountpassword == NULL) {
mountpassword = (char *)calloc(MOUNT_PASSWD_SIZE+1,1);
@@ -275,7 +294,7 @@ static int open_cred_file(char * file_name)
}
if(length > DOMAIN_SIZE) {
printf("mount.cifs failed: domain in credentials file too long\n");
- exit(1);
+ exit(EX_USAGE);
} else {
if(domain_name == NULL) {
domain_name = (char *)calloc(DOMAIN_SIZE+1,1);
@@ -308,7 +327,7 @@ static int get_password_from_file(int file_descript, char * filename)
if (mountpassword == NULL) {
printf("malloc failed\n");
- exit(1);
+ exit(EX_SYSERR);
}
if(filename != NULL) {
@@ -316,7 +335,7 @@ static int get_password_from_file(int file_descript, char * filename)
if(file_descript < 0) {
printf("mount.cifs failed. %s attempting to open password file %s\n",
strerror(errno),filename);
- exit(1);
+ exit(EX_SYSERR);
}
}
/* else file already open and fd provided */
@@ -327,7 +346,7 @@ static int get_password_from_file(int file_descript, char * filename)
printf("mount.cifs failed. Error %s reading password file\n",strerror(errno));
if(filename != NULL)
close(file_descript);
- exit(1);
+ exit(EX_SYSERR);
} else if(rc == 0) {
if(mountpassword[0] == 0) {
if(verboseflag)
@@ -553,7 +572,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
if (!(pw = getpwnam(value))) {
printf("bad user name \"%s\"\n", value);
- exit(1);
+ exit(EX_USAGE);
}
snprintf(user, sizeof(user), "%u", pw->pw_uid);
} else {
@@ -569,7 +588,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
if (!(gr = getgrnam(value))) {
printf("bad group name \"%s\"\n", value);
- exit(1);
+ exit(EX_USAGE);
}
snprintf(group, sizeof(group), "%u", gr->gr_gid);
} else {
@@ -664,7 +683,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
out = (char *)realloc(out, out_len + word_len + 2);
if (out == NULL) {
perror("malloc");
- exit(1);
+ exit(EX_SYSERR);
}
if (out_len) {
@@ -689,7 +708,7 @@ nocopy:
out = (char *)realloc(out, out_len + word_len + 6);
if (out == NULL) {
perror("malloc");
- exit(1);
+ exit(EX_SYSERR);
}
if (out_len) {
@@ -705,7 +724,7 @@ nocopy:
out = (char *)realloc(out, out_len + 1 + word_len + 6);
if (out == NULL) {
perror("malloc");
- exit(1);
+ exit(EX_SYSERR);
}
if (out_len) {
@@ -986,12 +1005,12 @@ static struct option longopts[] = {
};
/* convert a string to uppercase. return false if the string
- * wasn't ASCII or was a NULL ptr */
+ * wasn't ASCII. Return success on a NULL ptr */
static int
uppercase_string(char *string)
{
if (!string)
- return 0;
+ return 1;
while (*string) {
/* check for unicode */
@@ -1040,7 +1059,7 @@ int main(int argc, char ** argv)
thisprogram = argv[0];
} else {
mount_cifs_usage();
- exit(1);
+ exit(EX_USAGE);
}
if(thisprogram == NULL)
@@ -1057,12 +1076,12 @@ int main(int argc, char ** argv)
share_name = strndup(argv[1], MAX_UNC_LEN);
if (share_name == NULL) {
fprintf(stderr, "%s: %s", argv[0], strerror(ENOMEM));
- exit(1);
+ exit(EX_SYSERR);
}
mountpoint = argv[2];
} else {
mount_cifs_usage();
- exit(1);
+ exit(EX_USAGE);
}
/* add sharename in opts string as unc= parm */
@@ -1084,7 +1103,7 @@ int main(int argc, char ** argv)
case '?':
case 'h': /* help */
mount_cifs_usage ();
- exit(1);
+ exit(EX_USAGE);
case 'n':
++nomtab;
break;
@@ -1138,14 +1157,14 @@ int main(int argc, char ** argv)
uid = strtoul(optarg, &ep, 10);
if (*ep) {
printf("bad uid value \"%s\"\n", optarg);
- exit(1);
+ exit(EX_USAGE);
}
} else {
struct passwd *pw;
if (!(pw = getpwnam(optarg))) {
printf("bad user name \"%s\"\n", optarg);
- exit(1);
+ exit(EX_USAGE);
}
uid = pw->pw_uid;
endpwent();
@@ -1158,14 +1177,14 @@ int main(int argc, char ** argv)
gid = strtoul(optarg, &ep, 10);
if (*ep) {
printf("bad gid value \"%s\"\n", optarg);
- exit(1);
+ exit(EX_USAGE);
}
} else {
struct group *gr;
if (!(gr = getgrnam(optarg))) {
printf("bad user name \"%s\"\n", optarg);
- exit(1);
+ exit(EX_USAGE);
}
gid = gr->gr_gid;
endpwent();
@@ -1195,13 +1214,13 @@ int main(int argc, char ** argv)
default:
printf("unknown mount option %c\n",c);
mount_cifs_usage();
- exit(1);
+ exit(EX_USAGE);
}
}
if((argc < 3) || (dev_name == NULL) || (mountpoint == NULL)) {
mount_cifs_usage();
- exit(1);
+ exit(EX_USAGE);
}
if (getenv("PASSWD")) {
@@ -1218,13 +1237,13 @@ int main(int argc, char ** argv)
}
if (orgoptions && parse_options(&orgoptions, &flags)) {
- rc = -1;
+ rc = EX_USAGE;
goto mount_exit;
}
ipaddr = parse_server(&share_name);
if((ipaddr == NULL) && (got_ip == 0)) {
printf("No ip address specified and hostname not found\n");
- rc = -1;
+ rc = EX_USAGE;
goto mount_exit;
}
@@ -1239,19 +1258,19 @@ int main(int argc, char ** argv)
}
if(chdir(mountpoint)) {
printf("mount error: can not change directory into mount target %s\n",mountpoint);
- rc = -1;
+ rc = EX_USAGE;
goto mount_exit;
}
if(stat (".", &statbuf)) {
printf("mount error: mount point %s does not exist\n",mountpoint);
- rc = -1;
+ rc = EX_USAGE;
goto mount_exit;
}
if (S_ISDIR(statbuf.st_mode) == 0) {
printf("mount error: mount point %s is not a directory\n",mountpoint);
- rc = -1;
+ rc = EX_USAGE;
goto mount_exit;
}
@@ -1264,7 +1283,7 @@ int main(int argc, char ** argv)
#endif
} else {
printf("mount error: permission denied or not superuser and mount.cifs not installed SUID\n");
- return -1;
+ exit(EX_USAGE);
}
}
@@ -1279,7 +1298,7 @@ int main(int argc, char ** argv)
mountpassword = (char *)calloc(MOUNT_PASSWD_SIZE+1,1);
if (!tmp_pass || !mountpassword) {
printf("Password not entered, exiting\n");
- return -1;
+ exit(EX_USAGE);
}
strlcpy(mountpassword, tmp_pass, MOUNT_PASSWD_SIZE+1);
got_password = 1;
@@ -1297,7 +1316,7 @@ mount_retry:
else {
printf("No server share name specified\n");
printf("\nMounting the DFS root for server not implemented yet\n");
- exit(1);
+ exit(EX_USAGE);
}
if(user_name)
optlen += strlen(user_name) + 6;
@@ -1311,7 +1330,7 @@ mount_retry:
if(options == NULL) {
printf("Could not allocate memory for mount options\n");
- return -1;
+ exit(EX_SYSERR);
}
options[0] = 0;
@@ -1390,8 +1409,7 @@ mount_retry:
printf("mount error %d = %s\n",errno,strerror(errno));
}
printf("Refer to the mount.cifs(8) manual page (e.g.man mount.cifs)\n");
- rc = -1;
- goto mount_exit;
+ rc = EX_FAIL;
} else {
pmntfile = setmntent(MOUNTED, "a+");
if(pmntfile) {
@@ -1429,11 +1447,13 @@ mount_retry:
rc = addmntent(pmntfile,&mountent);
endmntent(pmntfile);
SAFE_FREE(mountent.mnt_opts);
+ if (rc)
+ rc = EX_FILEIO;
} else {
- printf("could not update mount table\n");
+ printf("could not update mount table\n");
+ rc = EX_FILEIO;
}
}
- rc = 0;
mount_exit:
if(mountpassword) {
int len = strlen(mountpassword);
@@ -1445,5 +1465,5 @@ mount_exit:
SAFE_FREE(orgoptions);
SAFE_FREE(resolved_path);
SAFE_FREE(share_name);
- return rc;
+ exit(rc);
}