int afp_url_validate(char * url_string, struct afp_url * valid_url) { struct afp_url new_url; if (afp_parse_url(&new_url, url_string,0)) { printf("url doesn't parse\n"); goto error; } #if BROKEN if (new_url.protocol!=valid_url->protocol) { printf("protocol doesn't match, I got %d when I expected %d\n", new_url.protocol,valid_url->protocol); goto error; } #endif if (strcmp(new_url.username, valid_url->username)!=0) { printf("username doesn't match, I got %s when I should have received %s\n",new_url.username, valid_url->username); goto error; } if (strcmp(new_url.uamname, valid_url->uamname)!=0) { printf("uamname doesn't match, I got %s when I should have received %s\n",new_url.uamname, valid_url->uamname); goto error; } if (strcmp(new_url.password, valid_url->password)!=0) { printf("password doesn't match, I got %s when I should have received %s\n",new_url.password, valid_url->password); goto error; } if (strcmp(new_url.servername, valid_url->servername)!=0) { printf("servername doesn't match, I got %s when I should have received %s\n",new_url.servername, valid_url->servername); goto error; } if (strcmp(new_url.volumename, valid_url->volumename)!=0) { printf("volumename doesn't match, I got %s when I should have received %s\n",new_url.volumename, valid_url->volumename); goto error; } return 0; error: return -1; }
int com_connect(char * arg) { struct afp_url tmpurl; if (!arg) arg = ""; if (server) { printf("You're already connected to a server\n"); goto error; } afp_default_url(&tmpurl); /* First, try to parse the URL */ if (afp_parse_url(&tmpurl,arg,0)!=0) { /* Okay, this isn't a real URL */ printf("Could not parse url, let me see if this is a server name...\n"); if (gethostbyname(arg)) memcpy(&url.servername,arg,AFP_SERVER_NAME_LEN); else { printf("Cannot understand server name or url %s\n",arg); return -1; } } else { url=tmpurl; } cmdline_getpass(); if (server_subconnect()) { printf("Could not connect\n"); goto error; }; connect_volume(url.volumename); return 0; error: return -1; }
static int handle_mount_afp(int argc, char * argv[]) { struct afp_server_mount_request * req = (void *) outgoing_buffer+1; unsigned int uam_mask=default_uams_mask(); char * urlstring, * mountpoint; char * volpass = NULL; int readonly=0; if (argc<2) { mount_afp_usage(); return -1; } if (strncmp(argv[1],"-o",2)==0) { char * p = argv[2], *q; char command[256]; struct passwd * passwd; struct group * group; do { memset(command,0,256); if ((q=strchr(p,','))) strncpy(command,p,(q-p)); else strcpy(command,p); if (strncmp(command,"volpass="******"user="******"Unknown user %s\n",p); return -1; } uid=passwd->pw_uid; if (geteuid()!=uid) changeuid=1; } else if (strncmp(command,"group=",6)==0) { p=command+6; if ((group=getgrnam(p))==NULL) { printf("Unknown group %s\n",p); return -1; } gid=group->gr_gid; changegid=1; } else if (strcmp(command,"rw")==0) { /* Don't do anything */ } else if (strcmp(command,"ro")==0) { readonly=1; } else { printf("Unknown option %s, skipping\n",command); } if (q) p=q+1; else p=NULL; } while (p); urlstring=argv[3]; mountpoint=argv[4]; } else { urlstring=argv[1]; mountpoint=argv[2]; } outgoing_len=sizeof(struct afp_server_mount_request)+1; memset(outgoing_buffer,0,outgoing_len); afp_default_url(&req->url); req->changeuid=changeuid; req->volume_options|=DEFAULT_MOUNT_FLAGS; if (readonly) req->volume_options |= VOLUME_EXTRA_FLAGS_READONLY; req->uam_mask=uam_mask; outgoing_buffer[0]=AFP_SERVER_COMMAND_MOUNT; req->map=AFP_MAPPING_UNKNOWN; snprintf(req->mountpoint,255,"%s",mountpoint); if (afp_parse_url(&req->url,urlstring,0) !=0) { printf("Could not parse URL\n"); return -1; } if (strcmp(req->url.password,"-")==0) { char *p = getpass("AFP Password: "******"%s",p); } if (volpass && (strcmp(volpass,"-")==0)) { volpass = getpass("Password for volume: "); } if (volpass) snprintf(req->url.volpassword,9,"%s",volpass); return 0; }