static nss_status_t read_group( TFILE *fp,struct group *result, char *buffer,size_t buflen,int *errnop) { int32_t tmpint32,tmp2int32,tmp3int32; size_t bufptr=0; memset(result,0,sizeof(struct group)); if (tio_read(fp,&(tmpint32),(size_t)sizeof(int32_t))) { (void)tio_close(fp); fp=((void *)0); *errnop=2; return NSS_STATUS_UNAVAIL; } if ((bufptr+(size_t)(tmpint32+1))>buflen) { tmpint32=bufptr+(tmpint32+1)-(buflen); *errnop=34; return NSS_STATUS_TRYAGAIN; }; if (tmpint32>0) { if (tio_read(fp,(buffer+bufptr),(size_t)(size_t)tmpint32)) { (void)tio_close(fp); fp=((void *)0); *errnop=2; return NSS_STATUS_UNAVAIL; } } (buffer+bufptr)[tmpint32]='\0'; // adding terminal '\0' after gr_name in buffer (result->gr_name)=(buffer+bufptr); //string gr_name stored to struct group bufptr+=(size_t)(tmpint32+1); if (tio_read(fp,&(tmpint32),(size_t)sizeof(int32_t))) { (void)tio_close(fp); fp=((void *)0); *errnop=2; return NSS_STATUS_UNAVAIL; } if ((bufptr+(size_t)(tmpint32+1))>buflen) { tmpint32=bufptr+(tmpint32+1)-(buflen); *errnop=34; return NSS_STATUS_TRYAGAIN; } if (tmpint32>0) { if (tio_read(fp,(buffer+bufptr),(size_t)(size_t)tmpint32)) { (void)tio_close(fp); fp=((void *)0); *errnop=2; return NSS_STATUS_UNAVAIL; } } (buffer+bufptr)[tmpint32]='\0'; // adding terminal '\0' after gr_passwd in buffer (result->gr_passwd)=(buffer+bufptr); //string gr_passwd stored to struct group bufptr+=(size_t)(tmpint32+1); if (tio_read(fp,&(result->gr_gid),(size_t)sizeof(gid_t))) { //gr_gid directly saved to struct group //(buffer isn't needed) (void)tio_close(fp); fp=((void *)0); *errnop=2; return NSS_STATUS_UNAVAIL; } if (tio_read(fp,&(tmp3int32),(size_t)sizeof(int32_t))) { (void)tio_close(fp); fp=((void *)0); *errnop=2; return NSS_STATUS_UNAVAIL; } tmp2int32=(sizeof(char *)-(((buffer+bufptr)-(char *)((void *)0))%sizeof(char *)))%sizeof(char *); //^^^^^^^^^ // here is computed padding for "array of 'char *'" if ((bufptr+(size_t)(tmp2int32))>buflen) { tmpint32=bufptr+(tmp2int32)-(buflen); *errnop=34; return NSS_STATUS_TRYAGAIN; } bufptr+=(size_t)(tmp2int32); if ((bufptr+(size_t)((size_t)(tmp3int32+1)*sizeof(char *)))>buflen) { tmpint32=bufptr+((size_t)(tmp3int32+1)*sizeof(char *))-(buflen); *errnop=34; return NSS_STATUS_TRYAGAIN; } (result->gr_mem)=(char * *)(buffer+bufptr); bufptr+=(size_t)((size_t)(tmp3int32+1)*sizeof(char *)); for (tmp2int32=0; tmp2int32buflen) { tmpint32=bufptr+(tmpint32+1)-(buflen); *errnop=34; return NSS_STATUS_TRYAGAIN; } if (tmpint32>0) { if (tio_read(fp,(buffer+bufptr),(size_t)(size_t)tmpint32)) { (void)tio_close(fp); fp=((void *)0); *errnop=2; return NSS_STATUS_UNAVAIL; } } (buffer+bufptr)[tmpint32]='\0'; ((result->gr_mem)[tmp2int32])=(buffer+bufptr); bufptr+=(size_t)(tmpint32+1); } (result->gr_mem)[tmp2int32]=((void *)0); return NSS_STATUS_SUCCESS; }