home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / NEXTSTEP / UNIX / Utilities / vmount-0.6a-I / src / id_translate.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-14  |  3.9 KB  |  169 lines

  1. /*
  2.  * Name: id_translate.c
  3.  * Description: Functions for translation of UIDs and GIDs.
  4.  * Author: Christian Starkjohann <cs@hal.kph.tuwien.ac.at>
  5.  * Date: 1996-11-14
  6.  * Copyright: GNU-GPL
  7.  * Tabsize: 4
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <ctype.h>
  13. #include <string.h>
  14. #include "my_defines.h"
  15.  
  16. #define    DPRINTF(arg)    if(debug_mode & DEBUG_TRANS)    dprintf arg
  17.  
  18. /* ------------------------------------------------------------------------- */
  19.  
  20. typedef struct idpair{
  21.     int    local;
  22.     int    disk;
  23. }idpair_t;
  24.  
  25. typedef struct translator{
  26.     idpair_t    *idlist;
  27.     int            allocated;
  28.     int            used;
  29.     int            is_fixed;
  30.     int            fixed_value;
  31. }translator_t;
  32.  
  33. /* ------------------------------------------------------------------------- */
  34.  
  35. translator_t    translators[2];
  36.  
  37. /* ------------------------------------------------------------------------- */
  38.  
  39. static void    add_translation(translator_t *t, int local, int disk)
  40. {
  41.     if(t->idlist == NULL){
  42.         t->allocated = 30;
  43.         t->idlist = malloc(t->allocated * sizeof(idpair_t));
  44.     }
  45.     if(t->used >= t->allocated){
  46.         t->allocated *= 2;
  47.         t->idlist = realloc(t->idlist, t->allocated * sizeof(idpair_t));
  48.     }
  49.     t->idlist[t->used].local = local;
  50.     t->idlist[t->used++].disk = disk;
  51. }
  52.  
  53. /* ------------------------------------------------------------------------- */
  54.  
  55. static inline int    to_disk(translator_t *t, int local)
  56. {
  57. int        i;
  58.  
  59.     for(i=0;i<t->used;i++){
  60.         if(t->idlist[i].local == local)
  61.             return t->idlist[i].disk;
  62.     }
  63.     return local;
  64. }
  65.  
  66. /* ------------------------------------------------------------------------- */
  67.  
  68. static inline int    to_local(translator_t *t, int disk)
  69. {
  70. int        i;
  71.  
  72.     if(t->is_fixed)
  73.         return t->fixed_value;
  74.     for(i=0;i<t->used;i++){
  75.         if(t->idlist[i].disk == disk)
  76.             return t->idlist[i].local;
  77.     }
  78.     return disk;
  79. }
  80.  
  81. /* ------------------------------------------------------------------------- */
  82.  
  83. static void    read_file(translator_t *t, char *file)
  84. {
  85. char    linebuf[4096], *local, *disk;
  86. FILE    *fp;
  87.  
  88.     fp = fopen(file, "r");
  89.     if(fp == NULL){
  90.         eprintf("error reading table file ->%s<-: ", file);
  91.         perror("");
  92.         return;
  93.     }
  94.     while(fgets(linebuf, sizeof(linebuf), fp) != NULL){
  95.         if(linebuf[0] == '#')
  96.             continue;
  97.         if((local = strtok(linebuf, " \t\n\r=")) == NULL)
  98.             continue;
  99.         if(!isdigit(*local) && *local != '-'){
  100.             eprintf("->%s<-: local id (%s) must be numeric!\n", file, local);
  101.             continue;
  102.         }
  103.         if((disk = strtok(NULL, " \t\n\r=")) == NULL){
  104.             eprintf("->%s<-: no disk id for local id %s given\n", file, local);
  105.             continue;
  106.         }
  107.         if(!isdigit(*disk) && *disk != '-'){
  108.             eprintf("->%s<-: disk id (%s) must be numeric!\n", file, disk);
  109.             continue;
  110.         }
  111.         add_translation(t, atoi(local), atoi(disk));
  112.     }
  113.     fclose(fp);
  114. }
  115.  
  116. /* ------------------------------------------------------------------------- */
  117.  
  118. void    load_translationfile(int id, char *name)
  119. {
  120.     read_file(&translators[id], name);
  121. }
  122.  
  123. /* ------------------------------------------------------------------------- */
  124.  
  125. void    set_fixed_id(int id, int value)
  126. {
  127.     translators[id].is_fixed = 1;
  128.     translators[id].fixed_value = value;
  129. }
  130.  
  131. /* ------------------------------------------------------------------------- */
  132.  
  133. int    id_is_fixed(int id)
  134. {
  135.     return translators[id].is_fixed;
  136. }
  137.  
  138. /* ------------------------------------------------------------------------- */
  139.  
  140. int    fixed_id(int id)
  141. {
  142.     if(translators[id].is_fixed)
  143.         return translators[id].fixed_value;
  144.     else
  145.         return -1;
  146. }
  147.  
  148. /* ------------------------------------------------------------------------- */
  149.  
  150. int    translate_to_disk(int id, int local)
  151. {
  152. int    disk = to_disk(&translators[id], local);
  153.  
  154.     DPRINTF(("translate_to_disk(id=%d, local=%d) = %d\n", id, local, disk));
  155.     return disk;
  156. }
  157.  
  158. /* ------------------------------------------------------------------------- */
  159.  
  160. int    translate_to_local(int id, int disk)
  161. {
  162. int    local = to_local(&translators[id], disk);
  163.  
  164.     DPRINTF(("translate_to_local(id=%d, disk=%d) = %d\n", id, disk, local));
  165.     return local;
  166. }
  167.  
  168. /* ------------------------------------------------------------------------- */
  169.