OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [uclinux/] [uC-libc/] [getent/] [__getgrent.c] - Blame information for rev 1775

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 199 simons
/*
2
 * __getgrent.c - This file is part of the libc-8086/grp package for ELKS,
3
 * Copyright (C) 1995, 1996 Nat Friedman <ndf@linux.mit.edu>.
4
 *
5
 *  This library is free software; you can redistribute it and/or
6
 *  modify it under the terms of the GNU Library General Public
7
 *  License as published by the Free Software Foundation; either
8
 *  version 2 of the License, or (at your option) any later version.
9
 *
10
 *  This library is distributed in the hope that it will be useful,
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
 *  Library General Public License for more details.
14
 *
15
 *  You should have received a copy of the GNU Library General Public
16
 *  License along with this library; if not, write to the Free
17
 *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
 *
19
 */
20
 
21
#include <unistd.h>
22
#include <stdlib.h>
23
#include <string.h>
24
#include <grp.h>
25
#include "config.h"
26
 
27
/*
28
 * This is the core group-file read function.  It behaves exactly like
29
 * getgrent() except that it is passed a file descriptor.  getgrent()
30
 * is just a wrapper for this function.
31
 */
32
struct group *
33
__getgrent(int grp_fd)
34
{
35
#ifndef GR_SCALE_DYNAMIC  
36
  static char line_buff[GR_MAX_LINE_LEN];
37
  static char * members[GR_MAX_MEMBERS];
38
#else
39
  static char * line_buff = NULL;
40
  static char ** members = NULL;
41
  short line_index;
42
  short buff_size;
43
#endif
44
  static struct group group;
45
  register char * ptr;
46
  char * field_begin;
47
  short member_num;
48
  char * endptr;
49
  int line_len;
50
 
51
 
52
  /* We use the restart label to handle malformatted lines */
53
restart:
54
#ifdef GR_SCALE_DYNAMIC
55
  line_index=0;
56
  buff_size=256;
57
#endif
58
 
59
#ifndef GR_SCALE_DYNAMIC
60
  /* Read the line into the static buffer */
61
  if ((line_len=read(grp_fd, line_buff, GR_MAX_LINE_LEN))<=0)
62
    return NULL;
63
  field_begin=strchr(line_buff, '\n');
64
  if (field_begin!=NULL)
65
    lseek(grp_fd, (long) (1+field_begin-(line_buff+line_len)), SEEK_CUR);
66
  else /* The line is too long - skip it :-\ */
67
    {
68
      do { if ((line_len=read(grp_fd, line_buff, GR_MAX_LINE_LEN))<=0)
69
        return NULL;
70
      } while (!(field_begin=strchr(line_buff, '\n')));
71
      lseek(grp_fd, (long) ((field_begin-line_buff)-line_len+1), SEEK_CUR);
72
      goto restart;
73
    }
74
  if (*line_buff=='#' || *line_buff==' ' || *line_buff=='\n' ||
75
      *line_buff=='\t')
76
    goto restart;
77
  *field_begin='\0';
78
 
79
#else /* !GR_SCALE_DYNAMIC */
80
  line_buff=realloc(line_buff, buff_size);
81
  while (1)
82
    {
83
      if ((line_len=read(grp_fd, line_buff+line_index,
84
                         buff_size-line_index))<=0)
85
          return NULL;
86
      field_begin=strchr(line_buff, '\n');
87
      if (field_begin!=NULL)
88
        {
89
          lseek(grp_fd, (long) (1+field_begin-(line_len+line_index+line_buff)),
90
                SEEK_CUR);
91
          *field_begin='\0';
92
          if (*line_buff=='#' || *line_buff==' ' || *line_buff=='\n' ||
93
              *line_buff=='\t')
94
            goto restart;
95
          break;
96
        }
97
      else /* Allocate some more space */
98
        {
99
          line_index=buff_size;
100
          buff_size+=256;
101
          line_buff=realloc(line_buff, buff_size);
102
        }
103
    }
104
#endif /* GR_SCALE_DYNAMIC */
105
 
106
  /* Now parse the line */
107
  group.gr_name=line_buff;
108
  ptr=strchr(line_buff, ':');
109
  if (ptr==NULL) goto restart;
110
  *ptr++='\0';
111
 
112
  group.gr_passwd=ptr;
113
  ptr=strchr(ptr, ':');
114
  if (ptr==NULL) goto restart;
115
  *ptr++='\0';
116
 
117
  field_begin=ptr;
118
  ptr=strchr(ptr, ':');
119
  if (ptr==NULL) goto restart;
120
  *ptr++='\0';
121
 
122
  group.gr_gid=(gid_t) strtoul(field_begin, &endptr, 10);
123
  if (*endptr!='\0') goto restart;
124
 
125
  member_num=0;
126
  field_begin=ptr;
127
 
128
#ifndef GR_SCALE_DYNAMIC
129
  while ((ptr=strchr(ptr, ','))!=NULL)
130
    {
131
      *ptr='\0';
132
      ptr++;
133
      members[member_num]=field_begin;
134
      field_begin=ptr;
135
      member_num++;
136
    }
137
  if (*field_begin=='\0')
138
    members[member_num]=NULL;
139
  else
140
    {
141
      members[member_num]=field_begin;
142
      members[member_num+1]=NULL;
143
    }
144
#else /* !GR_SCALE_DYNAMIC */
145
  if (members!=NULL)
146
    free (members);
147
  members=(char **) malloc(1*sizeof(char *));
148
  while ((ptr=strchr(ptr, ','))!=NULL)
149
    {
150
      *ptr='\0';
151
      ptr++;
152
      members[member_num]=field_begin;
153
      field_begin=ptr;
154
      member_num++;
155
      members=(char **)realloc((void *)members, (member_num+1)*sizeof(char *));
156
    }
157
  if (*field_begin=='\0')
158
      members[member_num]=NULL;
159
  else
160
    {
161
      members[member_num]=field_begin;
162
      members[member_num+1]=NULL;
163
    }
164
#endif /* GR_SCALE_DYNAMIC */
165
 
166
  group.gr_mem=members;
167
  return &group;
168
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.