/* * The most IMPORTANT function !!! * * added by ikoo for testing -m{-i} optarg * fix me: something to do with cvstmp handling is not perfect. * * int PB_MR_CHECK (void *debug) */ int pb_mrchk (void *debug) { int err = 0; int found_it = 0; unsigned long loglen = 0; char cvstmp[TMPBUFLEN]; CHECK_CALLER (getcaller ()); if (0 == found_it) goto skip_check; sprintf (cvstmp, "[PB]Error MRID or User Name. Please check" " your MR or User Name in CVS"); saved_message = cm_get_sm (); if (saved_message[0] != '-') { error (1, 0, "[PB]Need mrid. Usage:{-i\"{mrid}\"......]}."); return -2; } if (saved_message[1] != 'i') { error (1, 0, "[PB]Need mrid. Usage:{-i\"{mrid}\"......]}."); return -2; } loglen = strlen (saved_message); if (2 > checkquote (saved_message)) { /* error (1, 0, cvstmp); */ error (1, 0, "[PB]Need mrid. Usage:{-i\"{mrid}\"......]}."); return -3; } getmrid (saved_message, mrid); sprintf (cvstmp, "[PB]Error MRID[%s] or User Name. Please check" " your MR or User Name in CVS", mrid); err = querymrid (getcaller (), mrid); if (1 == err) { /* sprintf(cvstmp, "MRID[%s] NOT valid!.", mrid); */ sprintf (cvstmp, "Error MR[%s] Status. Check if the input" " MR is in assigned or deferred status.", mrid); error (1, 0, cvstmp); } else if (0 == err) { sprintf (cvstmp, "MRID[%s] valid.", mrid); error (0, 0, cvstmp); } else { /* err < 0 means net error */ error (1, 0, "!!!Communication error with MR webserver!!!"); } skip_check: return 0; } /* end of added by ikoo */
void main(int argc, char *argv[]) { int len, rcode; char tname[32]; char *err, *ext = ""; unsigned char buf[64*1024], callip[IPaddrlen]; DNSmsg reqmsg, repmsg; Request req; alarm(2*60*1000); cfg.cachedb = 1; ARGBEGIN{ case 'd': debug++; break; case 'f': dbfile = EARGF(usage()); break; case 'r': cfg.resolver = 1; break; case 'R': norecursion = 1; break; case 'x': ext = EARGF(usage()); break; default: usage(); break; }ARGEND if(debug < 2) debug = 0; if(argc > 0) getcaller(argv[0]); cfg.inside = 1; dninit(); snprint(mntpt, sizeof mntpt, "/net%s", ext); if(myipaddr(ipaddr, mntpt) < 0) sysfatal("can't read my ip address"); dnslog("dnstcp call from %s to %I", caller, ipaddr); memset(callip, 0, sizeof callip); parseip(callip, caller); db2cache(1); memset(&req, 0, sizeof req); setjmp(req.mret); req.isslave = 0; procsetname("main loop"); /* loop on requests */ for(;; putactivity(0)){ now = time(nil); memset(&repmsg, 0, sizeof repmsg); len = readmsg(0, buf, sizeof buf); if(len <= 0) break; getactivity(&req, 0); req.aborttime = timems() + S2MS(15*Min); rcode = 0; memset(&reqmsg, 0, sizeof reqmsg); err = convM2DNS(buf, len, &reqmsg, &rcode); if(err){ dnslog("server: input error: %s from %s", err, caller); free(err); break; } if (rcode == 0) { if(reqmsg.qdcount < 1){ dnslog("server: no questions from %s", caller); break; } else if(reqmsg.flags & Fresp){ dnslog("server: reply not request from %s", caller); break; } else if((reqmsg.flags & Omask) != Oquery){ dnslog("server: op %d from %s", reqmsg.flags & Omask, caller); break; } } if(debug) dnslog("[%d] %d: serve (%s) %d %s %s", getpid(), req.id, caller, reqmsg.id, reqmsg.qd->owner->name, rrname(reqmsg.qd->type, tname, sizeof tname)); /* loop through each question */ while(reqmsg.qd) if(reqmsg.qd->type == Taxfr) dnzone(&reqmsg, &repmsg, &req); else { dnserver(&reqmsg, &repmsg, &req, callip, rcode); reply(1, &repmsg, &req); rrfreelist(repmsg.qd); rrfreelist(repmsg.an); rrfreelist(repmsg.ns); rrfreelist(repmsg.ar); } rrfreelist(reqmsg.qd); /* qd will be nil */ rrfreelist(reqmsg.an); rrfreelist(reqmsg.ns); rrfreelist(reqmsg.ar); if(req.isslave){ putactivity(0); _exits(0); } } refreshmain(mntpt); }
int passwd (int argc, char **argv) { int c; int err = 0; char *typed_password = NULL, *typed_password2 = NULL; const char *username, *user; passwd_entry *passnode; char *linebuf = NULL; char *real_user = NULL; char *password_domain = NULL; int adduser=0,deluser=0,disableuser=0,realuser=0,remove_realuser=0,use_domain=0; int arg_specified = 0; if (argc == -1) usage (passwd_usage); optind = 0; while ((c = getopt (argc, argv, "axXr:RD:")) != -1) { switch (c) { case 'a': if(arg_specified) usage (passwd_usage); arg_specified = 1; adduser = 1; break; case 'x': if(arg_specified) usage (passwd_usage); arg_specified = 1; disableuser = 1; break; case 'X': if(arg_specified) usage (passwd_usage); arg_specified = 1; deluser = 1; break; case 'r': realuser = 1; real_user = xstrdup(optarg); break; case 'R': remove_realuser = 1; break; case 'D': use_domain = 1; password_domain = xstrdup(optarg); break; case '?': default: usage (passwd_usage); break; } } argc -= optind; argv += optind; if(!argc) user = NULL; else user=argv[0]; #ifdef CLIENT_SUPPORT if (current_parsed_root->isremote) { if (argc > 1) usage (passwd_usage); if (!supported_request ("passwd")) error (1, 0, "server does not support passwd"); if(!user && adduser) { error(1,0,"You cannot add yourself"); } if(!user && deluser) { error(1,0,"You cannot delete yourself"); } if(user || current_parsed_root->username || current_parsed_root->hostname) { printf ("%s %s@%s\n", (adduser) ? "Adding user" : (deluser) ? "Deleting user" : "Changing repository password for", user?user:current_parsed_root->username?current_parsed_root->username:getcaller(),current_parsed_root->hostname); } else { printf ("Changing repository password for %s\n",getcaller()); } fflush (stdout); if(!use_domain && !deluser && !disableuser) { typed_password = getpass ("New password: "******"Verify password: "******"Passwords do not match, try again"); } memset (typed_password2, 0, strlen (typed_password2)); typed_password = xrealloc(typed_password, strlen(typed_password) +32); if(strlen(typed_password)) crypt_password(typed_password); } if (adduser) send_arg ("-a"); if (disableuser) send_arg ("-x"); if (deluser) send_arg ("-X"); if (realuser) { send_arg ("-r"); send_arg (real_user); } if (remove_realuser) send_arg ("-R"); if(use_domain) { send_arg ("-D"); send_arg (password_domain); } if (argc == 1) send_arg(user); else send_arg("*"); if(typed_password) { send_arg (typed_password); /* Send the new password */ memset (typed_password, 0, strlen (typed_password)); xfree (typed_password); } send_to_server ("passwd\012", 0); return get_responses_and_close (); } if(!server_active) #endif { if(argc!=0 && argc!=1) usage (passwd_usage); if(!user && adduser) { error(1,0,"You cannot add yourself"); } if(!user && deluser) { error(1,0,"You cannot delete yourself"); } if(user || current_parsed_root->username) { printf ("%s %s\n", (adduser) ? "Adding user" : (deluser) ? "Deleting user" : "Changing password for", user?user:current_parsed_root->username); } else { printf ("Changing repository password for %s\n",getcaller()); } fflush (stdout); if (argc == 0) username = CVS_Username; else { username = user; } if(!use_domain && !deluser && !disableuser) { typed_password = getpass ("New password: "******"Verify password: "******"Passwords do not match, try again"); } memset (typed_password2, 0, strlen (typed_password2)); typed_password = xrealloc(typed_password, strlen(typed_password) +32); if(strlen(typed_password)) crypt_password(typed_password); } } #ifdef SERVER_SUPPORT if(server_active) { if ((argc != 1) && (argc != 2)) usage (passwd_usage); if(!strcmp(user,"*")) username = CVS_Username; else { username = user; #if defined(_WIN32) #ifdef SJIS if(_mbschr(username,'\\') && !isDomainMember()) #else if(strchr(username,'\\') && !isDomainMember()) #endif { error(1,0,"CVS server is not acting as a domain member - cannot specify domains"); } #endif } if(argc==2) typed_password = argv[1]; } #endif if (typed_password && (strcmp(username, CVS_Username) != 0) && (! verify_admin ())) error (1, 0, "Only administrators can add or change another's password"); read_passwd_list(); passnode = find_passwd_entry(username); if (passnode == NULL) { if (!adduser) error (1, 0, "Could not find %s in password file", username); if (! verify_admin()) { error (1, 0, "Only administrators can add users" ); } passnode = new_passwd_entry(); passnode->username=xstrdup(username); passnode->password=xstrdup(typed_password); passnode->real_username=NULL; } if(deluser) { if (! verify_admin()) { error (1, 0, "Only administrators can delete users" ); } xfree(passnode->username); passnode->username = NULL; } else if(disableuser) { if (! verify_admin()) { error (1, 0, "Only administrators can disable users" ); } xfree(passnode->password); passnode->password=xstrdup("#DISABLED#"); } else { xfree(passnode->password); #ifdef _WIN32 /* Unix servers can't make any sense of this */ if(use_domain) { passnode->password = xmalloc(strlen(password_domain)+2); strcpy(passnode->password,"!"); strcat(passnode->password,password_domain); } else #endif passnode->password = xstrdup(typed_password); if(realuser) { if(!getpwnam(real_user)) error(1, 0, "User '%s' is not a real user on the system.",real_user); xfree(passnode->real_username); passnode->real_username = xstrdup(real_user); } else if (remove_realuser) { xfree(passnode->real_username); passnode->real_username=NULL; } if((passnode->real_username && !getpwnam(passnode->real_username)) || (!passnode->real_username && passnode->username && !getpwnam(passnode->username))) { error(0,0,"*WARNING* CVS user '%s' will not be able to log in until they are aliased to a valid system user.",username); } } write_passwd_list(); free_passwd_list(); xfree(real_user); xfree(password_domain); return (err); }
/* An empty LogHistory string in CVSROOT/config will turn logging off. */ void history_write (int type, const char *update_dir, const char *revs, const char *name, const char *repository) { const char *fname; char *workdir; char *username = getcaller (); int fd; char *line; char *slash = "", *cp; const char *cp2, *repos; int i; static char *tilde = ""; static char *PrCurDir = NULL; time_t now; if (logoff) /* History is turned off by noexec or * readonlyfs. */ return; if (!strchr (config->logHistory, type)) return; if (nolock) goto out; repos = Short_Repository (repository); if (!PrCurDir) { char *pwdir; pwdir = get_homedir (); PrCurDir = CurDir; if (pwdir != NULL) { /* Assumes neither CurDir nor pwdir ends in '/' */ i = strlen (pwdir); if (!strncmp (CurDir, pwdir, i)) { PrCurDir += i; /* Point to '/' separator */ tilde = "~"; } else { /* Try harder to find a "homedir" */ struct saved_cwd cwd; char *homedir; if (save_cwd (&cwd)) error (1, errno, "Failed to save current directory."); if (CVS_CHDIR (pwdir) < 0 || (homedir = xgetcwd ()) == NULL) homedir = pwdir; if (restore_cwd (&cwd)) error (1, errno, "Failed to restore current directory, `%s'.", cwd.name); free_cwd (&cwd); i = strlen (homedir); if (!strncmp (CurDir, homedir, i)) { PrCurDir += i; /* Point to '/' separator */ tilde = "~"; } if (homedir != pwdir) free (homedir); } } } if (type == 'T') { repos = update_dir; update_dir = ""; } else if (update_dir && *update_dir) slash = "/"; else update_dir = ""; workdir = Xasprintf ("%s%s%s%s", tilde, PrCurDir, slash, update_dir); /* * "workdir" is the directory where the file "name" is. ("^~" == $HOME) * "repos" is the Repository, relative to $CVSROOT where the RCS file is. * * "$workdir/$name" is the working file name. * "$CVSROOT/$repos/$name,v" is the RCS file in the Repository. * * First, note that the history format was intended to save space, not * to be human readable. * * The working file directory ("workdir") and the Repository ("repos") * usually end with the same one or more directory elements. To avoid * duplication (and save space), the "workdir" field ends with * an integer offset into the "repos" field. This offset indicates the * beginning of the "tail" of "repos", after which all characters are * duplicates. * * In other words, if the "workdir" field has a '*' (a very stupid thing * to put in a filename) in it, then every thing following the last '*' * is a hex offset into "repos" of the first character from "repos" to * append to "workdir" to finish the pathname. * * It might be easier to look at an example: * * M273b3463|dgg|~/work*9|usr/local/cvs/examples|1.2|loginfo * * Indicates that the workdir is really "~/work/cvs/examples", saving * 10 characters, where "~/work*d" would save 6 characters and mean that * the workdir is really "~/work/examples". It will mean more on * directories like: usr/local/gnu/emacs/dist-19.17/lisp/term * * "workdir" is always an absolute pathname (~/xxx is an absolute path) * "repos" is always a relative pathname. So we can assume that we will * never run into the top of "workdir" -- there will always be a '/' or * a '~' at the head of "workdir" that is not matched by anything in * "repos". On the other hand, we *can* run off the top of "repos". * * Only "compress" if we save characters. */ cp = workdir + strlen (workdir) - 1; cp2 = repos + strlen (repos) - 1; for (i = 0; cp2 >= repos && cp > workdir && *cp == *cp2--; cp--) i++; if (i > 2) { i = strlen (repos) - i; (void) sprintf ((cp + 1), "*%x", i); } if (!revs) revs = ""; now = time (NULL); line = Xasprintf ("%c%08lx|%s|%s|%s|%s|%s\n", type, (long) now, username, workdir, repos, revs, name); fname = get_history_log_name (now); if (!history_lock (current_parsed_root->directory)) /* history_lock() will already have printed an error on failure. */ goto out; fd = CVS_OPEN (fname, O_WRONLY | O_APPEND | O_CREAT | OPEN_BINARY, 0666); if (fd < 0) { if (!really_quiet) error (0, errno, "warning: cannot open history file `%s' for write", fname); goto out; } TRACE (TRACE_FUNCTION, "open (`%s', a)", fname); /* Lessen some race conditions on non-Posix-compliant hosts. * * FIXME: I'm guessing the following was necessary for NFS when multiple * simultaneous writes to the same file are possible, since NFS does not * natively support append mode and it must be emulated via lseek(). Now * that the history file is locked for write, the following lseek() may be * unnecessary. */ if (lseek (fd, (off_t) 0, SEEK_END) == -1) error (1, errno, "cannot seek to end of history file: %s", fname); if (write (fd, line, strlen (line)) < 0) error (1, errno, "cannot write to history file: %s", fname); free (line); if (close (fd) != 0) error (1, errno, "cannot close history file: %s", fname); free (workdir); out: clear_history_lock (); }
int history (int argc, char **argv) { int i, c; const char *fname = NULL; List *flist; if (argc == -1) usage (history_usg); since_rev = xstrdup (""); since_tag = xstrdup (""); backto = xstrdup (""); rec_types = xstrdup (""); getoptreset (); while ((c = getopt (argc, argv, "+Tacelow?D:b:f:m:n:p:r:t:u:x:X:z:")) != -1) { switch (c) { case 'T': /* Tag list */ report_count++; tag_report++; break; case 'a': /* For all usernames */ all_users++; break; case 'c': report_count++; modified = 1; break; case 'e': report_count++; extract_all++; free (rec_types); rec_types = xstrdup (ALL_HISTORY_REC_TYPES); break; case 'l': /* Find Last file record */ last_entry = 1; break; case 'o': report_count++; v_checkout = 1; break; case 'w': /* Match Working Dir (CurDir) fields */ working = 1; break; case 'X': /* Undocumented debugging flag */ #ifdef DEBUG fname = optarg; #endif break; case 'D': /* Since specified date */ if (*since_rev || *since_tag || *backto) { error (0, 0, "date overriding rev/tag/backto"); *since_rev = *since_tag = *backto = '\0'; } since_date = Make_Date (optarg); break; case 'b': /* Since specified file/Repos */ if (since_date || *since_rev || *since_tag) { error (0, 0, "backto overriding date/rev/tag"); *since_rev = *since_tag = '\0'; if (since_date != NULL) free (since_date); since_date = NULL; } free (backto); backto = xstrdup (optarg); break; case 'f': /* For specified file */ save_file (NULL, optarg, NULL); break; case 'm': /* Full module report */ if (!module_report++) report_count++; /* fall through */ case 'n': /* Look for specified module */ save_module (optarg); break; case 'p': /* For specified directory */ save_file (optarg, NULL, NULL); break; case 'r': /* Since specified Tag/Rev */ if (since_date || *since_tag || *backto) { error (0, 0, "rev overriding date/tag/backto"); *since_tag = *backto = '\0'; if (since_date != NULL) free (since_date); since_date = NULL; } free (since_rev); since_rev = xstrdup (optarg); break; case 't': /* Since specified Tag/Rev */ if (since_date || *since_rev || *backto) { error (0, 0, "tag overriding date/marker/file/repos"); *since_rev = *backto = '\0'; if (since_date != NULL) free (since_date); since_date = NULL; } free (since_tag); since_tag = xstrdup (optarg); break; case 'u': /* For specified username */ save_user (optarg); break; case 'x': report_count++; extract++; { char *cp; for (cp = optarg; *cp; cp++) if (!strchr (ALL_HISTORY_REC_TYPES, *cp)) error (1, 0, "%c is not a valid report type", *cp); } free (rec_types); rec_types = xstrdup (optarg); break; case 'z': tz_local = (optarg[0] == 'l' || optarg[0] == 'L') && (optarg[1] == 't' || optarg[1] == 'T') && !optarg[2]; if (tz_local) tz_name = optarg; else { /* * Convert a known time with the given timezone to time_t. * Use the epoch + 23 hours, so timezones east of GMT work. */ struct timespec t; char *buf = Xasprintf ("1/1/1970 23:00 %s", optarg); if (get_date (&t, buf, NULL)) { /* * Convert to seconds east of GMT, removing the * 23-hour offset mentioned above. */ tz_seconds_east_of_GMT = (time_t)23 * 60 * 60 - t.tv_sec; tz_name = optarg; } else error (0, 0, "%s is not a known time zone", optarg); free (buf); } break; case '?': default: usage (history_usg); break; } } argc -= optind; argv += optind; for (i = 0; i < argc; i++) save_file (NULL, argv[i], NULL); /* ================ Now analyze the arguments a bit */ if (!report_count) v_checkout++; else if (report_count > 1) error (1, 0, "Only one report type allowed from: \"-Tcomxe\"."); #ifdef CLIENT_SUPPORT if (current_parsed_root->isremote) { struct file_list_str *f1; char **mod; /* We're the client side. Fire up the remote server. */ start_server (); ign_setup (); if (tag_report) send_arg ("-T"); if (all_users) send_arg ("-a"); if (modified) send_arg ("-c"); if (last_entry) send_arg ("-l"); if (v_checkout) send_arg ("-o"); if (working) send_arg ("-w"); if (fname) option_with_arg ("-X", fname); if (since_date) client_senddate (since_date); if (backto[0] != '\0') option_with_arg ("-b", backto); for (f1 = file_list; f1 < &file_list[file_count]; ++f1) { if (f1->l_file[0] == '*') option_with_arg ("-p", f1->l_file + 1); else option_with_arg ("-f", f1->l_file); } if (module_report) send_arg ("-m"); for (mod = mod_list; mod < &mod_list[mod_count]; ++mod) option_with_arg ("-n", *mod); if (*since_rev) option_with_arg ("-r", since_rev); if (*since_tag) option_with_arg ("-t", since_tag); for (mod = user_list; mod < &user_list[user_count]; ++mod) option_with_arg ("-u", *mod); if (extract_all) send_arg ("-e"); if (extract) option_with_arg ("-x", rec_types); option_with_arg ("-z", tz_name); send_to_server ("history\012", 0); return get_responses_and_close (); } #endif if (all_users) save_user (""); if (mod_list) expand_modules (); if (tag_report) { if (!strchr (rec_types, 'T')) { rec_types = xrealloc (rec_types, strlen (rec_types) + 5); (void) strcat (rec_types, "T"); } } else if (extract || extract_all) { if (user_list) user_sort++; } else if (modified) { free (rec_types); rec_types = xstrdup ("MAR"); /* * If the user has not specified a date oriented flag ("Since"), sort * by Repository/file before date. Default is "just" date. */ if (last_entry || (!since_date && !*since_rev && !*since_tag && !*backto)) { repos_sort++; file_sort++; /* * If we are not looking for last_modified and the user specified * one or more users to look at, sort by user before filename. */ if (!last_entry && user_list) user_sort++; } } else if (module_report) { free (rec_types); rec_types = xstrdup (last_entry ? "OMAR" : ALL_HISTORY_REC_TYPES); module_sort++; repos_sort++; file_sort++; working = 0; /* User's workdir doesn't count here */ } else /* Must be "checkout" or default */ { free (rec_types); rec_types = xstrdup ("OF"); /* See comments in "modified" above */ if (!last_entry && user_list) user_sort++; if (last_entry || (!since_date && !*since_rev && !*since_tag && !*backto)) file_sort++; } /* If no users were specified, use self (-a saves a universal ("") user) */ if (!user_list) save_user (getcaller ()); /* If we're looking back to a Tag value, must consider "Tag" records */ if (*since_tag && !strchr (rec_types, 'T')) { rec_types = xrealloc (rec_types, strlen (rec_types) + 5); (void) strcat (rec_types, "T"); } if (fname) { Node *p; flist = getlist (); p = getnode (); p->type = FILES; p->key = Xasprintf ("%s/%s/%s", current_parsed_root->directory, CVSROOTADM, fname); addnode (flist, p); } else { char *pat; if (config->HistorySearchPath) pat = config->HistorySearchPath; else pat = Xasprintf ("%s/%s/%s", current_parsed_root->directory, CVSROOTADM, CVSROOTADM_HISTORY); flist = find_files (NULL, pat); if (pat != config->HistorySearchPath) free (pat); } read_hrecs (flist); if (hrec_count > 0) qsort (hrec_head, hrec_count, sizeof (struct hrec), sort_order); report_hrecs (); if (since_date != NULL) free (since_date); free (since_rev); free (since_tag); free (backto); free (rec_types); return 0; }
static void set_acl(CXmlNodePtr base) { CXmlNodePtr acl, acl_to_set = NULL; acl = fileattr_find(base,"acl"); while(acl) { const char *user = fileattr_getvalue(acl,"@user"); const char *branch = fileattr_getvalue(acl,"@branch"); const char *merge = fileattr_getvalue(acl,"@merge"); if(((!user && !parms.user) || (user && parms.user && !usercmp(user,parms.user))) && ((!branch && !parms.branch) || (branch && parms.branch && !strcmp(branch,parms.branch))) && ((!merge && !parms.merge) || (merge && parms.merge && !strcmp(merge,parms.merge)))) { acl_to_set = acl; break; } acl = fileattr_next(acl); } if(acl_to_set) fileattr_batch_delete(acl_to_set); if(!parms.del) { char *parm = xstrdup(parms.access); char *acc = parm?strtok(parm,","):NULL; base->NewNode("acl"); fileattr_modified(); if(parms.user) base->NewAttribute("user",parms.user); if(parms.branch) base->NewAttribute("branch",parms.branch); if(parms.merge) base->NewAttribute("merge",parms.merge); if(parms.priority && atoi(parms.priority)) base->NewAttribute("priority",parms.priority); if(parms.message) base->NewNode("message",parms.message,false); base->NewNode("modified_by",getcaller(),false); base->NewNode("modified_date",current_date,false); while(acc) { int deny=0; if(!strncmp(acc,"no",2) && strcmp(acc,"none")) { deny=1; acc+=2; } if(!strcmp(acc,"all")) set_attrs(base,"all",deny,parms.noinherit); else if(!strcmp(acc,"none")) set_attrs(base,"all",!deny,parms.noinherit); else if(!strcmp(acc,"read")) set_attrs(base,"read",deny,parms.noinherit); else if(!strcmp(acc,"write")) set_attrs(base,"write",deny,parms.noinherit); else if(!strcmp(acc,"create")) set_attrs(base,"create",deny,parms.noinherit); else if(!strcmp(acc,"tag")) set_attrs(base,"tag",deny,parms.noinherit); else if(!strcmp(acc,"control")) set_attrs(base,"control",deny,parms.noinherit); else error(1,0,"Invalid access control attribute '%s'",acc); acc = strtok(NULL,","); } base->GetParent(); fileattr_prune(base); xfree(parm); } else { if(acl_to_set) fileattr_prune(acl_to_set); } }
/* Expand variable NAME into its contents, per the rules above. * * CVSROOT is used to expanding $CVSROOT. * * RETURNS * A pointer to the requested variable contents or NULL when the requested * variable is not found. * * ERRORS * None, though this function may generate warning messages when NAME is not * found. */ static const char * expand_variable (const char *name, const char *cvsroot, const char *file, int line) { if (!strcmp (name, CVSROOT_ENV)) return cvsroot; else if (!strcmp (name, "RCSBIN")) { error (0, 0, "RCSBIN internal variable is no longer supported"); return NULL; } else if (!strcmp (name, EDITOR1_ENV)) return Editor; else if (!strcmp (name, EDITOR2_ENV)) return Editor; else if (!strcmp (name, EDITOR3_ENV)) return Editor; else if (!strcmp (name, "USER")) return getcaller (); else if (!strcmp (name, "SESSIONID") || !strcmp (name, "COMMITID")) return global_session_id; else if (isalpha (name[0])) { /* These names are reserved for future versions of CVS, so that is why it is an error. */ if (line) error (0, 0, "%s:%d: no such internal variable $%s", file, line, name); else error (0, 0, "%s: no such internal variable $%s", file, name); return NULL; } else if (name[0] == '=') { Node *node; /* Crazy syntax for a user variable. But we want *something* that lets the user name a user variable anything he wants, without interference from (existing or future) internal variables. */ node = findnode (variable_list, name + 1); if (!node) { if (line) error (0, 0, "%s:%d: no such user variable ${%s}", file, line, name); else error (0, 0, "%s: no such user variable ${%s}", file, name); return NULL; } return node->data; } else { /* It is an unrecognized character. We return an error to reserve these for future versions of CVS; it is plausible that various crazy syntaxes might be invented for inserting information about revisions, branches, etc. */ if (line) error (0, 0, "%s:%d: unrecognized variable syntax %s", file, line, name); else error (0, 0, "%s: unrecognized variable syntax %s", file, name); return NULL; } }