void cvs_server_root(char *data) { if (data == NULL) fatal("Missing argument for Root"); if (current_cvsroot != NULL) return; if (data[0] != '/' || (current_cvsroot = cvsroot_get(data)) == NULL) fatal("Invalid Root specified!"); cvs_parse_configfile(); cvs_parse_modules(); umask(cvs_umask); }
int main(int argc, char **argv) { char *envstr, **cmd_argv, **targv; int i, ret, cmd_argc; struct passwd *pw; struct stat st; char fpath[MAXPATHLEN]; tzset(); TAILQ_INIT(&cvs_variables); SLIST_INIT(&repo_locks); SLIST_INIT(&temp_files); hash_table_init(&created_directories, 100); hash_table_init(&created_cvs_directories, 100); /* check environment so command-line options override it */ if ((envstr = getenv("CVS_RSH")) != NULL) cvs_rsh = envstr; if (((envstr = getenv("CVSEDITOR")) != NULL) || ((envstr = getenv("VISUAL")) != NULL) || ((envstr = getenv("EDITOR")) != NULL)) cvs_editor = envstr; if ((envstr = getenv("CVSREAD")) != NULL) cvs_readonly = 1; if ((envstr = getenv("CVSREADONLYFS")) != NULL) { cvs_readonlyfs = 1; cvs_nolog = 1; } if ((cvs_homedir = getenv("HOME")) == NULL) { if ((pw = getpwuid(getuid())) != NULL) cvs_homedir = pw->pw_dir; } if ((envstr = getenv("TMPDIR")) != NULL) cvs_tmpdir = envstr; ret = cvs_getopt(argc, argv); argc -= ret; argv += ret; if (argc == 0) usage(); cmdp = cvs_findcmd(argv[0]); if (cmdp == NULL) { fprintf(stderr, "Unknown command: `%s'\n\n", argv[0]); fprintf(stderr, "CVS commands are:\n"); for (i = 0; cvs_cdt[i] != NULL; i++) fprintf(stderr, "\t%-16s%s\n", cvs_cdt[i]->cmd_name, cvs_cdt[i]->cmd_descr); exit(1); } /* * check the tmp dir, either specified through * the environment variable TMPDIR, or via * the global option -T <dir> */ if (stat(cvs_tmpdir, &st) == -1) fatal("stat failed on `%s': %s", cvs_tmpdir, strerror(errno)); else if (!S_ISDIR(st.st_mode)) fatal("`%s' is not valid temporary directory", cvs_tmpdir); if (cvs_readrc == 1 && cvs_homedir != NULL) { cvs_read_rcfile(); if (cvs_defargs != NULL) { if ((targv = cvs_makeargv(cvs_defargs, &i)) == NULL) fatal("failed to load default arguments to %s", __progname); cvs_getopt(i, targv); cvs_freeargv(targv, i); xfree(targv); } } /* setup signal handlers */ signal(SIGTERM, sighandler); signal(SIGINT, sighandler); signal(SIGHUP, sighandler); signal(SIGABRT, sighandler); signal(SIGALRM, sighandler); signal(SIGPIPE, sighandler); cvs_cmdop = cmdp->cmd_op; cmd_argc = cvs_build_cmd(&cmd_argv, argv, argc); cvs_file_init(); if (cvs_cmdop == CVS_OP_SERVER) { cmdp->cmd(cmd_argc, cmd_argv); cvs_cleanup(); return (0); } cvs_umask = umask(0); umask(cvs_umask); if ((current_cvsroot = cvsroot_get(".")) == NULL) { cvs_log(LP_ERR, "No CVSROOT specified! Please use the '-d' option"); fatal("or set the CVSROOT environment variable."); } if (current_cvsroot->cr_method != CVS_METHOD_LOCAL) { cmdp->cmd(cmd_argc, cmd_argv); cvs_cleanup(); return (0); } (void)xsnprintf(fpath, sizeof(fpath), "%s/%s", current_cvsroot->cr_dir, CVS_PATH_ROOT); if (stat(fpath, &st) == -1 && cvs_cmdop != CVS_OP_INIT) { if (errno == ENOENT) fatal("repository '%s' does not exist", current_cvsroot->cr_dir); else fatal("%s: %s", current_cvsroot->cr_dir, strerror(errno)); } else { if (!S_ISDIR(st.st_mode)) fatal("'%s' is not a directory", current_cvsroot->cr_dir); } if (cvs_cmdop != CVS_OP_INIT) { cvs_parse_configfile(); cvs_parse_modules(); } cmdp->cmd(cmd_argc, cmd_argv); cvs_cleanup(); return (0); }