📄 adv.c
字号:
if ((clist = (char **)malloc(NUM_MACHS * sizeof(char *))) == NULL) { fprintf(stderr,"%s: cannot allocate memory for client list\n",cmd); exit(1); } /* * If the alias table exists, replace names defined * as aliases, or else assume the names to be * valid client names and form a client list. */ while ((clname = clients[index]) != NULL) { if (*clname == '\0' || verify(clname)) { clients[index++][0] = '\0'; continue; } if (aflag && isalias(clname,altptr)) { old_pos = pos; search_atbl(clname,aliases); if (old_pos == pos) clients[index][0] = '\0'; } else { if (!invalid(clname) && !in_clist(clname)) add_client(clname); else clients[index][0] = '\0'; } index++; } if (pos == (low_index + NUM_MACHS)) alloc_mem(); clist[pos] = NULL;}staticisalias(name,altbl)char *name;struct altab *altbl;{ register int i; for (i = 0; i < aliases; i++) { if (strcmp(name,altbl->alname) == SAME) return(1); altbl++; } return(0);}staticsearch_atbl(name,index)char *name;int index;{ register int i, level; register char *list, *curr_pos; char *realloc(); char buffer[SZ_CLIENT + 1]; struct altab *altbl; /* * Search the alias table to determine if "name" is an * alias. If it is an alias obtain its corresponding * list of names, and determine if they are aliases by * searching preceding entries in the alias table. This * is done to eliminate loops. When "name" is no longer * an alias copy it into the client list. */ altbl = altptr; level = 0; for (i = 0; i < index; i++) { if (strcmp(name,altbl->alname) == SAME) { list = altbl->alist; curr_pos = strpbrk(list," \t"); while (curr_pos != NULL) { if (curr_pos-list <= SZ_CLIENT) { strncpy(buffer,list,curr_pos-list); buffer[curr_pos-list] = '\0'; search_atbl(buffer,level); } else { *curr_pos = '\0'; fprintf(stderr,"%s: client/alias name <%s> exceeds <%d> characters, ignored\n",cmd,list,SZ_CLIENT); *curr_pos = ' '; } list = curr_pos + strspn(curr_pos," \t"); curr_pos = strpbrk(list," \t"); } if (*list == '\0') return; if (strlen(list) <= SZ_CLIENT) { strcpy(buffer,list); search_atbl(buffer,level); } else fprintf(stderr,"%s: client/alias name <%s> exceeds <%d> characters, ignored\n",cmd,list,SZ_CLIENT); return; } else { level++; altbl++; } } if (!invalid(name) && !in_clist(name)) add_client(name); return;}staticin_clist(name)char *name;{ register int i; for (i = 0; i < pos; i++) { if (strcmp(name,clist[i]) == SAME) return(1); } return(0);}staticadd_client(name)char *name;{ if (pos == (low_index + NUM_MACHS)) alloc_mem(); if ((clist[pos] = malloc((unsigned)strlen(name)+1)) == NULL ) { fprintf(stderr,"%s: cannot allocate memory for client list\n",cmd); exit(1); } strcpy(clist[pos++],name);}staticverify(name)char *name;{ register char *chr; if (strlen(name) > SZ_CLIENT) { fprintf(stderr,"%s: client/alias name <%s> exceeds <%d> characters, ignored\n",cmd,name,SZ_CLIENT); return(1); } chr = name; while (*chr != '\0') { if (!isprint(*chr)) { fprintf(stderr,"%s: client/alias name <%s> contains non-printable characters, ignored\n",cmd,name); return(1); } chr++; } return(0);}staticalloc_mem(){ char *realloc(); if ((clist = (char **)realloc((char *)clist,(NUM_MACHS + pos) * sizeof (char *))) == NULL) { fprintf(stderr,"%s: cannot allocate memory for client list\n",cmd); exit(1); } low_index = pos;}staticinvalid(name)char *name;{ char *mach; char *domain; int qname = 0, dname = 0; if (name[strlen(name)-1] == SEPARATOR) dname = 1; if (*(domain = dompart(name)) != '\0') { qname = 1; if (strlen(domain) > SZ_DELEMENT) { fprintf(stderr,"%s: domain name %s<%s> exceeds <%d> characters, ignored\n",cmd,dname ? "":"in ",name,SZ_DELEMENT); return(1); } if (v_dname(domain) != 0) { fprintf(stderr,"%s: domain name %s<%s> contains invalid characters, ignored\n",cmd,dname ? "":"in ",name); return(1); } } if (*(mach = namepart(name)) != '\0') { if (strlen(mach) > SZ_MACH) { fprintf(stderr,"%s: nodename %s<%s> exceeds <%d> characters, ignored\n",cmd,qname ? "in ":"",name,SZ_MACH); return(1); } if (v_uname(mach) != 0) { fprintf(stderr,"%s: nodename %s<%s> contains invalid characters, ignored\n",cmd,qname ? "in ":"",name); return(1); } } return(0);}staticupdate_entry(res,path,desc,rflag,clients)short rflag;char *res, *path, *desc;char *clients[];{ register FILE *fp, *fp1; int index = 0; char advbuf[BUFSIZE], buf[BUFSIZE]; if ((fp = fopen(ADVFILE, "r")) == NULL) { add_entry(res,path,desc,rflag,clients); return; } /* * Update the client and/or description * fields of an existing entry. */ stat(ADVFILE,&stbuf); if ((fp1 = fopen(TEMPADV, "w")) == NULL) { fprintf(stderr,"%s: cannot create temporary advertise file <%s>\n",cmd,TEMPADV); exit(1); } while (fgets(advbuf,BUFSIZE,fp)) { get_data(advbuf); if (strcmp(res,fieldv[0]) == SAME) { fprintf(fp1,"%s %s",res,fieldv[1]); if (dflag) fprintf(fp1," \"%s\"",desc); fprintf(fp1," %s ",fieldv[2]); strncpy(buf, fieldv[3], strlen(fieldv[3])-1); strcpy(fieldv[3], buf); fprintf(fp1," %s ",fieldv[3]); if (clients[index] == NULL) fprintf(fp1," %s",fieldv[4]); else { while (clients[index] != NULL) { if (clients[index][0] != '\0') fprintf(fp1," %s",clients[index]); index++; } fprintf(fp1,"\n"); } } else fprintf(fp1,"%s %s %s %s %s",fieldv[0],fieldv[1],fieldv[2],fieldv[3],fieldv[4]); } fclose(fp); fclose(fp1); unlink(ADVFILE); link(TEMPADV,ADVFILE); chmod(ADVFILE,MASK); chown(ADVFILE,(int)stbuf.st_uid,(int)stbuf.st_gid); unlink(TEMPADV);}staticadd_entry(res,path,desc,rflag,clients)short rflag;char *res, *path, *desc;char *clients[];{ register FILE *fp; char *comment = "unrestricted"; int index = 0; if ((fp = fopen(ADVFILE, "a")) == NULL) { fprintf(stderr,"%s: cannot open <%s>\n",cmd,ADVFILE); exit(1); } fprintf(fp,"%s %s \"%s\" %s",res,path,desc,flg[rflag]); if (clients[index] == NULL) fprintf(fp," %s",comment); else { while (clients[index] != NULL) { if (clients[index][0] != '\0') fprintf(fp," %s",clients[index]); index++; } } fprintf(fp,"\n"); fclose(fp);}staticget_data(s)char *s;{ register int fieldc = 0; /* * This function parses an advertise entry from * /etc/advtab and sets the pointers appropriately. */ while ((*s != '\n') && (*s != '\0') && (fieldc < 4)) { while (isspace(*s)) s++; fieldv[fieldc++] = s; if (fieldc == 3) { /* * Now obtain the description associated with * the resource. */ s = strpbrk(s + 1,"\""); *(++s) = '\0'; s++; while (isspace(*s)) s++; fieldv[fieldc] = s; break; } while (!isspace(*s)) s++; *(s++) = '\0'; }}staticns_adv(req_type,path,res,desc,roflg,namelist)short req_type, roflg;char *path, *res, *desc;char **namelist;{ struct nssend send; struct nssend *ns_getblock(); /* * Initialize structure with information to be sent * to the name server. */ send.ns_code = req_type; send.ns_type = 1; send.ns_flag = roflg; send.ns_name = res; send.ns_path = path; send.ns_desc = desc; send.ns_mach = namelist; /* * Send the structure using the name server function * ns_getblock(). */ if (ns_getblock(&send) == NULL) return(RFS_FAILURE); return(RFS_SUCCESS);} staticrpterr(res,dir)char *res;char *dir;{ switch(errno) { case EPERM: fprintf(stderr,"%s: must be super-user\n",cmd); break; case ENOENT: fprintf(stderr,"%s: <%s> no such file or directory\n",cmd,dir); break; case ENONET: fprintf(stderr,"%s: machine not on the network\n",cmd); break; case ENOTDIR: fprintf(stderr,"%s: <%s> not a directory\n",cmd,dir); break; case EREMOTE: fprintf(stderr,"%s: <%s> is remote\n",cmd,dir); break; case EADV: fprintf(stderr,"%s: <%s> already advertised\n",cmd,dir); break; case EROFS: fprintf(stderr,"%s: <%s> write-protected\n",cmd,dir); break; case EINTR: fprintf(stderr,"%s: system call interrupted\n",cmd); break; case EBUSY: fprintf(stderr,"%s: resource <%s> currently advertises a different directory\n",cmd,res); break; case EEXIST: fprintf(stderr,"%s: re-advertise error: <%s> was originally advertised under\n a different resource name\n",cmd,dir); break; case ENOSPC: fprintf(stderr,"%s: advertise table overflow\n",cmd); break; case EINVAL: fprintf(stderr,"%s: invalid resource name\n",cmd); break; case EFAULT: fprintf(stderr,"%s: bad user address\n",cmd); break; case ENOMEM: fprintf(stderr,"%s: not enough memory\n",cmd); break; case ENODEV: fprintf(stderr,"%s: <%s> not advertised\n",cmd,res); break; case ESRMNT: fprintf(stderr,"%s: re-advertise error: a client that is not in the specified\n client list currently has <%s> mounted\n",cmd,res); break; case EACCES: fprintf(stderr,"%s: re-advertise error: resource <%s> originally advertised\n with different permissions\n",cmd,res); break; default: fprintf(stderr,"%s: errno <%d>, cannot advertise <%s>\n",cmd,errno,res); break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -