16a17 > #include "unistd.h" 23a25,88 > // Lookup the closest ".cvsserver" file in the hierarchy and return it's first > // line. If not found or _any_ error occurred, just return NULL and at least > // we know that we tried. > static char* > lookup_cvsserver () > { > char cwd[256]; > static char buf[256]; > char* server = NULL; > > if (!getcwd(cwd, sizeof(cwd))) > // in case of error, give up > return NULL; > > // we'll take care to break it later > while (1) { > FILE *f = fopen(".cvsserver", "r"); > if (f) { > // we have it! ;-) > int len; > char *res = fgets(buf, sizeof(buf), f); > fclose(f); > if (!res) > // forget it > break; > len = strlen(buf); > if (buf[len-1] == '\n') > buf[len-1] = '\0'; > server = buf; > // finished > break; > } else { > // what options do we have? > // 1. examine if there is a CVS directory in the current directory. > // (this is kind of dirty but it'll work) > DIR* dir = opendir("CVS"); > > if (!dir) > // no accessible CVS directory, we'd better stop right here. > break; > > closedir(dir); > > // are we in root? > if (!getcwd(buf, sizeof(buf))) > // in case of error, give up > break; > > if (0 == strcmp(buf, "/")) > // reached root, give up > break; > > // none of the above? then go up > if (chdir("..") != 0) > // error, give up > break; > } > } > > // get back to the originating directory > chdir(cwd); > return server; > } > 79,80c144,145 < if (!cvs_server) < cvs_server = "cvs"; --- > if (!cvs_server && !(cvs_server = lookup_cvsserver())) > cvs_server = "cvs"; 137,138c202,203 < if (!cvs_server) < cvs_server = "cvs"; --- > if (!cvs_server && !(cvs_server = lookup_cvsserver())) > cvs_server = "cvs";