rozy
Offset napravim tako da sam napisao funkciju koja čita točno neki broj bajtova. Sam sam ju pisao jer u tom trenutku nisam bio svjestan da u knjizi postoji implementacija toga na stranici 40 (readn
). Implementacija iz knjige:
ssize_t
readn(int fd, void* vptr, size_t n){
size_t nleft;
ssize_t nread;
char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nread = read(fd, ptr, nleft)) < 0) {
if(errno == EINTR)
nread = 0; /* and call read() again */
else
return (-1);
} else if (nread == 0) {
break; /* EOF */
}
nleft -= nread;
ptr += nread;
}
return (n - nleft); /* return >= 0 */
}
Za filename sam napisao drugu funkciju koja čita bajt po bajt dok ne naiđe na '\0'
. Ona je donekle slična ovoj readn
, samo što uvijek čita 1 bajt i pointer uvećava za 1 dokle god ne naiđe na '\0'
.
Kako bih izbjegao mogućnost buffer overflowa, funkcija prima i maksimalnu duljinu filenamea i prestaje ako pročita toliko bajtova, a ne naiđe na '\0'
.