[BACK]Return to admin.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / cvs

Diff for /src/usr.bin/cvs/admin.c between version 1.15 and 1.16

version 1.15, 2005/05/24 04:12:25 version 1.16, 2005/05/25 10:23:57
Line 35 
Line 35 
 #include <unistd.h>  #include <unistd.h>
 #include <string.h>  #include <string.h>
   
   #include "rcs.h"
 #include "cvs.h"  #include "cvs.h"
 #include "log.h"  #include "log.h"
 #include "proto.h"  #include "proto.h"
Line 50 
Line 51 
   
 static int cvs_admin_init     (struct cvs_cmd *, int, char **, int *);  static int cvs_admin_init     (struct cvs_cmd *, int, char **, int *);
 static int cvs_admin_pre_exec (struct cvsroot *);  static int cvs_admin_pre_exec (struct cvsroot *);
 static int cvs_admin_file     (CVSFILE *, void *);  static int cvs_admin_remote   (CVSFILE *, void *);
   static int cvs_admin_local    (CVSFILE *, void *);
   
 struct cvs_cmd cvs_cmd_admin = {  struct cvs_cmd cvs_cmd_admin = {
         CVS_OP_ADMIN, CVS_REQ_ADMIN, "admin",          CVS_OP_ADMIN, CVS_REQ_ADMIN, "admin",
Line 62 
Line 64 
         CF_SORT | CF_IGNORE | CF_RECURSE,          CF_SORT | CF_IGNORE | CF_RECURSE,
         cvs_admin_init,          cvs_admin_init,
         cvs_admin_pre_exec,          cvs_admin_pre_exec,
         cvs_admin_file,          cvs_admin_remote,
         cvs_admin_file,          cvs_admin_local,
         NULL,          NULL,
         NULL,          NULL,
         CVS_CMD_ALLOWSPEC | CVS_CMD_SENDDIR | CVS_CMD_SENDARGS2          CVS_CMD_ALLOWSPEC | CVS_CMD_SENDDIR | CVS_CMD_SENDARGS2
Line 72 
Line 74 
 static char *q, *Ntag, *ntag, *comment, *replace_msg;  static char *q, *Ntag, *ntag, *comment, *replace_msg;
 static char *alist, *subst, *lockrev_arg, *unlockrev_arg;  static char *alist, *subst, *lockrev_arg, *unlockrev_arg;
 static char *state, *userfile, *branch_arg, *elist, *range;  static char *state, *userfile, *branch_arg, *elist, *range;
 static int runflags, kflag, lockrev, strictlock;  static int runflags, kflag, lockrev, lkmode;
   
   /* flag as invalid */
   static int kflag = RCS_KWEXP_ERR;
   static int lkmode = RCS_LOCK_INVAL;
   
 static int  static int
 cvs_admin_init(struct cvs_cmd *cmd, int argc, char **argv, int *arg)  cvs_admin_init(struct cvs_cmd *cmd, int argc, char **argv, int *arg)
 {  {
         int ch;          int ch;
         RCSNUM *rcs;          RCSNUM *rcs;
   
         runflags = strictlock = lockrev = 0;          runflags = lockrev = 0;
         Ntag = ntag = comment = replace_msg = NULL;          Ntag = ntag = comment = replace_msg = NULL;
         state = alist = subst = elist = lockrev_arg = NULL;          state = alist = subst = elist = lockrev_arg = NULL;
         range = userfile = branch_arg = unlockrev_arg = NULL;          range = userfile = branch_arg = unlockrev_arg = NULL;
Line 126 
Line 132 
                                 lockrev_arg = optarg;                                  lockrev_arg = optarg;
                         break;                          break;
                 case 'L':                  case 'L':
                         strictlock |= LOCK_SET;                          lkmode = RCS_LOCK_STRICT;
                         break;                          break;
                 case 'm':                  case 'm':
                         replace_msg = optarg;                          replace_msg = optarg;
Line 154 
Line 160 
                                 unlockrev_arg = optarg;                                  unlockrev_arg = optarg;
                         break;                          break;
                 case 'U':                  case 'U':
                         strictlock |= LOCK_REMOVE;                          if (lkmode != RCS_LOCK_INVAL) {
                                   cvs_log(LP_ERR, "-L and -U are incompatible");
                                   return (CVS_EX_USAGE);
                           }
                           lkmode = RCS_LOCK_LOOSE;
                         break;                          break;
                 default:                  default:
                         return (CVS_EX_USAGE);                          return (CVS_EX_USAGE);
Line 164 
Line 174 
         argc -= optind;          argc -= optind;
         argv += optind;          argv += optind;
   
         /* do some sanity checking on the arguments */  
         if ((strictlock & LOCK_SET) && (strictlock & LOCK_REMOVE)) {  
                 cvs_log(LP_ERR, "-L and -U are incompatible");  
                 return (CVS_EX_USAGE);  
         }  
   
         if (lockrev_arg != NULL) {          if (lockrev_arg != NULL) {
                 if ((rcs = rcsnum_parse(lockrev_arg)) == NULL) {                  if ((rcs = rcsnum_parse(lockrev_arg)) == NULL) {
                         cvs_log(LP_ERR, "%s is not a numeric branch",                          cvs_log(LP_ERR, "%s is not a numeric branch",
Line 210 
Line 214 
 static int  static int
 cvs_admin_pre_exec(struct cvsroot *root)  cvs_admin_pre_exec(struct cvsroot *root)
 {  {
           if (root->cr_method == CVS_METHOD_LOCAL)
                   return (0);
   
         if ((alist != NULL) && ((cvs_sendarg(root, "-a", 0) < 0) ||          if ((alist != NULL) && ((cvs_sendarg(root, "-a", 0) < 0) ||
             (cvs_sendarg(root, alist, 0) < 0)))              (cvs_sendarg(root, alist, 0) < 0)))
                 return (CVS_EX_PROTO);                  return (CVS_EX_PROTO);
Line 255 
Line 262 
                         return (CVS_EX_PROTO);                          return (CVS_EX_PROTO);
         }          }
   
         if ((strictlock & LOCK_SET) &&          if ((lkmode == RCS_LOCK_STRICT) && (cvs_sendarg(root, "-L", 0) < 0))
             (cvs_sendarg(root, "-L", 0) < 0))  
                 return (CVS_EX_PROTO);                  return (CVS_EX_PROTO);
           else if ((lkmode == RCS_LOCK_LOOSE) && (cvs_sendarg(root, "-U", 0) < 0))
                   return (CVS_EX_PROTO);
   
         if ((replace_msg != NULL) && ((cvs_sendarg(root, "-m", 0) < 0)          if ((replace_msg != NULL) && ((cvs_sendarg(root, "-m", 0) < 0)
             || (cvs_sendarg(root, replace_msg, 0) < 0)))              || (cvs_sendarg(root, replace_msg, 0) < 0)))
Line 287 
Line 295 
                         return (CVS_EX_PROTO);                          return (CVS_EX_PROTO);
         }          }
   
         if ((strictlock & LOCK_REMOVE) &&  
             (cvs_sendarg(root, "-U", 0) < 0))  
                 return (CVS_EX_PROTO);  
   
         return (0);          return (0);
 }  }
   
 /*  /*
  * cvs_admin_file()   * cvs_admin_remote()
  *   *
  * Perform admin commands on each file.   * Perform admin commands on each file.
  */   */
 static int  static int
 cvs_admin_file(CVSFILE *cfp, void *arg)  cvs_admin_remote(CVSFILE *cf, void *arg)
 {  {
         int ret, l;          int ret;
         char *repo, fpath[MAXPATHLEN], rcspath[MAXPATHLEN];          char *repo, fpath[MAXPATHLEN];
         RCSFILE *rf;  
         struct cvsroot *root;          struct cvsroot *root;
   
         ret = 0;          ret = 0;
         rf = NULL;          root = CVS_DIR_ROOT(cf);
         root = CVS_DIR_ROOT(cfp);          repo = CVS_DIR_REPO(cf);
         repo = CVS_DIR_REPO(cfp);  
   
         if (cfp->cf_type == DT_DIR) {          if (cf->cf_type == DT_DIR) {
                 if (root->cr_method != CVS_METHOD_LOCAL) {                  if (cf->cf_cvstat == CVS_FST_UNKNOWN)
                         if (cfp->cf_cvstat == CVS_FST_UNKNOWN)                          ret = cvs_sendreq(root, CVS_REQ_QUESTIONABLE,
                                 ret = cvs_sendreq(root, CVS_REQ_QUESTIONABLE,                              cf->cf_name);
                                     CVS_FILE_NAME(cfp));                  else
                         else                          ret = cvs_senddir(root, cf);
                                 ret = cvs_senddir(root, cfp);                  if (ret == -1)
                           ret = CVS_EX_PROTO;
   
                         if (ret == -1)  
                                 ret = CVS_EX_PROTO;  
                 }  
   
                 return (ret);                  return (ret);
         }          }
   
         cvs_file_getpath(cfp, fpath, sizeof(fpath));          cvs_file_getpath(cf, fpath, sizeof(fpath));
   
         if (root->cr_method != CVS_METHOD_LOCAL) {          if (cvs_sendentry(root, cf) < 0)
                 if (cvs_sendentry(root, cfp) < 0) {                  return (CVS_EX_PROTO);
                         return (CVS_EX_PROTO);  
                 }  
   
                 switch (cfp->cf_cvstat) {          switch (cf->cf_cvstat) {
                 case CVS_FST_UNKNOWN:          case CVS_FST_UNKNOWN:
                         ret = cvs_sendreq(root, CVS_REQ_QUESTIONABLE,                  ret = cvs_sendreq(root, CVS_REQ_QUESTIONABLE, cf->cf_name);
                             CVS_FILE_NAME(cfp));                  break;
                         break;          case CVS_FST_UPTODATE:
                 case CVS_FST_UPTODATE:                  ret = cvs_sendreq(root, CVS_REQ_UNCHANGED, cf->cf_name);
                         ret = cvs_sendreq(root, CVS_REQ_UNCHANGED,                  break;
                             CVS_FILE_NAME(cfp));          case CVS_FST_MODIFIED:
                         break;                  ret = cvs_sendreq(root, CVS_REQ_MODIFIED, cf->cf_name);
                 case CVS_FST_MODIFIED:                  if (ret == 0)
                         ret = cvs_sendreq(root, CVS_REQ_MODIFIED,                          ret = cvs_sendfile(root, fpath);
                             CVS_FILE_NAME(cfp));          default:
                         if (ret == 0)                  break;
                                 ret = cvs_sendfile(root, fpath);          }
                 default:  
                         break;  
                 }  
   
                 if (ret == -1)          return (ret);
                         ret = CVS_EX_PROTO;  }
         } else {  
                 if (cfp->cf_cvstat == CVS_FST_UNKNOWN) {  
                         cvs_log(LP_WARN, "I know nothing about %s", fpath);  
                         return (0);  
                 }  
   
                 l = snprintf(rcspath, sizeof(rcspath), "%s/%s/%s%s",  /*
                     root->cr_dir, repo, CVS_FILE_NAME(cfp), RCS_FILE_EXT);   * cvs_admin_local()
                 if (l == -1 || l >= (int)sizeof(rcspath)) {   *
                         errno = ENAMETOOLONG;   * Perform administrative operations on a local RCS file.
                         cvs_log(LP_ERRNO, "%s", rcspath);   */
                         return (CVS_EX_DATA);  static int
                 }  cvs_admin_local(CVSFILE *cf, void *arg)
   {
           int ret, len;
           char *repo, fpath[MAXPATHLEN], rcspath[MAXPATHLEN];
           RCSFILE *rf;
           struct cvsroot *root;
   
                 rf = rcs_open(rcspath, RCS_READ);          if (cf->cf_cvstat == CVS_FST_UNKNOWN) {
                 if (rf == NULL) {                  cvs_log(LP_WARN, "I know nothing about %s", fpath);
                         return (CVS_EX_DATA);                  return (0);
                 }          }
   
                 rcs_close(rf);          cvs_file_getpath(cf, fpath, sizeof(fpath));
   
           len = snprintf(rcspath, sizeof(rcspath), "%s/%s/%s%s",
               root->cr_dir, repo, cf->cf_name, RCS_FILE_EXT);
           if (len == -1 || len >= (int)sizeof(rcspath)) {
                   errno = ENAMETOOLONG;
                   cvs_log(LP_ERRNO, "%s", rcspath);
                   return (-1);
         }          }
   
         return (ret);          rf = rcs_open(rcspath, RCS_RDWR);
           if (rf == NULL)
                   return (CVS_EX_DATA);
   
           if (!RCS_KWEXP_INVAL(kflag))
                   ret = rcs_kwexp_set(rf, kflag);
           if (lkmode != RCS_LOCK_INVAL)
                   ret = rcs_lock_setmode(rf, lkmode);
   
           rcs_close(rf);
   
           return (0);
 }  }

Legend:
Removed from v.1.15  
changed lines
  Added in v.1.16