Files
2015-04-16 09:16:48 +02:00

155 lines
3.8 KiB
C

/*
* This file is part of ixemul.library for the Amiga.
* Copyright (C) 1991, 1992 Markus M. Wild
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: utimes.c,v 1.1.1.1 2005/03/15 15:57:08 laire Exp $
*/
#define _KERNEL
#include "ixemul.h"
#include "kprintf.h"
#if 0
static int
__utimes_func (struct lockinfo *info, struct DateStamp *ds, int *error)
{
struct StandardPacket *sp = &info->sp;
sp->sp_Pkt.dp_Type = ACTION_SET_DATE;
sp->sp_Pkt.dp_Arg1 = 0;
sp->sp_Pkt.dp_Arg2 = info->parent_lock;
sp->sp_Pkt.dp_Arg3 = info->bstr;
sp->sp_Pkt.dp_Arg4 = (long)ds;
PutPacket (info->handler, sp);
__wait_sync_packet (sp);
info->result = sp->sp_Pkt.dp_Res1;
*error = info->result != -1;
/* we want to set the date of the file pointed to, not that of the link */
return 1;
}
int
utimes(char *name, struct timeval *tvp)
{
struct DateStamp *ds;
struct timeval tv;
int result;
usetup;
if (!tvp)
/* in this case, fill in the current time */
syscall(SYS_gettimeofday, &tv, 0);
else
/* we have to ignore the value of "accesstime" and only
* look at "modificationtime", that's tvp[1] */
tv = tvp[1];
tv.tv_sec -= ix_get_gmt_offset();
/* long-alignment here could be overkill, but with DOS you never know.. */
ds = alloca (sizeof (struct DateStamp) + 2);
ds = LONG_ALIGN (ds);
ds->ds_Days = tv.tv_sec / (24 * 60 * 60);
/* subtract UNIX/AmigaOS time offset */
ds->ds_Days -= OFFSET_FROM_1970;
tv.tv_sec %= 24 * 60 * 60;
ds->ds_Minute = tv.tv_sec / 60;
tv.tv_sec %= 60;
ds->ds_Tick = (tv.tv_sec * TICKS_PER_SECOND +
(tv.tv_usec * TICKS_PER_SECOND)/1000000);
result = __plock (name, __utimes_func, ds);
if (! result) errno = __ioerr_to_errno (IoErr ());
KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
return result ? 0 : -1;
}
#else
char *ix_to_ados(char *, const char *);
char *check_root(char *);
int
utimes(char *name, struct timeval *tvp)
{
struct DateStamp ds;
struct timeval tv;
int result;
usetup;
int omask;
char *buf = alloca(strlen(name) + 4);
LONG err;
if (!tvp)
/* in this case, fill in the current time */
syscall(SYS_gettimeofday, &tv, 0);
else
/* we have to ignore the value of "accesstime" and only
* look at "modificationtime", that's tvp[1] */
tv = tvp[1];
tv.tv_sec -= ix_get_gmt_offset();
ds.ds_Days = tv.tv_sec / (24 * 60 * 60);
/* subtract UNIX/AmigaOS time offset */
ds.ds_Days -= OFFSET_FROM_1970;
tv.tv_sec %= 24 * 60 * 60;
ds.ds_Minute = tv.tv_sec / 60;
tv.tv_sec %= 60;
ds.ds_Tick = (tv.tv_sec * TICKS_PER_SECOND +
(tv.tv_usec * TICKS_PER_SECOND)/1000000);
buf = ix_to_ados(buf, name);
omask = syscall (SYS_sigsetmask, ~0);
result = SetFileDate(buf, &ds);
if (! result)
{
err = IoErr();
if (err == ERROR_OBJECT_NOT_FOUND)
{
buf = check_root(buf);
if (buf && *buf)
{
result = SetFileDate(buf, &ds);
if (result)
err = 0;
}
SetIoErr(err);
}
}
syscall (SYS_sigsetmask, omask);
if (! result) errno = __ioerr_to_errno (err);
KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
return result ? 0 : -1;
}
#endif