This is id_translate.c in view mode; [Download] [Up]
/*
* Name: id_translate.c
* Description: Functions for translation of UIDs and GIDs.
* Author: Christian Starkjohann <cs@hal.kph.tuwien.ac.at>
* Date: 1996-11-14
* Copyright: GNU-GPL
* Tabsize: 4
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "my_defines.h"
#define DPRINTF(arg) if(debug_mode & DEBUG_TRANS) dprintf arg
/* ------------------------------------------------------------------------- */
typedef struct idpair{
int local;
int disk;
}idpair_t;
typedef struct translator{
idpair_t *idlist;
int allocated;
int used;
int is_fixed;
int fixed_value;
}translator_t;
/* ------------------------------------------------------------------------- */
translator_t translators[2];
/* ------------------------------------------------------------------------- */
static void add_translation(translator_t *t, int local, int disk)
{
if(t->idlist == NULL){
t->allocated = 30;
t->idlist = malloc(t->allocated * sizeof(idpair_t));
}
if(t->used >= t->allocated){
t->allocated *= 2;
t->idlist = realloc(t->idlist, t->allocated * sizeof(idpair_t));
}
t->idlist[t->used].local = local;
t->idlist[t->used++].disk = disk;
}
/* ------------------------------------------------------------------------- */
static inline int to_disk(translator_t *t, int local)
{
int i;
for(i=0;i<t->used;i++){
if(t->idlist[i].local == local)
return t->idlist[i].disk;
}
return local;
}
/* ------------------------------------------------------------------------- */
static inline int to_local(translator_t *t, int disk)
{
int i;
if(t->is_fixed)
return t->fixed_value;
for(i=0;i<t->used;i++){
if(t->idlist[i].disk == disk)
return t->idlist[i].local;
}
return disk;
}
/* ------------------------------------------------------------------------- */
static void read_file(translator_t *t, char *file)
{
char linebuf[4096], *local, *disk;
FILE *fp;
fp = fopen(file, "r");
if(fp == NULL){
eprintf("error reading table file ->%s<-: ", file);
perror("");
return;
}
while(fgets(linebuf, sizeof(linebuf), fp) != NULL){
if(linebuf[0] == '#')
continue;
if((local = strtok(linebuf, " \t\n\r=")) == NULL)
continue;
if(!isdigit(*local) && *local != '-'){
eprintf("->%s<-: local id (%s) must be numeric!\n", file, local);
continue;
}
if((disk = strtok(NULL, " \t\n\r=")) == NULL){
eprintf("->%s<-: no disk id for local id %s given\n", file, local);
continue;
}
if(!isdigit(*disk) && *disk != '-'){
eprintf("->%s<-: disk id (%s) must be numeric!\n", file, disk);
continue;
}
add_translation(t, atoi(local), atoi(disk));
}
fclose(fp);
}
/* ------------------------------------------------------------------------- */
void load_translationfile(int id, char *name)
{
read_file(&translators[id], name);
}
/* ------------------------------------------------------------------------- */
void set_fixed_id(int id, int value)
{
translators[id].is_fixed = 1;
translators[id].fixed_value = value;
}
/* ------------------------------------------------------------------------- */
int id_is_fixed(int id)
{
return translators[id].is_fixed;
}
/* ------------------------------------------------------------------------- */
int fixed_id(int id)
{
if(translators[id].is_fixed)
return translators[id].fixed_value;
else
return -1;
}
/* ------------------------------------------------------------------------- */
int translate_to_disk(int id, int local)
{
int disk = to_disk(&translators[id], local);
DPRINTF(("translate_to_disk(id=%d, local=%d) = %d\n", id, local, disk));
return disk;
}
/* ------------------------------------------------------------------------- */
int translate_to_local(int id, int disk)
{
int local = to_local(&translators[id], disk);
DPRINTF(("translate_to_local(id=%d, disk=%d) = %d\n", id, disk, local));
return local;
}
/* ------------------------------------------------------------------------- */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.