- static char *buf=NULL;
- static int bufsize = WRITE_BLOCK_SIZE;
- int total=0;
-
- if (!buf) {
- buf = (char *)malloc(bufsize);
- if (!buf) out_of_memory("read_write");
- }
-
- while (total < size) {
- int n = MIN(size-total,bufsize);
- read_buf(fd_in,buf,n);
- if (write(fd_out,buf,n) != n)
- return total;
- total += n;
- }
- return total;
-}
-
-
-/* this is taken from CVS */
-int piped_child(char **command,int *f_in,int *f_out)
-{
- int pid;
- int to_child_pipe[2];
- int from_child_pipe[2];
-
- if (pipe(to_child_pipe) < 0 ||
- pipe(from_child_pipe) < 0) {
- fprintf(stderr,"pipe: %s\n",strerror(errno));
- exit(1);
- }
-
-
- pid = fork();
- if (pid < 0) {
- fprintf(stderr,"fork: %s\n",strerror(errno));
- exit(1);
- }
-
- if (pid == 0)
- {
- if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 ||
- close(to_child_pipe[1]) < 0 ||
- close(from_child_pipe[0]) < 0 ||
- dup2(from_child_pipe[1], STDOUT_FILENO) < 0) {
- fprintf(stderr,"Failed to dup/close : %s\n",strerror(errno));
- exit(1);
- }
- execvp(command[0], command);
- fprintf(stderr,"Failed to exec %s : %s\n",
- command[0],strerror(errno));
- exit(1);
- }
-
- if (close(from_child_pipe[1]) < 0 ||
- close(to_child_pipe[0]) < 0) {
- fprintf(stderr,"Failed to close : %s\n",strerror(errno));
- exit(1);
- }
-
- *f_in = from_child_pipe[0];
- *f_out = to_child_pipe[1];
-
- return pid;
+ char *ret = curr_dir;
+ static int initialised;
+
+ if (!initialised) {
+ initialised = 1;
+ getcwd(curr_dir, sizeof(curr_dir)-1);
+ }
+
+ if (!dir) return NULL; /* this call was probably just to initialize */
+
+ if (chdir(dir)) return NULL;
+
+ if (save) {
+ ret = strdup(curr_dir);
+ }
+
+ if (*dir == '/') {
+ strlcpy(curr_dir, dir, sizeof(curr_dir));
+ } else if (dir[0] != '.' || dir[1] != '\0') {
+ strlcat(curr_dir,"/", sizeof(curr_dir));
+ strlcat(curr_dir,dir, sizeof(curr_dir));
+ }
+
+ clean_fname(curr_dir);
+
+ return ret;