11d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich/*
21d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* proc-llist.c - Minimal linked list library
31d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* Copyright (c) 2009 Red Hat Inc., Durham, North Carolina.
41d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* All Rights Reserved.
51d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich*
61d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* This software may be freely redistributed and/or modified under the
71d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* terms of the GNU General Public License as published by the Free
81d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* Software Foundation; either version 2, or (at your option) any
91d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* later version.
101d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich*
111d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* This program is distributed in the hope that it will be useful,
121d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* but WITHOUT ANY WARRANTY; without even the implied warranty of
131d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
141d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* GNU General Public License for more details.
151d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich*
161d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* You should have received a copy of the GNU General Public License
171d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* along with this program; see the file COPYING. If not, write to the
181d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
191d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich*
201d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich* Authors:
211d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich*   Steve Grubb <sgrubb@redhat.com>
221d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich*/
231d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
241d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#include "config.h"
251d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#include <stdlib.h>
261d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#include <string.h>
271d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#include "proc-llist.h"
281d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
291d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichvoid list_create(llist *l)
301d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich{
311d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	l->head = NULL;
321d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	l->cur = NULL;
331d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	l->cnt = 0;
341d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich}
351d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
361d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichvoid list_append(llist *l, lnode *node)
371d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich{
381d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	lnode* newnode;
391d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
401d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	if (node == NULL || l == NULL)
411d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		return;
421d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
431d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	newnode = malloc(sizeof(lnode));
441d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	if (newnode == NULL)
451d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		return;
461d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
471d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	newnode->ppid = node->ppid;
481d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	newnode->pid = node->pid;
491d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	newnode->uid = node->uid;
501d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	newnode->inode = node->inode;
511d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	// Take custody of the memory
521d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	newnode->cmd = node->cmd;
531d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	newnode->capabilities = node->capabilities;
541d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	newnode->bounds = node->bounds;
551d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	newnode->next = NULL;
561d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
571d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	// if we are at top, fix this up
581d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	if (l->head == NULL)
591d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		l->head = newnode;
601d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	else	// Otherwise add pointer to newnode
611d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		l->cur->next = newnode;
621d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
631d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	// make newnode current
641d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	l->cur = newnode;
651d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	l->cnt++;
661d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich}
671d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
681d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichvoid list_clear(llist* l)
691d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich{
701d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	lnode* nextnode;
711d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	register lnode* cur;
721d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
731d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	cur = l->head;
741d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	while (cur) {
751d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		nextnode=cur->next;
761d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		free(cur->cmd);
771d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		free(cur->capabilities);
781d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		free(cur->bounds);
791d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		free(cur);
801d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		cur=nextnode;
811d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	}
821d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	l->head = NULL;
831d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	l->cur = NULL;
841d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	l->cnt = 0;
851d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich}
861d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
871d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichlnode *list_find_inode(llist *l, unsigned long i)
881d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich{
891d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich        register lnode* cur;
901d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
911d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich       	cur = l->head;	/* start at the beginning */
921d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	while (cur) {
931d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		if (cur->inode == i) {
941d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich			l->cur = cur;
951d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich			return cur;
961d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		} else
971d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich			cur = cur->next;
981d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	}
991d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	return NULL;
1001d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich}
1011d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
102