diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2012-01-06 16:24:56 +0100 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2012-01-06 16:24:56 +0100 |
| commit | acdb0041b35e27cd03c43b25410eda5151acd2c1 (patch) | |
| tree | 31fa4b96f803502d869fd9433881af2bc3216513 | |
| parent | 2e55404bcf76f05193803b3d35359c6024f2a5f8 (diff) | |
| download | busybox-w32-acdb0041b35e27cd03c43b25410eda5151acd2c1.tar.gz busybox-w32-acdb0041b35e27cd03c43b25410eda5151acd2c1.tar.bz2 busybox-w32-acdb0041b35e27cd03c43b25410eda5151acd2c1.zip | |
libpwdgrp/pwd_grp.c: use same static buffer for all getpwXX functions
This should save more than 0.5k of malloced memory in applets
which use those functions.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | libpwdgrp/pwd_grp.c | 100 |
1 files changed, 38 insertions, 62 deletions
diff --git a/libpwdgrp/pwd_grp.c b/libpwdgrp/pwd_grp.c index 23abdbec0..edf53f350 100644 --- a/libpwdgrp/pwd_grp.c +++ b/libpwdgrp/pwd_grp.c | |||
| @@ -23,8 +23,6 @@ | |||
| 23 | /**********************************************************************/ | 23 | /**********************************************************************/ |
| 24 | /* Sizes for statically allocated buffers. */ | 24 | /* Sizes for statically allocated buffers. */ |
| 25 | 25 | ||
| 26 | /* If you change these values, also change _SC_GETPW_R_SIZE_MAX and | ||
| 27 | * _SC_GETGR_R_SIZE_MAX in libc/unistd/sysconf.c to match */ | ||
| 28 | #define PWD_BUFFER_SIZE 256 | 26 | #define PWD_BUFFER_SIZE 256 |
| 29 | #define GRP_BUFFER_SIZE 256 | 27 | #define GRP_BUFFER_SIZE 256 |
| 30 | 28 | ||
| @@ -49,46 +47,24 @@ static int FAST_FUNC bb__parsespent(void *sp, char *line); | |||
| 49 | 47 | ||
| 50 | struct statics { | 48 | struct statics { |
| 51 | /* Smaller things first */ | 49 | /* Smaller things first */ |
| 52 | struct passwd getpwuid_resultbuf; | 50 | /* It's ok to use one buffer for getpwuid and getpwnam. Manpage says: |
| 53 | struct group getgrgid_resultbuf; | 51 | * "The return value may point to a static area, and may be overwritten |
| 54 | struct passwd getpwnam_resultbuf; | 52 | * by subsequent calls to getpwent(), getpwnam(), or getpwuid()." |
| 55 | struct group getgrnam_resultbuf; | 53 | */ |
| 56 | 54 | struct passwd getpw_resultbuf; | |
| 57 | char getpwuid_buffer[PWD_BUFFER_SIZE]; | 55 | struct group getgr_resultbuf; |
| 58 | char getgrgid_buffer[GRP_BUFFER_SIZE]; | 56 | |
| 59 | char getpwnam_buffer[PWD_BUFFER_SIZE]; | 57 | char getpw_buffer[PWD_BUFFER_SIZE]; |
| 60 | char getgrnam_buffer[GRP_BUFFER_SIZE]; | 58 | char getgr_buffer[GRP_BUFFER_SIZE]; |
| 61 | #if 0 | ||
| 62 | struct passwd fgetpwent_resultbuf; | ||
| 63 | struct group fgetgrent_resultbuf; | ||
| 64 | struct spwd fgetspent_resultbuf; | ||
| 65 | char fgetpwent_buffer[PWD_BUFFER_SIZE]; | ||
| 66 | char fgetgrent_buffer[GRP_BUFFER_SIZE]; | ||
| 67 | char fgetspent_buffer[PWD_BUFFER_SIZE]; | ||
| 68 | #endif | ||
| 69 | #if 0 //ENABLE_USE_BB_SHADOW | 59 | #if 0 //ENABLE_USE_BB_SHADOW |
| 70 | struct spwd getspuid_resultbuf; | 60 | struct spwd getsp_resultbuf; |
| 71 | struct spwd getspnam_resultbuf; | 61 | char getsp_buffer[PWD_BUFFER_SIZE]; |
| 72 | char getspuid_buffer[PWD_BUFFER_SIZE]; | ||
| 73 | char getspnam_buffer[PWD_BUFFER_SIZE]; | ||
| 74 | #endif | 62 | #endif |
| 75 | // Not converted - too small to bother | 63 | // Not converted - too small to bother |
| 76 | //pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER; | 64 | //pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER; |
| 77 | //FILE *pwf /*= NULL*/; | 65 | //FILE *pwf /*= NULL*/; |
| 78 | //FILE *grf /*= NULL*/; | 66 | //FILE *grf /*= NULL*/; |
| 79 | //FILE *spf /*= NULL*/; | 67 | //FILE *spf /*= NULL*/; |
| 80 | #if 0 | ||
| 81 | struct passwd getpwent_pwd; | ||
| 82 | struct group getgrent_gr; | ||
| 83 | char getpwent_line_buff[PWD_BUFFER_SIZE]; | ||
| 84 | char getgrent_line_buff[GRP_BUFFER_SIZE]; | ||
| 85 | #endif | ||
| 86 | #if 0 //ENABLE_USE_BB_SHADOW | ||
| 87 | struct spwd getspent_spwd; | ||
| 88 | struct spwd sgetspent_spwd; | ||
| 89 | char getspent_line_buff[PWD_BUFFER_SIZE]; | ||
| 90 | char sgetspent_line_buff[PWD_BUFFER_SIZE]; | ||
| 91 | #endif | ||
| 92 | }; | 68 | }; |
| 93 | 69 | ||
| 94 | static struct statics *ptr_to_statics; | 70 | static struct statics *ptr_to_statics; |
| @@ -182,22 +158,22 @@ int fgetspent_r(FILE *__restrict stream, struct spwd *__restrict resultbuf, | |||
| 182 | struct passwd *fgetpwent(FILE *stream) | 158 | struct passwd *fgetpwent(FILE *stream) |
| 183 | { | 159 | { |
| 184 | struct statics *S; | 160 | struct statics *S; |
| 185 | struct passwd *resultbuf = RESULTBUF(fgetpwent); | 161 | struct passwd *resultbuf = RESULTBUF(getpw); |
| 186 | char *buffer = BUFFER(fgetpwent); | 162 | char *buffer = BUFFER(getpw); |
| 187 | struct passwd *result; | 163 | struct passwd *result; |
| 188 | 164 | ||
| 189 | fgetpwent_r(stream, resultbuf, buffer, sizeof(BUFFER(fgetpwent)), &result); | 165 | fgetpwent_r(stream, resultbuf, buffer, sizeof(BUFFER(getpw)), &result); |
| 190 | return result; | 166 | return result; |
| 191 | } | 167 | } |
| 192 | 168 | ||
| 193 | struct group *fgetgrent(FILE *stream) | 169 | struct group *fgetgrent(FILE *stream) |
| 194 | { | 170 | { |
| 195 | struct statics *S; | 171 | struct statics *S; |
| 196 | struct group *resultbuf = RESULTBUF(fgetgrent); | 172 | struct group *resultbuf = RESULTBUF(getgr); |
| 197 | char *buffer = BUFFER(fgetgrent); | 173 | char *buffer = BUFFER(getgr); |
| 198 | struct group *result; | 174 | struct group *result; |
| 199 | 175 | ||
| 200 | fgetgrent_r(stream, resultbuf, buffer, sizeof(BUFFER(fgetgrent)), &result); | 176 | fgetgrent_r(stream, resultbuf, buffer, sizeof(BUFFER(getgr)), &result); |
| 201 | return result; | 177 | return result; |
| 202 | } | 178 | } |
| 203 | #endif | 179 | #endif |
| @@ -207,11 +183,11 @@ struct group *fgetgrent(FILE *stream) | |||
| 207 | struct spwd *fgetspent(FILE *stream) | 183 | struct spwd *fgetspent(FILE *stream) |
| 208 | { | 184 | { |
| 209 | struct statics *S; | 185 | struct statics *S; |
| 210 | struct spwd *resultbuf = RESULTBUF(fgetspent); | 186 | struct spwd *resultbuf = RESULTBUF(getsp); |
| 211 | char *buffer = BUFFER(fgetspent); | 187 | char *buffer = BUFFER(getsp); |
| 212 | struct spwd *result; | 188 | struct spwd *result; |
| 213 | 189 | ||
| 214 | fgetspent_r(stream, resultbuf, buffer, sizeof(BUFFER(fgetspent)), &result); | 190 | fgetspent_r(stream, resultbuf, buffer, sizeof(BUFFER(getsp)), &result); |
| 215 | return result; | 191 | return result; |
| 216 | } | 192 | } |
| 217 | #endif | 193 | #endif |
| @@ -299,11 +275,11 @@ int sgetspent_r(const char *string, struct spwd *result_buf, | |||
| 299 | struct passwd *getpwuid(uid_t uid) | 275 | struct passwd *getpwuid(uid_t uid) |
| 300 | { | 276 | { |
| 301 | struct statics *S; | 277 | struct statics *S; |
| 302 | struct passwd *resultbuf = RESULTBUF(getpwuid); | 278 | struct passwd *resultbuf = RESULTBUF(getpw); |
| 303 | char *buffer = BUFFER(getpwuid); | 279 | char *buffer = BUFFER(getpw); |
| 304 | struct passwd *result; | 280 | struct passwd *result; |
| 305 | 281 | ||
| 306 | getpwuid_r(uid, resultbuf, buffer, sizeof(BUFFER(getpwuid)), &result); | 282 | getpwuid_r(uid, resultbuf, buffer, sizeof(BUFFER(getpw)), &result); |
| 307 | return result; | 283 | return result; |
| 308 | } | 284 | } |
| 309 | 285 | ||
| @@ -311,11 +287,11 @@ struct passwd *getpwuid(uid_t uid) | |||
| 311 | struct group *getgrgid(gid_t gid) | 287 | struct group *getgrgid(gid_t gid) |
| 312 | { | 288 | { |
| 313 | struct statics *S; | 289 | struct statics *S; |
| 314 | struct group *resultbuf = RESULTBUF(getgrgid); | 290 | struct group *resultbuf = RESULTBUF(getgr); |
| 315 | char *buffer = BUFFER(getgrgid); | 291 | char *buffer = BUFFER(getgr); |
| 316 | struct group *result; | 292 | struct group *result; |
| 317 | 293 | ||
| 318 | getgrgid_r(gid, resultbuf, buffer, sizeof(BUFFER(getgrgid)), &result); | 294 | getgrgid_r(gid, resultbuf, buffer, sizeof(BUFFER(getgr)), &result); |
| 319 | return result; | 295 | return result; |
| 320 | } | 296 | } |
| 321 | 297 | ||
| @@ -346,11 +322,11 @@ int getspuid_r(uid_t uid, struct spwd *__restrict resultbuf, | |||
| 346 | struct spwd *getspuid(uid_t uid) | 322 | struct spwd *getspuid(uid_t uid) |
| 347 | { | 323 | { |
| 348 | struct statics *S; | 324 | struct statics *S; |
| 349 | struct spwd *resultbuf = RESULTBUF(getspuid); | 325 | struct spwd *resultbuf = RESULTBUF(getsp); |
| 350 | char *buffer = BUFFER(getspuid); | 326 | char *buffer = BUFFER(getsp); |
| 351 | struct spwd *result; | 327 | struct spwd *result; |
| 352 | 328 | ||
| 353 | getspuid_r(uid, resultbuf, buffer, sizeof(BUFFER(getspuid)), &result); | 329 | getspuid_r(uid, resultbuf, buffer, sizeof(BUFFER(getsp)), &result); |
| 354 | return result; | 330 | return result; |
| 355 | } | 331 | } |
| 356 | #endif | 332 | #endif |
| @@ -359,11 +335,11 @@ struct spwd *getspuid(uid_t uid) | |||
| 359 | struct passwd *getpwnam(const char *name) | 335 | struct passwd *getpwnam(const char *name) |
| 360 | { | 336 | { |
| 361 | struct statics *S; | 337 | struct statics *S; |
| 362 | struct passwd *resultbuf = RESULTBUF(getpwnam); | 338 | struct passwd *resultbuf = RESULTBUF(getpw); |
| 363 | char *buffer = BUFFER(getpwnam); | 339 | char *buffer = BUFFER(getpw); |
| 364 | struct passwd *result; | 340 | struct passwd *result; |
| 365 | 341 | ||
| 366 | getpwnam_r(name, resultbuf, buffer, sizeof(BUFFER(getpwnam)), &result); | 342 | getpwnam_r(name, resultbuf, buffer, sizeof(BUFFER(getpw)), &result); |
| 367 | return result; | 343 | return result; |
| 368 | } | 344 | } |
| 369 | 345 | ||
| @@ -371,11 +347,11 @@ struct passwd *getpwnam(const char *name) | |||
| 371 | struct group *getgrnam(const char *name) | 347 | struct group *getgrnam(const char *name) |
| 372 | { | 348 | { |
| 373 | struct statics *S; | 349 | struct statics *S; |
| 374 | struct group *resultbuf = RESULTBUF(getgrnam); | 350 | struct group *resultbuf = RESULTBUF(getgr); |
| 375 | char *buffer = BUFFER(getgrnam); | 351 | char *buffer = BUFFER(getgr); |
| 376 | struct group *result; | 352 | struct group *result; |
| 377 | 353 | ||
| 378 | getgrnam_r(name, resultbuf, buffer, sizeof(BUFFER(getgrnam)), &result); | 354 | getgrnam_r(name, resultbuf, buffer, sizeof(BUFFER(getgr)), &result); |
| 379 | return result; | 355 | return result; |
| 380 | } | 356 | } |
| 381 | 357 | ||
| @@ -383,11 +359,11 @@ struct group *getgrnam(const char *name) | |||
| 383 | struct spwd *getspnam(const char *name) | 359 | struct spwd *getspnam(const char *name) |
| 384 | { | 360 | { |
| 385 | struct statics *S; | 361 | struct statics *S; |
| 386 | struct spwd *resultbuf = RESULTBUF(getspnam); | 362 | struct spwd *resultbuf = RESULTBUF(getsp); |
| 387 | char *buffer = BUFFER(getspnam); | 363 | char *buffer = BUFFER(getsp); |
| 388 | struct spwd *result; | 364 | struct spwd *result; |
| 389 | 365 | ||
| 390 | getspnam_r(name, resultbuf, buffer, sizeof(BUFFER(getspnam)), &result); | 366 | getspnam_r(name, resultbuf, buffer, sizeof(BUFFER(getsp)), &result); |
| 391 | return result; | 367 | return result; |
| 392 | } | 368 | } |
| 393 | #endif | 369 | #endif |
