X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcfileutil.c;h=30b2a5e5ce2001df916e0a0ebb7b8f38a309af49;hp=1435da0d97ff53aa7820b4e74e2b256edcdd6d1d;hb=40f8443d8d3a6577336ee66d18e04d9ac4d956bb;hpb=7039cf461d3d2951acc2f3e123ccc1d68a55931d diff --git a/lib/silcutil/silcfileutil.c b/lib/silcutil/silcfileutil.c index 1435da0d..30b2a5e5 100644 --- a/lib/silcutil/silcfileutil.c +++ b/lib/silcutil/silcfileutil.c @@ -1,10 +1,10 @@ /* - silcfileutil.c + silcfileutil.c Author: Pekka Riikonen - Copyright (C) 1997 - 2002 Pekka Riikonen + Copyright (C) 1997 - 2005 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,15 +18,14 @@ */ /* $Id$ */ -#include "silcincludes.h" +#include "silc.h" /* Opens a file indicated by the filename `filename' with flags indicated by the `flags'. */ int silc_file_open(const char *filename, int flags) { - int fd = open(filename, flags, 0600); - return fd; + return silc_file_open_mode(filename, flags, 0600); } /* Opens a file indicated by the filename `filename' with flags indicated @@ -45,7 +44,7 @@ int silc_file_read(int fd, unsigned char *buf, SilcUInt32 buf_len) return read(fd, (void *)buf, buf_len); } -/* Writes `buffer' of length of `len' to file descriptor `fd. */ +/* Writes `buffer' of length of `len' to file descriptor `fd'. */ int silc_file_write(int fd, const char *buffer, SilcUInt32 len) { @@ -61,42 +60,52 @@ int silc_file_close(int fd) /* Writes a buffer to the file. */ -int silc_file_writefile(const char *filename, const char *buffer, +int silc_file_writefile(const char *filename, const char *buffer, SilcUInt32 len) { int fd; - - if ((fd = creat(filename, 0644)) == -1) { + int flags = O_CREAT | O_WRONLY | O_TRUNC; + +#if defined(O_BINARY) + flags |= O_BINARY; +#endif /* O_BINARY */ + + if ((fd = open(filename, flags, 0644)) == -1) { SILC_LOG_ERROR(("Cannot open file %s for writing: %s", filename, strerror(errno))); return -1; } - - if ((silc_file_write(fd, buffer, len)) == -1) { + + if (silc_file_write(fd, buffer, len) == -1) { SILC_LOG_ERROR(("Cannot write to file %s: %s", filename, strerror(errno))); silc_file_close(fd); return -1; } silc_file_close(fd); - + return 0; } /* Writes a buffer to the file. If the file is created specific mode is set to the file. */ -int silc_file_writefile_mode(const char *filename, const char *buffer, +int silc_file_writefile_mode(const char *filename, const char *buffer, SilcUInt32 len, int mode) { int fd; - - if ((fd = creat(filename, mode)) == -1) { + int flags = O_CREAT | O_WRONLY | O_TRUNC; + +#if defined(O_BINARY) + flags |= O_BINARY; +#endif /* O_BINARY */ + + if ((fd = open(filename, flags, mode)) == -1) { SILC_LOG_ERROR(("Cannot open file %s for writing: %s", filename, strerror(errno))); return -1; } - + if ((silc_file_write(fd, buffer, len)) == -1) { SILC_LOG_ERROR(("Cannot write to file %s: %s", filename, strerror(errno))); silc_file_close(fd); @@ -104,7 +113,7 @@ int silc_file_writefile_mode(const char *filename, const char *buffer, } silc_file_close(fd); - + return 0; } @@ -140,9 +149,9 @@ char *silc_file_readfile(const char *filename, SilcUInt32 *return_len) silc_file_close(fd); return NULL; } - + buffer = silc_calloc(filelen + 1, sizeof(char)); - + if ((silc_file_read(fd, buffer, filelen)) == -1) { memset(buffer, 0, sizeof(buffer)); silc_file_close(fd); @@ -160,7 +169,7 @@ char *silc_file_readfile(const char *filename, SilcUInt32 *return_len) return buffer; } -/* Returns files size. Returns 0 on error. */ +/* Returns the size of `filename'. Returns 0 on error. */ SilcUInt64 silc_file_size(const char *filename) {