diff options
Diffstat (limited to 'src/utils.c')
-rw-r--r-- | src/utils.c | 296 |
1 files changed, 148 insertions, 148 deletions
diff --git a/src/utils.c b/src/utils.c index 167d9e3..7201e9e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.39 2005-07-12 17:39:44 rjkaes Exp $ +/* $Id: utils.c,v 1.40 2005-08-15 03:54:31 rjkaes Exp $ * * Misc. routines which are used by the various functions to handle strings * and memory allocation and pretty much anything else we can think of. Also, @@ -31,26 +31,26 @@ */ int send_http_message(struct conn_s *connptr, int http_code, - const char *error_title, const char *message) + const char *error_title, const char *message) { - static char* headers[] = { - "Server: " PACKAGE "/" VERSION, - "Content-type: text/html", - "Connection: close" - }; + static char *headers[] = { + "Server: " PACKAGE "/" VERSION, + "Content-type: text/html", + "Connection: close" + }; - http_message_t msg; + http_message_t msg; - msg = http_message_create(http_code, error_title); - if (msg == NULL) - return -1; + msg = http_message_create(http_code, error_title); + if (msg == NULL) + return -1; - http_message_add_headers(msg, headers, 3); - http_message_set_body(msg, message, strlen(message)); - http_message_send(msg, connptr->client_fd); - http_message_destroy(msg); + http_message_add_headers(msg, headers, 3); + http_message_set_body(msg, message, strlen(message)); + http_message_send(msg, connptr->client_fd); + http_message_destroy(msg); - return 0; + return 0; } /* @@ -59,116 +59,116 @@ send_http_message(struct conn_s *connptr, int http_code, int create_file_safely(const char *filename, unsigned int truncate_file) { - struct stat lstatinfo; - int fildes; - - /* - * lstat() the file. If it doesn't exist, create it with O_EXCL. - * If it does exist, open it for writing and perform the fstat() - * check. - */ - if (lstat(filename, &lstatinfo) < 0) { - /* - * If lstat() failed for any reason other than "file not - * existing", exit. - */ - if (errno != ENOENT) { - fprintf(stderr, - "%s: Error checking file %s: %s\n", - PACKAGE, filename, strerror(errno)); - return -EACCES; - } - - /* - * The file doesn't exist, so create it with O_EXCL to make - * sure an attacker can't slip in a file between the lstat() - * and open() - */ - if ((fildes = - open(filename, O_RDWR | O_CREAT | O_EXCL, 0600)) < 0) { - fprintf(stderr, - "%s: Could not create file %s: %s\n", - PACKAGE, filename, strerror(errno)); - return fildes; - } - } else { - struct stat fstatinfo; - int flags; - - flags = O_RDWR; - if (!truncate_file) - flags |= O_APPEND; - - /* - * Open an existing file. - */ - if ((fildes = open(filename, flags)) < 0) { - fprintf(stderr, - "%s: Could not open file %s: %s\n", - PACKAGE, filename, strerror(errno)); - return fildes; - } - - /* - * fstat() the opened file and check that the file mode bits, - * inode, and device match. - */ - if (fstat(fildes, &fstatinfo) < 0 - || lstatinfo.st_mode != fstatinfo.st_mode - || lstatinfo.st_ino != fstatinfo.st_ino - || lstatinfo.st_dev != fstatinfo.st_dev) { - fprintf(stderr, - "%s: The file %s has been changed before it could be opened\n", - PACKAGE, filename); - close(fildes); - return -EIO; - } - - /* - * If the above check was passed, we know that the lstat() - * and fstat() were done on the same file. Now we check that - * there's only one link, and that it's a normal file (this - * isn't strictly necessary because the fstat() vs lstat() - * st_mode check would also find this) - */ - if (fstatinfo.st_nlink > 1 || !S_ISREG(lstatinfo.st_mode)) { - fprintf(stderr, - "%s: The file %s has too many links, or is not a regular file: %s\n", - PACKAGE, filename, strerror(errno)); - close(fildes); - return -EMLINK; - } - - /* - * Just return the file descriptor if we _don't_ want the file - * truncated. - */ - if (!truncate_file) - return fildes; - - /* - * On systems which don't support ftruncate() the best we can - * do is to close the file and reopen it in create mode, which - * unfortunately leads to a race condition, however "systems - * which don't support ftruncate()" is pretty much SCO only, - * and if you're using that you deserve what you get. - * ("Little sympathy has been extended") - */ + struct stat lstatinfo; + int fildes; + + /* + * lstat() the file. If it doesn't exist, create it with O_EXCL. + * If it does exist, open it for writing and perform the fstat() + * check. + */ + if (lstat(filename, &lstatinfo) < 0) { + /* + * If lstat() failed for any reason other than "file not + * existing", exit. + */ + if (errno != ENOENT) { + fprintf(stderr, + "%s: Error checking file %s: %s\n", + PACKAGE, filename, strerror(errno)); + return -EACCES; + } + + /* + * The file doesn't exist, so create it with O_EXCL to make + * sure an attacker can't slip in a file between the lstat() + * and open() + */ + if ((fildes = + open(filename, O_RDWR | O_CREAT | O_EXCL, 0600)) < 0) { + fprintf(stderr, + "%s: Could not create file %s: %s\n", + PACKAGE, filename, strerror(errno)); + return fildes; + } + } else { + struct stat fstatinfo; + int flags; + + flags = O_RDWR; + if (!truncate_file) + flags |= O_APPEND; + + /* + * Open an existing file. + */ + if ((fildes = open(filename, flags)) < 0) { + fprintf(stderr, + "%s: Could not open file %s: %s\n", + PACKAGE, filename, strerror(errno)); + return fildes; + } + + /* + * fstat() the opened file and check that the file mode bits, + * inode, and device match. + */ + if (fstat(fildes, &fstatinfo) < 0 + || lstatinfo.st_mode != fstatinfo.st_mode + || lstatinfo.st_ino != fstatinfo.st_ino + || lstatinfo.st_dev != fstatinfo.st_dev) { + fprintf(stderr, + "%s: The file %s has been changed before it could be opened\n", + PACKAGE, filename); + close(fildes); + return -EIO; + } + + /* + * If the above check was passed, we know that the lstat() + * and fstat() were done on the same file. Now we check that + * there's only one link, and that it's a normal file (this + * isn't strictly necessary because the fstat() vs lstat() + * st_mode check would also find this) + */ + if (fstatinfo.st_nlink > 1 || !S_ISREG(lstatinfo.st_mode)) { + fprintf(stderr, + "%s: The file %s has too many links, or is not a regular file: %s\n", + PACKAGE, filename, strerror(errno)); + close(fildes); + return -EMLINK; + } + + /* + * Just return the file descriptor if we _don't_ want the file + * truncated. + */ + if (!truncate_file) + return fildes; + + /* + * On systems which don't support ftruncate() the best we can + * do is to close the file and reopen it in create mode, which + * unfortunately leads to a race condition, however "systems + * which don't support ftruncate()" is pretty much SCO only, + * and if you're using that you deserve what you get. + * ("Little sympathy has been extended") + */ #ifdef HAVE_FTRUNCATE - ftruncate(fildes, 0); + ftruncate(fildes, 0); #else - close(fildes); - if ((fildes = - open(filename, O_RDWR | O_CREAT | O_TRUNC, 0600)) < 0) { - fprintf(stderr, - "%s: Could not open file %s: %s.", - PACKAGE, filename, strerror(errno)); - return fildes; - } -#endif /* HAVE_FTRUNCATE */ - } - - return fildes; + close(fildes); + if ((fildes = + open(filename, O_RDWR | O_CREAT | O_TRUNC, 0600)) < 0) { + fprintf(stderr, + "%s: Could not open file %s: %s.", + PACKAGE, filename, strerror(errno)); + return fildes; + } +#endif /* HAVE_FTRUNCATE */ + } + + return fildes; } /* @@ -177,28 +177,28 @@ create_file_safely(const char *filename, unsigned int truncate_file) int pidfile_create(const char *filename) { - int fildes; - FILE *fd; - - /* - * Create a new file - */ - if ((fildes = create_file_safely(filename, TRUE)) < 0) - return fildes; - - /* - * Open a stdio file over the low-level one. - */ - if ((fd = fdopen(fildes, "w")) == NULL) { - fprintf(stderr, - "%s: Could not write PID file %s: %s.", - PACKAGE, filename, strerror(errno)); - close(fildes); - unlink(filename); - return -EIO; - } - - fprintf(fd, "%ld\n", (long) getpid()); - fclose(fd); - return 0; + int fildes; + FILE *fd; + + /* + * Create a new file + */ + if ((fildes = create_file_safely(filename, TRUE)) < 0) + return fildes; + + /* + * Open a stdio file over the low-level one. + */ + if ((fd = fdopen(fildes, "w")) == NULL) { + fprintf(stderr, + "%s: Could not write PID file %s: %s.", + PACKAGE, filename, strerror(errno)); + close(fildes); + unlink(filename); + return -EIO; + } + + fprintf(fd, "%ld\n", (long)getpid()); + fclose(fd); + return 0; } |