static int dsi_parse_uams(struct afp_server * server, char * msg) { unsigned char num_uams = msg[0]; unsigned char len; int i; char * p; char ua_name[AFP_UAM_LENGTH+1]; server->supported_uams= 0; memset(ua_name,0,AFP_UAM_LENGTH+1); if (num_uams > SERVER_MAX_UAMS) num_uams = SERVER_MAX_UAMS; p=msg+1; for (i=0;i<num_uams;i++) { len=copy_from_pascal(ua_name,p,AFP_UAM_LENGTH)+1; server->supported_uams|=uam_string_to_bitmap(ua_name); p+=len; } return 0; }
static int check_uamname(const char * uam) { return !uam_string_to_bitmap(uam); }
static int do_mount(int argc, char ** argv) { int c; int option_index=0; struct afp_server_mount_request * req; int optnum; unsigned int uam_mask=default_uams_mask(); struct option long_options[] = { {"afpversion",1,0,'v'}, {"volumepassword",1,0,'V'}, {"user",1,0,'u'}, {"pass",1,0,'p'}, {"port",1,0,'o'}, {"uam",1,0,'a'}, {"map",1,0,'m'}, {0,0,0,0}, }; if (argc<4) { usage(); return -1; } outgoing_len=sizeof(struct afp_server_mount_request)+1; req = (void *) outgoing_buffer+1; memset(outgoing_buffer,0,outgoing_len); outgoing_buffer[0]=AFP_SERVER_COMMAND_MOUNT; req->url.port=548; req->map=AFP_MAPPING_UNKNOWN; while(1) { optnum++; c = getopt_long(argc,argv,"a:u:m:o:p:v:V:", long_options,&option_index); if (c==-1) break; switch(c) { case 'a': if (strcmp(optarg,"guest")==0) uam_mask=UAM_NOUSERAUTHENT; else uam_mask=uam_string_to_bitmap(optarg); break; case 'm': req->map=map_string_to_num(optarg); break; case 'u': snprintf(req->url.username,AFP_MAX_USERNAME_LEN,"%s",optarg); break; case 'o': req->url.port=strtol(optarg,NULL,10); break; case 'p': snprintf(req->url.password,AFP_MAX_PASSWORD_LEN,"%s",optarg); break; case 'V': snprintf(req->url.volpassword,9,"%s",optarg); break; case 'v': req->url.requested_version=strtol(optarg,NULL,10); break; } } if (strcmp(req->url.password, "-") == 0) { char *p = getpass("AFP Password: "******"%s",p); } if (strcmp(req->url.volpassword, "-") == 0) { char *p = getpass("Password for volume: "); if (p) snprintf(req->url.volpassword,9,"%s",p); } optnum=optind+1; if (optnum>=argc) { printf("No volume or mount point specified\n"); return -1; } if (sscanf(argv[optnum++],"%[^':']:%[^':']", req->url.servername,req->url.volumename)!=2) { printf("Incorrect server:volume specification\n"); return -1; } if (uam_mask==0) { printf("Unknown UAM\n"); return -1; } req->uam_mask=uam_mask; req->volume_options=DEFAULT_MOUNT_FLAGS; if (optnum>=argc) { printf("No mount point specified\n"); return -1; } snprintf(req->mountpoint,255,"%s",argv[optnum++]); return 0; }