typefuncs.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
/*
* Copyright (c) 1985 AT&T
* All Rights Reserved
*/
#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.5 */
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <ctype.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "mio.h"
#include "wish.h"
#include "var_arrays.h"
#include "typetab.h"
#include "partabdefs.h"
#include "moremacros.h"
#include "sizes.h"
char Holdpath[PATHSIZ];
struct ott_entry *
ott_dup(entry)
struct ott_entry *entry;
{
char *def_display();
struct ott_entry *newentry = (struct ott_entry *)
array_create(sizeof(struct ott_entry), 1);
if (!entry)
return(NULL);
memcpy(newentry, entry, sizeof(struct ott_entry));
if (entry->dname)
newentry->dname = strsave(entry->dname);
if (entry->display && entry->objtype &&
entry->display != def_display(entry->objtype))
newentry->display = strsave(entry->display);
if (entry->odi)
newentry->odi = strsave(entry->odi);
if (entry->dirpath)
newentry->dirpath = strsave(entry->dirpath);
return(newentry);
}
void
ott_int_free(entry) /* free the internals of an ott_entry */
struct ott_entry *entry;
{
char *def_display();
if (entry->dname)
free(entry->dname);
if (entry->odi)
free(entry->odi);
if (entry->display && entry->objtype &&
entry->display != def_display(entry->objtype))
free(entry->display);
}
void
ott_free(entry)
struct ott_entry *entry;
{
if (!entry)
return;
if (entry->dirpath)
/* can't be in ott_int_free because called by other things than
* those that were ott_dup'd */
free(entry->dirpath);
ott_int_free(entry);
array_destroy(entry);
}
char *
ott_to_path(entry)
struct ott_entry *entry;
{
strcpy(Holdpath, entry->dirpath);
strcat(Holdpath, "/");
strcat(Holdpath, entry->name);
return(Holdpath);
}
void
ott_mark(entry, mask, value)
struct ott_entry *entry;
long mask;
bool value;
{
register int i;
extern struct ott_tab *Cur_ott;
extern struct ott_entry *Cur_entry;
void ott_mtime();
ott_lock_dsk(Cur_ott->path);
if (value)
entry->objmask |= mask;
else
entry->objmask &= ~mask;
utime(ott_to_path(entry), NULL);
ott_mtime(entry);
/* if it is a parent, kill all children */
if (entry->dname) {
for(i = entry->next_part; i != OTTNIL; i = Cur_entry[i].next_part) {
if (value)
Cur_entry[i].objmask |= mask;
else
Cur_entry[i].objmask &= ~mask;
utime(ott_to_path(&(Cur_entry[i])), NULL);
ott_mtime(&(Cur_entry[i]));
}
}
Cur_ott->modes |= OTT_DIRTY;
ott_synch(FALSE);
}
void
ott_mtime(entry) /* update the mod time on the entry */
struct ott_entry *entry;
{
struct ott_entry *name_to_ott();
extern struct ott_tab *Cur_ott;
extern struct ott_entry *Cur_entry;
struct stat sbuf;
if (!Cur_ott || !Cur_entry)
return;
/* do nothing if mtime is not wrong */
if (stat(ott_to_path(entry), &sbuf) == -1 || sbuf.st_mtime == entry->mtime)
return;
ott_lock_dsk(Cur_ott->path);
if ((entry = name_to_ott(entry->name)) != NULL)
entry->mtime = sbuf.st_mtime;
Cur_ott->modes |= OTT_DIRTY;
ott_synch(FALSE);
}
/* The next few functions change various fields of an ott entry */
#define ODI_FLD 0
#define OBJM_FLD 1
#define DNAME_FLD 2
#define DISPLAY_FLD 3
static void
ott_chg_item(entry, field)
struct ott_entry *entry;
short field;
{
extern struct ott_tab *Cur_ott;
extern struct ott_entry *Cur_entry;
struct ott_entry *name_to_ott();
struct ott_entry *old_entry = entry;
char *def_display();
char *newodi = entry->odi;
char *newdname = entry->dname;
char *newdisplay = entry->display;
long newobjm = entry->objmask;
ott_lock_dsk(Cur_ott->path);
if (old_entry != (entry = name_to_ott(entry->name)))
{ switch(field)
{ case ODI_FLD:
if (entry->odi)
free(entry->odi);
entry->odi = strsave(newodi);
break;
case OBJM_FLD:
entry->objmask = newobjm;
break;
case DNAME_FLD:
if (entry->dname)
free(entry->dname);
entry->dname = strsave(newdname);
break;
case DISPLAY_FLD:
if (entry->display && entry->objtype &&
entry->display != def_display(entry->objtype))
free(entry->display);
entry->display = strsave(newdisplay);
break;
default: break;
}
}
Cur_ott->modes |= OTT_DIRTY;
ott_synch(FALSE);
}
void
ott_chg_odi(entry)
struct ott_entry *entry;
{
(void)ott_chg_item(entry, ODI_FLD);
}
void
ott_chg_objm(entry)
struct ott_entry *entry;
{
(void)ott_chg_item(entry, OBJM_FLD);
}
void
ott_chg_dname(entry)
struct ott_entry *entry;
{
(void)ott_chg_item(entry, DNAME_FLD);
}
void
ott_chg_display(entry)
struct ott_entry *entry;
{
(void)ott_chg_item(entry, DISPLAY_FLD);
}