getpwent.c (129349) | getpwent.c (158115) |
---|---|
1/*- 2 * Copyright (c) 2003 Networks Associates Technology, Inc. 3 * All rights reserved. 4 * 5 * This software was developed for the FreeBSD Project by 6 * Jacques A. Vidrine, Safeport Network Services, and Network 7 * Associates Laboratories, the Security Research Division of Network 8 * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 --- 17 unchanged lines hidden (view full) --- 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 */ 33#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2003 Networks Associates Technology, Inc. 3 * All rights reserved. 4 * 5 * This software was developed for the FreeBSD Project by 6 * Jacques A. Vidrine, Safeport Network Services, and Network 7 * Associates Laboratories, the Security Research Division of Network 8 * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 --- 17 unchanged lines hidden (view full) --- 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 */ 33#include <sys/cdefs.h> |
34__FBSDID("$FreeBSD: head/lib/libc/gen/getpwent.c 129349 2004-05-17 18:27:05Z kientzle $"); | 34__FBSDID("$FreeBSD: head/lib/libc/gen/getpwent.c 158115 2006-04-28 12:03:38Z ume $"); |
35 36#include "namespace.h" 37#include <sys/param.h> 38#ifdef YP 39#include <rpc/rpc.h> 40#include <rpcsvc/yp_prot.h> 41#include <rpcsvc/ypclnt.h> 42#endif --- 13 unchanged lines hidden (view full) --- 56#include <string.h> 57#include <syslog.h> 58#include <unistd.h> 59#include "un-namespace.h" 60#include <db.h> 61#include "libc_private.h" 62#include "pw_scan.h" 63#include "nss_tls.h" | 35 36#include "namespace.h" 37#include <sys/param.h> 38#ifdef YP 39#include <rpc/rpc.h> 40#include <rpcsvc/yp_prot.h> 41#include <rpcsvc/ypclnt.h> 42#endif --- 13 unchanged lines hidden (view full) --- 56#include <string.h> 57#include <syslog.h> 58#include <unistd.h> 59#include "un-namespace.h" 60#include <db.h> 61#include "libc_private.h" 62#include "pw_scan.h" 63#include "nss_tls.h" |
64#ifdef NS_CACHING 65#include "nscache.h" 66#endif |
|
64 65#ifndef CTASSERT 66#define CTASSERT(x) _CTASSERT(x, __LINE__) 67#define _CTASSERT(x, y) __CTASSERT(x, y) 68#define __CTASSERT(x, y) typedef char __assert_ ## y [(x) ? 1 : -1] 69#endif 70 71/* Counter as stored in /etc/pwd.db */ --- 118 unchanged lines hidden (view full) --- 190static int compat_passwd(void *, void *, va_list); 191static void compat_clear_template(struct passwd *); 192static int compat_set_template(struct passwd *, struct passwd *); 193static int compat_use_template(struct passwd *, struct passwd *, char *, 194 size_t); 195static int compat_redispatch(struct compat_state *, enum nss_lookup_type, 196 enum nss_lookup_type, const char *, const char *, uid_t, 197 struct passwd *, char *, size_t, int *); | 67 68#ifndef CTASSERT 69#define CTASSERT(x) _CTASSERT(x, __LINE__) 70#define _CTASSERT(x, y) __CTASSERT(x, y) 71#define __CTASSERT(x, y) typedef char __assert_ ## y [(x) ? 1 : -1] 72#endif 73 74/* Counter as stored in /etc/pwd.db */ --- 118 unchanged lines hidden (view full) --- 193static int compat_passwd(void *, void *, va_list); 194static void compat_clear_template(struct passwd *); 195static int compat_set_template(struct passwd *, struct passwd *); 196static int compat_use_template(struct passwd *, struct passwd *, char *, 197 size_t); 198static int compat_redispatch(struct compat_state *, enum nss_lookup_type, 199 enum nss_lookup_type, const char *, const char *, uid_t, 200 struct passwd *, char *, size_t, int *); |
201 202#ifdef NS_CACHING 203static int pwd_id_func(char *, size_t *, va_list ap, void *); 204static int pwd_marshal_func(char *, size_t *, void *, va_list, void *); 205static int pwd_unmarshal_func(char *, size_t, void *, va_list, void *); 206 207static int 208pwd_id_func(char *buffer, size_t *buffer_size, va_list ap, void *cache_mdata) 209{ 210 char *name; 211 uid_t uid; 212 size_t size, desired_size; 213 int res = NS_UNAVAIL; 214 enum nss_lookup_type lookup_type; 215 216 lookup_type = (enum nss_lookup_type)cache_mdata; 217 switch (lookup_type) { 218 case nss_lt_name: 219 name = va_arg(ap, char *); 220 size = strlen(name); 221 desired_size = sizeof(enum nss_lookup_type) + size + 1; 222 if (desired_size > *buffer_size) { 223 res = NS_RETURN; 224 goto fin; 225 } 226 227 memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 228 memcpy(buffer + sizeof(enum nss_lookup_type), name, size + 1); 229 230 res = NS_SUCCESS; 231 break; 232 case nss_lt_id: 233 uid = va_arg(ap, uid_t); 234 desired_size = sizeof(enum nss_lookup_type) + sizeof(uid_t); 235 if (desired_size > *buffer_size) { 236 res = NS_RETURN; 237 goto fin; 238 } 239 240 memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 241 memcpy(buffer + sizeof(enum nss_lookup_type), &uid, 242 sizeof(uid_t)); 243 244 res = NS_SUCCESS; 245 break; 246 default: 247 /* should be unreachable */ 248 return (NS_UNAVAIL); 249 } 250 251fin: 252 *buffer_size = desired_size; 253 return (res); 254} 255 256static int 257pwd_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap, 258 void *cache_mdata) 259{ 260 char *name; 261 uid_t uid; 262 struct passwd *pwd; 263 char *orig_buf; 264 size_t orig_buf_size; 265 266 struct passwd new_pwd; 267 size_t desired_size, size; 268 char *p; 269 270 switch ((enum nss_lookup_type)cache_mdata) { 271 case nss_lt_name: 272 name = va_arg(ap, char *); 273 break; 274 case nss_lt_id: 275 uid = va_arg(ap, uid_t); 276 break; 277 case nss_lt_all: 278 break; 279 default: 280 /* should be unreachable */ 281 return (NS_UNAVAIL); 282 } 283 284 pwd = va_arg(ap, struct passwd *); 285 orig_buf = va_arg(ap, char *); 286 orig_buf_size = va_arg(ap, size_t); 287 288 desired_size = sizeof(struct passwd) + sizeof(char *) + 289 strlen(pwd->pw_name) + 1; 290 if (pwd->pw_passwd != NULL) 291 desired_size += strlen(pwd->pw_passwd) + 1; 292 if (pwd->pw_class != NULL) 293 desired_size += strlen(pwd->pw_class) + 1; 294 if (pwd->pw_gecos != NULL) 295 desired_size += strlen(pwd->pw_gecos) + 1; 296 if (pwd->pw_dir != NULL) 297 desired_size += strlen(pwd->pw_dir) + 1; 298 if (pwd->pw_shell != NULL) 299 desired_size += strlen(pwd->pw_shell) + 1; 300 301 if (*buffer_size < desired_size) { 302 /* this assignment is here for future use */ 303 *buffer_size = desired_size; 304 return (NS_RETURN); 305 } 306 307 memcpy(&new_pwd, pwd, sizeof(struct passwd)); 308 memset(buffer, 0, desired_size); 309 310 *buffer_size = desired_size; 311 p = buffer + sizeof(struct passwd) + sizeof(char *); 312 memcpy(buffer + sizeof(struct passwd), &p, sizeof(char *)); 313 314 if (new_pwd.pw_name != NULL) { 315 size = strlen(new_pwd.pw_name); 316 memcpy(p, new_pwd.pw_name, size); 317 new_pwd.pw_name = p; 318 p += size + 1; 319 } 320 321 if (new_pwd.pw_passwd != NULL) { 322 size = strlen(new_pwd.pw_passwd); 323 memcpy(p, new_pwd.pw_passwd, size); 324 new_pwd.pw_passwd = p; 325 p += size + 1; 326 } 327 328 if (new_pwd.pw_class != NULL) { 329 size = strlen(new_pwd.pw_class); 330 memcpy(p, new_pwd.pw_class, size); 331 new_pwd.pw_class = p; 332 p += size + 1; 333 } 334 335 if (new_pwd.pw_gecos != NULL) { 336 size = strlen(new_pwd.pw_gecos); 337 memcpy(p, new_pwd.pw_gecos, size); 338 new_pwd.pw_gecos = p; 339 p += size + 1; 340 } 341 342 if (new_pwd.pw_dir != NULL) { 343 size = strlen(new_pwd.pw_dir); 344 memcpy(p, new_pwd.pw_dir, size); 345 new_pwd.pw_dir = p; 346 p += size + 1; 347 } 348 349 if (new_pwd.pw_shell != NULL) { 350 size = strlen(new_pwd.pw_shell); 351 memcpy(p, new_pwd.pw_shell, size); 352 new_pwd.pw_shell = p; 353 p += size + 1; 354 } 355 356 memcpy(buffer, &new_pwd, sizeof(struct passwd)); 357 return (NS_SUCCESS); 358} 359 360static int 361pwd_unmarshal_func(char *buffer, size_t buffer_size, void *retval, va_list ap, 362 void *cache_mdata) 363{ 364 char *name; 365 uid_t uid; 366 struct passwd *pwd; 367 char *orig_buf; 368 size_t orig_buf_size; 369 int *ret_errno; 370 371 char *p; 372 373 switch ((enum nss_lookup_type)cache_mdata) { 374 case nss_lt_name: 375 name = va_arg(ap, char *); 376 break; 377 case nss_lt_id: 378 uid = va_arg(ap, uid_t); 379 break; 380 case nss_lt_all: 381 break; 382 default: 383 /* should be unreachable */ 384 return (NS_UNAVAIL); 385 } 386 387 pwd = va_arg(ap, struct passwd *); 388 orig_buf = va_arg(ap, char *); 389 orig_buf_size = va_arg(ap, size_t); 390 ret_errno = va_arg(ap, int *); 391 392 if (orig_buf_size < 393 buffer_size - sizeof(struct passwd) - sizeof(char *)) { 394 *ret_errno = ERANGE; 395 return (NS_RETURN); 396 } 397 398 memcpy(pwd, buffer, sizeof(struct passwd)); 399 memcpy(&p, buffer + sizeof(struct passwd), sizeof(char *)); 400 memcpy(orig_buf, buffer + sizeof(struct passwd) + sizeof(char *), 401 buffer_size - sizeof(struct passwd) - sizeof(char *)); 402 403 NS_APPLY_OFFSET(pwd->pw_name, orig_buf, p, char *); 404 NS_APPLY_OFFSET(pwd->pw_passwd, orig_buf, p, char *); 405 NS_APPLY_OFFSET(pwd->pw_class, orig_buf, p, char *); 406 NS_APPLY_OFFSET(pwd->pw_gecos, orig_buf, p, char *); 407 NS_APPLY_OFFSET(pwd->pw_dir, orig_buf, p, char *); 408 NS_APPLY_OFFSET(pwd->pw_shell, orig_buf, p, char *); 409 410 if (retval != NULL) 411 *((struct passwd **)retval) = pwd; 412 413 return (NS_SUCCESS); 414} 415 416NSS_MP_CACHE_HANDLING(passwd); 417#endif /* NS_CACHING */ 418 |
|
198void 199setpwent(void) 200{ | 419void 420setpwent(void) 421{ |
422#ifdef NS_CACHING 423 static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 424 passwd, (void *)nss_lt_all, 425 NULL, NULL); 426#endif 427 |
|
201 static const ns_dtab dtab[] = { 202 { NSSRC_FILES, files_setpwent, (void *)SETPWENT }, 203#ifdef HESIOD 204 { NSSRC_DNS, dns_setpwent, (void *)SETPWENT }, 205#endif 206#ifdef YP 207 { NSSRC_NIS, nis_setpwent, (void *)SETPWENT }, 208#endif 209 { NSSRC_COMPAT, compat_setpwent, (void *)SETPWENT }, | 428 static const ns_dtab dtab[] = { 429 { NSSRC_FILES, files_setpwent, (void *)SETPWENT }, 430#ifdef HESIOD 431 { NSSRC_DNS, dns_setpwent, (void *)SETPWENT }, 432#endif 433#ifdef YP 434 { NSSRC_NIS, nis_setpwent, (void *)SETPWENT }, 435#endif 436 { NSSRC_COMPAT, compat_setpwent, (void *)SETPWENT }, |
437#ifdef NS_CACHING 438 NS_CACHE_CB(&cache_info) 439#endif |
|
210 { NULL, NULL, NULL } 211 }; 212 (void)_nsdispatch(NULL, dtab, NSDB_PASSWD, "setpwent", defaultsrc, 0); 213} 214 215 216int 217setpassent(int stayopen) 218{ | 440 { NULL, NULL, NULL } 441 }; 442 (void)_nsdispatch(NULL, dtab, NSDB_PASSWD, "setpwent", defaultsrc, 0); 443} 444 445 446int 447setpassent(int stayopen) 448{ |
449#ifdef NS_CACHING 450 static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 451 passwd, (void *)nss_lt_all, 452 NULL, NULL); 453#endif 454 |
|
219 static const ns_dtab dtab[] = { 220 { NSSRC_FILES, files_setpwent, (void *)SETPWENT }, 221#ifdef HESIOD 222 { NSSRC_DNS, dns_setpwent, (void *)SETPWENT }, 223#endif 224#ifdef YP 225 { NSSRC_NIS, nis_setpwent, (void *)SETPWENT }, 226#endif 227 { NSSRC_COMPAT, compat_setpwent, (void *)SETPWENT }, | 455 static const ns_dtab dtab[] = { 456 { NSSRC_FILES, files_setpwent, (void *)SETPWENT }, 457#ifdef HESIOD 458 { NSSRC_DNS, dns_setpwent, (void *)SETPWENT }, 459#endif 460#ifdef YP 461 { NSSRC_NIS, nis_setpwent, (void *)SETPWENT }, 462#endif 463 { NSSRC_COMPAT, compat_setpwent, (void *)SETPWENT }, |
464#ifdef NS_CACHING 465 NS_CACHE_CB(&cache_info) 466#endif |
|
228 { NULL, NULL, NULL } 229 }; 230 (void)_nsdispatch(NULL, dtab, NSDB_PASSWD, "setpwent", defaultsrc, 231 stayopen); 232 return (1); 233} 234 235 236void 237endpwent(void) 238{ | 467 { NULL, NULL, NULL } 468 }; 469 (void)_nsdispatch(NULL, dtab, NSDB_PASSWD, "setpwent", defaultsrc, 470 stayopen); 471 return (1); 472} 473 474 475void 476endpwent(void) 477{ |
478#ifdef NS_CACHING 479 static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 480 passwd, (void *)nss_lt_all, 481 NULL, NULL); 482#endif 483 |
|
239 static const ns_dtab dtab[] = { 240 { NSSRC_FILES, files_setpwent, (void *)ENDPWENT }, 241#ifdef HESIOD 242 { NSSRC_DNS, dns_setpwent, (void *)ENDPWENT }, 243#endif 244#ifdef YP 245 { NSSRC_NIS, nis_setpwent, (void *)ENDPWENT }, 246#endif 247 { NSSRC_COMPAT, compat_setpwent, (void *)ENDPWENT }, | 484 static const ns_dtab dtab[] = { 485 { NSSRC_FILES, files_setpwent, (void *)ENDPWENT }, 486#ifdef HESIOD 487 { NSSRC_DNS, dns_setpwent, (void *)ENDPWENT }, 488#endif 489#ifdef YP 490 { NSSRC_NIS, nis_setpwent, (void *)ENDPWENT }, 491#endif 492 { NSSRC_COMPAT, compat_setpwent, (void *)ENDPWENT }, |
493#ifdef NS_CACHING 494 NS_CACHE_CB(&cache_info) 495#endif |
|
248 { NULL, NULL, NULL } 249 }; 250 (void)_nsdispatch(NULL, dtab, NSDB_PASSWD, "endpwent", defaultsrc); 251} 252 253 254int 255getpwent_r(struct passwd *pwd, char *buffer, size_t bufsize, 256 struct passwd **result) 257{ | 496 { NULL, NULL, NULL } 497 }; 498 (void)_nsdispatch(NULL, dtab, NSDB_PASSWD, "endpwent", defaultsrc); 499} 500 501 502int 503getpwent_r(struct passwd *pwd, char *buffer, size_t bufsize, 504 struct passwd **result) 505{ |
506#ifdef NS_CACHING 507 static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 508 passwd, (void *)nss_lt_all, 509 pwd_marshal_func, pwd_unmarshal_func); 510#endif 511 |
|
258 static const ns_dtab dtab[] = { 259 { NSSRC_FILES, files_passwd, (void *)nss_lt_all }, 260#ifdef HESIOD 261 { NSSRC_DNS, dns_passwd, (void *)nss_lt_all }, 262#endif 263#ifdef YP 264 { NSSRC_NIS, nis_passwd, (void *)nss_lt_all }, 265#endif 266 { NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all }, | 512 static const ns_dtab dtab[] = { 513 { NSSRC_FILES, files_passwd, (void *)nss_lt_all }, 514#ifdef HESIOD 515 { NSSRC_DNS, dns_passwd, (void *)nss_lt_all }, 516#endif 517#ifdef YP 518 { NSSRC_NIS, nis_passwd, (void *)nss_lt_all }, 519#endif 520 { NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all }, |
521#ifdef NS_CACHING 522 NS_CACHE_CB(&cache_info) 523#endif |
|
267 { NULL, NULL, NULL } 268 }; 269 int rv, ret_errno; 270 271 pwd_init(pwd); 272 ret_errno = 0; 273 *result = NULL; 274 rv = _nsdispatch(result, dtab, NSDB_PASSWD, "getpwent_r", defaultsrc, --- 4 unchanged lines hidden (view full) --- 279 return (ret_errno); 280} 281 282 283int 284getpwnam_r(const char *name, struct passwd *pwd, char *buffer, size_t bufsize, 285 struct passwd **result) 286{ | 524 { NULL, NULL, NULL } 525 }; 526 int rv, ret_errno; 527 528 pwd_init(pwd); 529 ret_errno = 0; 530 *result = NULL; 531 rv = _nsdispatch(result, dtab, NSDB_PASSWD, "getpwent_r", defaultsrc, --- 4 unchanged lines hidden (view full) --- 536 return (ret_errno); 537} 538 539 540int 541getpwnam_r(const char *name, struct passwd *pwd, char *buffer, size_t bufsize, 542 struct passwd **result) 543{ |
544#ifdef NS_CACHING 545 static const nss_cache_info cache_info = 546 NS_COMMON_CACHE_INFO_INITIALIZER( 547 passwd, (void *)nss_lt_name, 548 pwd_id_func, pwd_marshal_func, pwd_unmarshal_func); 549#endif 550 |
|
287 static const ns_dtab dtab[] = { 288 { NSSRC_FILES, files_passwd, (void *)nss_lt_name }, 289#ifdef HESIOD 290 { NSSRC_DNS, dns_passwd, (void *)nss_lt_name }, 291#endif 292#ifdef YP 293 { NSSRC_NIS, nis_passwd, (void *)nss_lt_name }, 294#endif 295 { NSSRC_COMPAT, compat_passwd, (void *)nss_lt_name }, | 551 static const ns_dtab dtab[] = { 552 { NSSRC_FILES, files_passwd, (void *)nss_lt_name }, 553#ifdef HESIOD 554 { NSSRC_DNS, dns_passwd, (void *)nss_lt_name }, 555#endif 556#ifdef YP 557 { NSSRC_NIS, nis_passwd, (void *)nss_lt_name }, 558#endif 559 { NSSRC_COMPAT, compat_passwd, (void *)nss_lt_name }, |
560#ifdef NS_CACHING 561 NS_CACHE_CB(&cache_info) 562#endif |
|
296 { NULL, NULL, NULL } 297 }; 298 int rv, ret_errno; 299 300 pwd_init(pwd); 301 ret_errno = 0; 302 *result = NULL; 303 rv = _nsdispatch(result, dtab, NSDB_PASSWD, "getpwnam_r", defaultsrc, --- 4 unchanged lines hidden (view full) --- 308 return (ret_errno); 309} 310 311 312int 313getpwuid_r(uid_t uid, struct passwd *pwd, char *buffer, size_t bufsize, 314 struct passwd **result) 315{ | 563 { NULL, NULL, NULL } 564 }; 565 int rv, ret_errno; 566 567 pwd_init(pwd); 568 ret_errno = 0; 569 *result = NULL; 570 rv = _nsdispatch(result, dtab, NSDB_PASSWD, "getpwnam_r", defaultsrc, --- 4 unchanged lines hidden (view full) --- 575 return (ret_errno); 576} 577 578 579int 580getpwuid_r(uid_t uid, struct passwd *pwd, char *buffer, size_t bufsize, 581 struct passwd **result) 582{ |
583#ifdef NS_CACHING 584 static const nss_cache_info cache_info = 585 NS_COMMON_CACHE_INFO_INITIALIZER( 586 passwd, (void *)nss_lt_id, 587 pwd_id_func, pwd_marshal_func, pwd_unmarshal_func); 588#endif 589 |
|
316 static const ns_dtab dtab[] = { 317 { NSSRC_FILES, files_passwd, (void *)nss_lt_id }, 318#ifdef HESIOD 319 { NSSRC_DNS, dns_passwd, (void *)nss_lt_id }, 320#endif 321#ifdef YP 322 { NSSRC_NIS, nis_passwd, (void *)nss_lt_id }, 323#endif 324 { NSSRC_COMPAT, compat_passwd, (void *)nss_lt_id }, | 590 static const ns_dtab dtab[] = { 591 { NSSRC_FILES, files_passwd, (void *)nss_lt_id }, 592#ifdef HESIOD 593 { NSSRC_DNS, dns_passwd, (void *)nss_lt_id }, 594#endif 595#ifdef YP 596 { NSSRC_NIS, nis_passwd, (void *)nss_lt_id }, 597#endif 598 { NSSRC_COMPAT, compat_passwd, (void *)nss_lt_id }, |
599#ifdef NS_CACHING 600 NS_CACHE_CB(&cache_info) 601#endif |
|
325 { NULL, NULL, NULL } 326 }; 327 int rv, ret_errno; 328 329 pwd_init(pwd); 330 ret_errno = 0; 331 *result = NULL; 332 rv = _nsdispatch(result, dtab, NSDB_PASSWD, "getpwuid_r", defaultsrc, --- 1400 unchanged lines hidden --- | 602 { NULL, NULL, NULL } 603 }; 604 int rv, ret_errno; 605 606 pwd_init(pwd); 607 ret_errno = 0; 608 *result = NULL; 609 rv = _nsdispatch(result, dtab, NSDB_PASSWD, "getpwuid_r", defaultsrc, --- 1400 unchanged lines hidden --- |