diff options
Diffstat (limited to 'utility.c')
-rw-r--r-- | utility.c | 341 |
1 files changed, 111 insertions, 230 deletions
@@ -33,102 +33,9 @@ #include <sys/stat.h> #include <unistd.h> -#if 0 - -extern char *join_paths(char *buffer, const char *a, const char *b) -{ - int length = 0; - - if (a && *a) { - length = strlen(a); - memcpy(buffer, a, length); - } - if (b && *b) { - if (length > 0 && buffer[length - 1] != '/') - buffer[length++] = '/'; - if (*b == '/') - b++; - strcpy(&buffer[length], b); - } - return buffer; -} - -#endif - - - - - - -static CHUNK *chunkList; - - -/* - * Return the standard ls-like mode string from a file mode. - * This is static and so is overwritten on each call. - */ -const char *modeString(int mode) -{ - static char buf[12]; - - strcpy(buf, "----------"); - - /* - * Fill in the file type. - */ - if (S_ISDIR(mode)) - buf[0] = 'd'; - if (S_ISCHR(mode)) - buf[0] = 'c'; - if (S_ISBLK(mode)) - buf[0] = 'b'; - if (S_ISFIFO(mode)) - buf[0] = 'p'; -#ifdef S_ISLNK - if (S_ISLNK(mode)) - buf[0] = 'l'; -#endif -#ifdef S_ISSOCK - if (S_ISSOCK(mode)) - buf[0] = 's'; -#endif - - /* - * Now fill in the normal file permissions. - */ - if (mode & S_IRUSR) - buf[1] = 'r'; - if (mode & S_IWUSR) - buf[2] = 'w'; - if (mode & S_IXUSR) - buf[3] = 'x'; - if (mode & S_IRGRP) - buf[4] = 'r'; - if (mode & S_IWGRP) - buf[5] = 'w'; - if (mode & S_IXGRP) - buf[6] = 'x'; - if (mode & S_IROTH) - buf[7] = 'r'; - if (mode & S_IWOTH) - buf[8] = 'w'; - if (mode & S_IXOTH) - buf[9] = 'x'; - - /* - * Finally fill in magic stuff like suid and sticky text. - */ - if (mode & S_ISUID) - buf[3] = ((mode & S_IXUSR) ? 's' : 'S'); - if (mode & S_ISGID) - buf[6] = ((mode & S_IXGRP) ? 's' : 'S'); - if (mode & S_ISVTX) - buf[9] = ((mode & S_IXOTH) ? 't' : 'T'); - - return buf; -} +#if defined (BB_CP) || defined (BB_MV) /* * Return TRUE if a fileName is a directory. * Nonexistant files return FALSE. @@ -145,21 +52,6 @@ int isDirectory(const char *name) /* - * Return TRUE if a filename is a block or character device. - * Nonexistant files return FALSE. - */ -int isDevice(const char *name) -{ - struct stat statBuf; - - if (stat(name, &statBuf) < 0) - return FALSE; - - return S_ISBLK(statBuf.st_mode) || S_ISCHR(statBuf.st_mode); -} - - -/* * Copy one file to another, while possibly preserving its modes, times, * and modes. Returns TRUE if successful, or FALSE on a failure with an * error message output. (Failure is not indicted if the attributes cannot @@ -173,47 +65,49 @@ copyFile( int rfd; int wfd; int rcc; + int result; char buf[BUF_SIZE]; - struct stat statBuf1; - struct stat statBuf2; + struct stat srcStatBuf; + struct stat dstStatBuf; struct utimbuf times; - if (stat(srcName, &statBuf1) < 0) { + if (followLinks == FALSE) + result = stat(srcName, &srcStatBuf); + else + result = lstat(srcName, &srcStatBuf); + + if (result < 0) { perror(srcName); return FALSE; } - if (stat(destName, &statBuf2) < 0) { - statBuf2.st_ino = -1; - statBuf2.st_dev = -1; + if (followLinks == FALSE) + result = stat(destName, &dstStatBuf); + else + result = lstat(destName, &dstStatBuf); + if (result < 0) { + dstStatBuf.st_ino = -1; + dstStatBuf.st_dev = -1; } - if ((statBuf1.st_dev == statBuf2.st_dev) && - (statBuf1.st_ino == statBuf2.st_ino)) { + if ((srcStatBuf.st_dev == dstStatBuf.st_dev) && + (srcStatBuf.st_ino == dstStatBuf.st_ino)) { fprintf(stderr, "Copying file \"%s\" to itself\n", srcName); return FALSE; } - if (S_ISDIR(statBuf1.st_mode)) { + if (S_ISDIR(srcStatBuf.st_mode)) { + //fprintf(stderr, "copying directory %s to %s\n", srcName, destName); /* Make sure the directory is writable */ if (mkdir(destName, 0777777 ^ umask(0))) { perror(destName); return (FALSE); } - } else if (S_ISFIFO(statBuf1.st_mode)) { - if (mkfifo(destName, 644)) { - perror(destName); - return (FALSE); - } - } else if (S_ISBLK(statBuf1.st_mode) || S_ISCHR(statBuf1.st_mode)) { - if (mknod(destName, 644, statBuf1.st_rdev)) { - perror(destName); - return (FALSE); - } - } else if (S_ISLNK(statBuf1.st_mode)) { + } else if (S_ISLNK(srcStatBuf.st_mode)) { char *link_val; int link_size; + //fprintf(stderr, "copying link %s to %s\n", srcName, destName); link_val = (char *) alloca(PATH_MAX + 2); link_size = readlink(srcName, link_val, PATH_MAX + 1); if (link_size < 0) { @@ -222,17 +116,31 @@ copyFile( } link_val[link_size] = '\0'; if (symlink(link_val, destName)) { - perror(srcName); + perror(destName); return (FALSE); } - } else { + } else if (S_ISFIFO(srcStatBuf.st_mode)) { + //fprintf(stderr, "copying fifo %s to %s\n", srcName, destName); + if (mkfifo(destName, 644)) { + perror(destName); + return (FALSE); + } + } else if (S_ISBLK(srcStatBuf.st_mode) || S_ISCHR(srcStatBuf.st_mode) + || S_ISSOCK (srcStatBuf.st_mode)) { + //fprintf(stderr, "copying soc, blk, or chr %s to %s\n", srcName, destName); + if (mknod(destName, srcStatBuf.st_mode, srcStatBuf.st_rdev)) { + perror(destName); + return (FALSE); + } + } else if (S_ISREG(srcStatBuf.st_mode)) { + //fprintf(stderr, "copying regular file %s to %s\n", srcName, destName); rfd = open(srcName, O_RDONLY); if (rfd < 0) { perror(srcName); return FALSE; } - wfd = creat(destName, statBuf1.st_mode); + wfd = creat(destName, srcStatBuf.st_mode); if (wfd < 0) { perror(destName); close(rfd); @@ -244,27 +152,25 @@ copyFile( goto error_exit; } if (rcc < 0) { - perror(srcName); goto error_exit; } close(rfd); - if (close(wfd) < 0) { - perror(destName); return FALSE; } } if (setModes == TRUE) { - chmod(destName, statBuf1.st_mode); + //fprintf(stderr, "Setting permissions for %s\n", destName); + chmod(destName, srcStatBuf.st_mode); if (followLinks == TRUE) - chown(destName, statBuf1.st_uid, statBuf1.st_gid); + chown(destName, srcStatBuf.st_uid, srcStatBuf.st_gid); else - lchown(destName, statBuf1.st_uid, statBuf1.st_gid); + lchown(destName, srcStatBuf.st_uid, srcStatBuf.st_gid); - times.actime = statBuf1.st_atime; - times.modtime = statBuf1.st_mtime; + times.actime = srcStatBuf.st_atime; + times.modtime = srcStatBuf.st_mtime; utime(destName, ×); } @@ -273,13 +179,17 @@ copyFile( error_exit: + //fprintf(stderr, "choking on %s\n", destName); + perror(destName); close(rfd); close(wfd); return FALSE; } +#endif +#ifdef BB_MV /* * Build a path name from the specified directory name and file name. * If the directory name is NULL, then the original fileName is returned. @@ -305,106 +215,77 @@ char *buildName(const char *dirName, const char *fileName) return buf; } +#endif /* - * Make a NULL-terminated string out of an argc, argv pair. - * Returns TRUE if successful, or FALSE if the string is too long, - * with an error message given. This does not handle spaces within - * arguments correctly. - */ -int makeString( int argc, const char **argv, char *buf, int bufLen) -{ - int len; - - while (argc-- > 0) { - len = strlen(*argv); - - if (len >= bufLen) { - fprintf(stderr, "Argument string too long\n"); - - return FALSE; - } - - strcpy(buf, *argv++); - - buf += len; - bufLen -= len; - - if (argc) - *buf++ = ' '; - - bufLen--; - } - - *buf = '\0'; - - return TRUE; -} - - -/* - * Allocate a chunk of memory (like malloc). - * The difference, though, is that the memory allocated is put on a - * list of chunks which can be freed all at one time. You CAN NOT free - * an individual chunk. - */ -char *getChunk(int size) -{ - CHUNK *chunk; - - if (size < CHUNK_INIT_SIZE) - size = CHUNK_INIT_SIZE; - - chunk = (CHUNK *) malloc(size + sizeof(CHUNK) - CHUNK_INIT_SIZE); - - if (chunk == NULL) - return NULL; - - chunk->next = chunkList; - chunkList = chunk; - - return chunk->data; -} - - -/* - * Duplicate a string value using the chunk allocator. - * The returned string cannot be individually freed, but can only be freed - * with other strings when freeChunks is called. Returns NULL on failure. + * Return the standard ls-like mode string from a file mode. + * This is static and so is overwritten on each call. */ -char *chunkstrdup(const char *str) +const char *modeString(int mode) { - int len; - char *newStr; - - len = strlen(str) + 1; - newStr = getChunk(len); + static char buf[12]; - if (newStr) - memcpy(newStr, str, len); + strcpy(buf, "----------"); - return newStr; -} + /* + * Fill in the file type. + */ + if (S_ISDIR(mode)) + buf[0] = 'd'; + if (S_ISCHR(mode)) + buf[0] = 'c'; + if (S_ISBLK(mode)) + buf[0] = 'b'; + if (S_ISFIFO(mode)) + buf[0] = 'p'; +#ifdef S_ISLNK + if (S_ISLNK(mode)) + buf[0] = 'l'; +#endif +#ifdef S_ISSOCK + if (S_ISSOCK(mode)) + buf[0] = 's'; +#endif + /* + * Now fill in the normal file permissions. + */ + if (mode & S_IRUSR) + buf[1] = 'r'; + if (mode & S_IWUSR) + buf[2] = 'w'; + if (mode & S_IXUSR) + buf[3] = 'x'; + if (mode & S_IRGRP) + buf[4] = 'r'; + if (mode & S_IWGRP) + buf[5] = 'w'; + if (mode & S_IXGRP) + buf[6] = 'x'; + if (mode & S_IROTH) + buf[7] = 'r'; + if (mode & S_IWOTH) + buf[8] = 'w'; + if (mode & S_IXOTH) + buf[9] = 'x'; -/* - * Free all chunks of memory that had been allocated since the last - * call to this routine. - */ -void freeChunks(void) -{ - CHUNK *chunk; + /* + * Finally fill in magic stuff like suid and sticky text. + */ + if (mode & S_ISUID) + buf[3] = ((mode & S_IXUSR) ? 's' : 'S'); + if (mode & S_ISGID) + buf[6] = ((mode & S_IXGRP) ? 's' : 'S'); + if (mode & S_ISVTX) + buf[9] = ((mode & S_IXOTH) ? 't' : 'T'); - while (chunkList) { - chunk = chunkList; - chunkList = chunk->next; - free((char *) chunk); - } + return buf; } +#ifdef BB_TAR /* * Get the time string to be used for a file. * This is down to the minute for new files, but only the date for old files. @@ -577,8 +458,10 @@ int fullRead(int fd, char *buf, int len) return total; } +#endif +#if defined (BB_CHOWN) || defined (BB_CP) || defined (BB_FIND) || defined (BB_LS) /* * Walk down all the directories under the specified * location, and do something (something specified @@ -618,7 +501,6 @@ recursiveAction(const char *fileName, int recurse, int followLinks, if (S_ISDIR(statbuf.st_mode)) { DIR *dir; - fprintf(stderr, "Dir: %s\n", fileName); dir = opendir(fileName); if (!dir) { perror(fileName); @@ -627,7 +509,7 @@ recursiveAction(const char *fileName, int recurse, int followLinks, if (dirAction != NULL) { status = dirAction(fileName); if (status == FALSE) { - perror("cp"); + perror(fileName); return (FALSE); } } @@ -652,7 +534,6 @@ recursiveAction(const char *fileName, int recurse, int followLinks, return (FALSE); } } else { - fprintf(stderr, "File: %s\n", fileName); if (fileAction == NULL) return (TRUE); else @@ -661,6 +542,6 @@ recursiveAction(const char *fileName, int recurse, int followLinks, return (TRUE); } - +#endif /* END CODE */ |