mariadb/mysys/my_chsize.c
unknown 6b4dbcb4db post-review fixes
include/my_sys.h:
  added prototype for the defaults correction function
libmysql/Makefile.shared:
  my_chsize added to libmysql to let my_correct_defaults_file be used from libmysql
mysys/default.c:
  New defaults function added we use it to correct defaults file. Currently the function doesn't lock defaults
  file. This is because of the linking and backwards-compatibility issues. This needs to be fixed later.
mysys/my_chsize.c:
  comment added
server-tools/instance-manager/buffer.cc:
  cleanup
server-tools/instance-manager/commands.cc:
  refactoring: removed do_command method from most of the classes
server-tools/instance-manager/commands.h:
  cleanup
server-tools/instance-manager/guardian.cc:
  cleanup
server-tools/instance-manager/instance.cc:
  cleanup
server-tools/instance-manager/instance_map.cc:
  cleanup
server-tools/instance-manager/instance_options.cc:
  cleanup
server-tools/instance-manager/instance_options.h:
  cleanup
server-tools/instance-manager/listener.cc:
  cleanup
server-tools/instance-manager/log.cc:
  cleanup
server-tools/instance-manager/manager.cc:
  cleanup
server-tools/instance-manager/messages.cc:
  new errors added
server-tools/instance-manager/mysql_connection.cc:
  cleanup
server-tools/instance-manager/mysql_manager_error.h:
  new error codes added
server-tools/instance-manager/mysqlmanager.cc:
  clenup
server-tools/instance-manager/options.cc:
  cleanup
server-tools/instance-manager/parse.cc:
  removed unused function
server-tools/instance-manager/parse.h:
  removed prototype
server-tools/instance-manager/protocol.cc:
  cleanup
server-tools/instance-manager/protocol.h:
  added enum to be used in protocol.cc instead of the constants
2005-05-16 01:54:02 +04:00

109 lines
3.2 KiB
C

/* Copyright (C) 2000 MySQL AB
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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "mysys_priv.h"
#include "mysys_err.h"
#include "m_string.h"
/*
Change size of file.
SYNOPSIS
my_chsize()
fd File descriptor
new_length New file size
filler If we don't have truncate, fill up all bytes after
new_length with this character
MyFlags Flags
DESCRIPTION
my_chsize() truncates file if shorter else fill with the filler character.
The function also changes the file pointer. Usually it points to the end
of the file after execution.
RETURN VALUE
0 Ok
1 Error
*/
int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags)
{
my_off_t oldsize;
char buff[IO_SIZE];
DBUG_ENTER("my_chsize");
DBUG_PRINT("my",("fd: %d length: %lu MyFlags: %d",fd,(ulong) newlength,
MyFlags));
oldsize = my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME+MY_FAE));
DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize));
if (oldsize > newlength)
{
#if defined(HAVE_SETFILEPOINTER)
/* This is for the moment only true on windows */
long is_success;
HANDLE win_file= (HANDLE) _get_osfhandle(fd);
long length_low, length_high;
length_low= (long) (ulong) newlength;
length_high= (long) ((ulonglong) newlength >> 32);
is_success= SetFilePointer(win_file, length_low, &length_high, FILE_BEGIN);
if (is_success == -1 && (my_errno= GetLastError()) != NO_ERROR)
goto err;
if (SetEndOfFile(win_file))
DBUG_RETURN(0);
my_errno= GetLastError();
goto err;
#elif defined(HAVE_FTRUNCATE)
if (ftruncate(fd, (off_t) newlength))
{
my_errno= errno;
goto err;
}
DBUG_RETURN(0);
#elif defined(HAVE_CHSIZE)
if (chsize(fd, (off_t) newlength))
{
my_errno=errno;
goto err;
}
DBUG_RETURN(0);
#else
/*
Fill space between requested length and true length with 'filler'
We should never come here on any modern machine
*/
VOID(my_seek(fd, newlength, MY_SEEK_SET, MYF(MY_WME+MY_FAE)));
swap_variables(my_off_t, newlength, oldsize);
#endif
}
/* Full file with 'filler' until it's as big as requested */
bfill(buff, IO_SIZE, filler);
while (newlength-oldsize > IO_SIZE)
{
if (my_write(fd,(byte*) buff,IO_SIZE,MYF(MY_NABP)))
goto err;
oldsize+= IO_SIZE;
}
if (my_write(fd,(byte*) buff,(uint) (newlength-oldsize),MYF(MY_NABP)))
goto err;
DBUG_RETURN(0);
err:
DBUG_PRINT("error", ("errno: %d", errno));
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE, MYF(ME_BELL+ME_WAITTANG), my_errno);
DBUG_RETURN(1);
} /* my_chsize */