summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mount.cifs.c137
1 files changed, 68 insertions, 69 deletions
diff --git a/mount.cifs.c b/mount.cifs.c
index 18f2a1e..66aa859 100644
--- a/mount.cifs.c
+++ b/mount.cifs.c
@@ -991,92 +991,91 @@ static void replace_char(char *string, char from, char to, int maxlen)
/* Note that caller frees the returned buffer if necessary */
static struct addrinfo *
-parse_server(char ** punc_name)
+parse_server(char **punc_name)
{
- char * unc_name = *punc_name;
+ char *unc_name = *punc_name;
int length = strnlen(unc_name, MAX_UNC_LEN);
- char * share;
+ char *share;
struct addrinfo *addrlist;
int rc;
if(length > (MAX_UNC_LEN - 1)) {
- fprintf(stderr, "mount error: UNC name too long");
+ fprintf(stderr, "mount error: UNC name too long\n");
return NULL;
}
+
+ if(length < 3) {
+ fprintf(stderr, "mount error: UNC name too short\n");
+ return NULL;
+ }
+
if ((strncasecmp("cifs://", unc_name, 7) == 0) ||
(strncasecmp("smb://", unc_name, 6) == 0)) {
- fprintf(stderr, "\nMounting 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 NULL;
}
- if(length < 3) {
- /* BB add code to find DFS root here */
- fprintf(stderr, "\nMounting the DFS root for domain not implemented yet\n");
- return NULL;
- } else {
- if(strncmp(unc_name,"//",2) && strncmp(unc_name,"\\\\",2)) {
- /* check for nfs syntax ie server:share */
- share = strchr(unc_name,':');
- if(share) {
- *punc_name = (char *)malloc(length+3);
- if(*punc_name == NULL) {
- /* put the original string back if
- no memory left */
- *punc_name = unc_name;
- return NULL;
- }
- *share = '/';
- strlcpy((*punc_name)+2,unc_name,length+1);
- SAFE_FREE(unc_name);
- unc_name = *punc_name;
- unc_name[length+2] = 0;
- goto continue_unc_parsing;
- } else {
- fprintf(stderr, "mount error: improperly formatted UNC name.");
- fprintf(stderr, " %s does not begin with \\\\ or //\n",unc_name);
- return NULL;
- }
- } else {
-continue_unc_parsing:
- unc_name[0] = '/';
- unc_name[1] = '/';
- unc_name += 2;
-
- /* allow for either delimiter between host and sharename */
- if ((share = strpbrk(unc_name, "/\\"))) {
- *share = 0; /* temporarily terminate the string */
- share += 1;
- if(got_ip == 0) {
- rc = getaddrinfo(unc_name, NULL, NULL, &addrlist);
- if (rc != 0) {
- fprintf(stderr, "mount error: could not resolve address for %s: %s\n",
- unc_name, gai_strerror(rc));
- addrlist = NULL;
- }
- }
- *(share - 1) = '/'; /* put delimiter back */
+ if(strncmp(unc_name,"//",2) && strncmp(unc_name,"\\\\",2)) {
+ /* check for nfs syntax ie server:share */
+ share = strchr(unc_name,':');
+ if(!share) {
+ fprintf(stderr, "mount error: improperly formatted UNC name.");
+ fprintf(stderr, " %s does not begin with \\\\ or //\n",unc_name);
+ return NULL;
+ }
- /* we don't convert the prefixpath delimiters since '\\' is a valid char in posix paths */
- if ((prefixpath = strpbrk(share, "/\\"))) {
- *prefixpath = 0; /* permanently terminate the string */
- if (!strlen(++prefixpath))
- prefixpath = NULL; /* this needs to be done explicitly */
- }
- if(got_ip) {
- if(verboseflag)
- fprintf(stderr, "ip address specified explicitly\n");
- return NULL;
- }
- /* BB should we pass an alternate version of the share name as Unicode */
+ *punc_name = (char *)malloc(length + 3);
+ if(*punc_name == NULL) {
+ *punc_name = unc_name;
+ return NULL;
+ }
- return addrlist;
- } else {
- /* BB add code to find DFS root (send null path on get DFS Referral to specified server here */
- fprintf(stderr, "Mounting the DFS root for a particular server not implemented yet\n");
- return NULL;
- }
+ *share = '/';
+ strlcpy((*punc_name)+2, unc_name, length + 1);
+ SAFE_FREE(unc_name);
+ unc_name = *punc_name;
+ unc_name[length+2] = 0;
+ }
+
+ unc_name[0] = '/';
+ unc_name[1] = '/';
+ unc_name += 2;
+
+ /*
+ * allow for either delimiter between host and sharename
+ * If there's not one, then the UNC is malformed
+ */
+ if (!(share = strpbrk(unc_name, "/\\"))) {
+ fprintf(stderr, "mount error: Malformed UNC\n");
+ return NULL;
+ }
+
+ *share = 0; /* temporarily terminate the string */
+ share += 1;
+ if(got_ip == 0) {
+ rc = getaddrinfo(unc_name, NULL, NULL, &addrlist);
+ if (rc != 0) {
+ fprintf(stderr, "mount error: could not resolve address for %s: %s\n",
+ unc_name, gai_strerror(rc));
+ addrlist = NULL;
}
}
+ *(share - 1) = '/'; /* put delimiter back */
+
+ /* we don't convert the prefixpath delimiters since '\\' is a valid char in posix paths */
+ if ((prefixpath = strpbrk(share, "/\\"))) {
+ *prefixpath = 0; /* permanently terminate the string */
+ if (!strlen(++prefixpath))
+ prefixpath = NULL; /* this needs to be done explicitly */
+ }
+ if(got_ip) {
+ if(verboseflag)
+ fprintf(stderr, "ip address specified explicitly\n");
+ return NULL;
+ }
+ /* BB should we pass an alternate version of the share name as Unicode */
+
+ return addrlist;
}
static struct option longopts[] = {