File: [Development] / xfs-cmds / xfsprogs / repair / Attic / dir_stack.c (download)
Revision 1.9, Fri Nov 11 14:27:22 2005 UTC (11 years, 11 months ago) by nathans.longdrop.melbourne.sgi.com
Branch: MAIN
Changes since 1.8: +12 -26
lines
Update copyright/license notices to match SGI legal prefered boilerplate.
Merge of master-melb:xfs-cmds:24374a by kenmcd.
|
/*
* Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
* All Rights Reserved.
*
* 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.
*
* This program is distributed in the hope that it would 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 the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <libxfs.h>
#include "dir_stack.h"
#include "err_protos.h"
/*
* a directory stack for holding directories while
* we traverse filesystem hierarchy subtrees.
* names are kind of misleading as this is really
* implemented as an inode stack. so sue me...
*/
static dir_stack_t dirstack_freelist;
static int dirstack_init = 0;
void
dir_stack_init(dir_stack_t *stack)
{
stack->cnt = 0;
stack->head = NULL;
if (dirstack_init == 0) {
dirstack_init = 1;
dir_stack_init(&dirstack_freelist);
}
stack->cnt = 0;
stack->head = NULL;
return;
}
static void
dir_stack_push(dir_stack_t *stack, dir_stack_elem_t *elem)
{
ASSERT(stack->cnt > 0 || (stack->cnt == 0 && stack->head == NULL));
elem->next = stack->head;
stack->head = elem;
stack->cnt++;
return;
}
static dir_stack_elem_t *
dir_stack_pop(dir_stack_t *stack)
{
dir_stack_elem_t *elem;
if (stack->cnt == 0) {
ASSERT(stack->head == NULL);
return(NULL);
}
elem = stack->head;
ASSERT(elem != NULL);
stack->head = elem->next;
elem->next = NULL;
stack->cnt--;
return(elem);
}
void
push_dir(dir_stack_t *stack, xfs_ino_t ino)
{
dir_stack_elem_t *elem;
if (dirstack_freelist.cnt == 0) {
if ((elem = malloc(sizeof(dir_stack_elem_t))) == NULL) {
do_error(
_("couldn't malloc dir stack element, try more swap\n"));
exit(1);
}
} else {
elem = dir_stack_pop(&dirstack_freelist);
}
elem->ino = ino;
dir_stack_push(stack, elem);
return;
}
xfs_ino_t
pop_dir(dir_stack_t *stack)
{
dir_stack_elem_t *elem;
xfs_ino_t ino;
elem = dir_stack_pop(stack);
if (elem == NULL)
return(NULLFSINO);
ino = elem->ino;
elem->ino = NULLFSINO;
dir_stack_push(&dirstack_freelist, elem);
return(ino);
}