@@ -141,8 +141,8 @@ bool read_to_string(const char *path, char **content) {
141
141
}
142
142
143
143
struct Split {
144
- size_t start ;
145
- size_t end ;
144
+ const char * split ;
145
+ size_t split_len ;
146
146
};
147
147
148
148
bool string_split (
@@ -160,10 +160,14 @@ bool string_split(
160
160
size_t split_start = 0 ;
161
161
for (size_t i = 0 ; i < str_len ; i ++ ) {
162
162
const char curr_char = str [i ];
163
- if (curr_char == split_char || i + 1 == str_len ) {
163
+ bool is_last_char = i + 1 == str_len ;
164
+ if (curr_char == split_char || is_last_char ) {
165
+ const char * split = str + split_start ;
166
+ size_t split_len =
167
+ is_last_char ? i - split_start + 1 : i - split_start ;
164
168
(* split_entries )[split_index ++ ] = (struct Split ){
165
- .start = split_start ,
166
- .end = i ,
169
+ .split = split ,
170
+ .split_len = split_len ,
167
171
};
168
172
if (split_index == MAX_SPLIT_ENTRIES ) {
169
173
BAIL ("max split entries exceeded\n" );
@@ -184,47 +188,54 @@ struct passwd *getpwuid(uid_t uid) {
184
188
}
185
189
186
190
size_t passwd_file_len = strlen (passwd_file );
187
- struct Split * lines ;
188
- size_t lines_len ;
189
- if (!string_split (passwd_file , passwd_file_len , '\n' , & lines , & lines_len )) {
191
+ struct Split * user_lines ;
192
+ size_t user_lines_len ;
193
+ if (!string_split (
194
+ passwd_file , passwd_file_len , '\n' , & user_lines , & user_lines_len
195
+ )) {
190
196
tinyc_errno = ENOENT ;
191
197
return NULL ;
192
198
}
193
199
194
- for (size_t i = 0 ; i < lines_len ; i ++ ) {
195
- struct Split * curr_line = & lines [i ];
196
- char * line_ptr = passwd_file + curr_line -> start ;
197
- size_t line_len = curr_line -> end - curr_line -> start ;
198
- struct Split * split_entries ;
199
- size_t split_entries_len ;
200
+ for (size_t i = 0 ; i < user_lines_len ; i ++ ) {
201
+ struct Split * user_line = & user_lines [i ];
202
+ struct Split * user_details_split ;
203
+ size_t user_details_split_len ;
200
204
if (!string_split (
201
- line_ptr , line_len , ':' , & split_entries , & split_entries_len
205
+ user_line -> split ,
206
+ user_line -> split_len ,
207
+ ':' ,
208
+ & user_details_split ,
209
+ & user_details_split_len
202
210
)) {
203
211
tinyc_errno = ENOENT ;
204
212
return NULL ;
205
213
}
206
- if (split_entries_len < 7 ) {
214
+ if (user_details_split_len < 7 ) {
207
215
tinyc_errno = ENOENT ;
208
216
return NULL ;
209
217
}
210
218
211
- struct Split * uid_split = & split_entries [2 ];
212
- size_t uid_str_len = uid_split -> end - uid_split -> start ;
213
- char * uid_str = passwd_file + curr_line -> start + uid_split -> start ;
214
- size_t parsed_uid = (size_t )atol_len (uid_str , uid_str_len );
219
+ struct Split * uid_split = & user_details_split [2 ];
220
+ size_t parsed_uid =
221
+ (size_t )atol_len (uid_split -> split , uid_split -> split_len );
215
222
if (parsed_uid == uid ) {
216
- struct Split * username_split = & split_entries [0 ];
217
- size_t username_len = username_split -> end - username_split -> start ;
218
- char * username_file_ptr = passwd_file + curr_line -> start ;
219
- char * username = tinyc_malloc_arena (username_len + 1 );
220
- // @todo: could create 'alloc' func to avoid this line
221
- username [username_len ] = 0 ;
222
- memcpy (username , username_file_ptr , username_len );
223
- struct passwd * passwdx = tinyc_malloc_arena (READ_SIZE );
224
- * passwdx = (struct passwd ){
223
+ struct Split * username_split = & user_details_split [0 ];
224
+ char * username = tinyc_malloc_arena (username_split -> split_len + 1 );
225
+ memcpy (username , username_split -> split , username_split -> split_len );
226
+ memset (username + user_line -> split_len , 0 , 1 );
227
+
228
+ struct Split * shell_split = & user_details_split [6 ];
229
+ char * shell = tinyc_malloc_arena (shell_split -> split_len + 1 );
230
+ memcpy (shell , shell_split -> split , shell_split -> split_len );
231
+ memset (shell + shell_split -> split_len , 0 , 1 );
232
+
233
+ struct passwd * passwd = tinyc_malloc_arena (sizeof (struct passwd ));
234
+ * passwd = (struct passwd ){
225
235
.pw_name = username ,
236
+ .pw_shell = shell ,
226
237
};
227
- return passwdx ;
238
+ return passwd ;
228
239
}
229
240
}
230
241
0 commit comments