Skip to content

Commit

Permalink
[BZ #6544]
Browse files Browse the repository at this point in the history
	* libio/fmemopen.c: Implement binary mode.  In this mode no NUL
	byte gets added to writes and seeks from the end use the length of
	the buffer and not the currently terminating NUL byte.
  • Loading branch information
Ulrich Drepper committed Aug 14, 2008
1 parent 1bfa05c commit 7b3ba2c
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 4 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
2008-08-13 Ulrich Drepper <drepper@redhat.com>

[BZ #6544]
* libio/fmemopen.c: Implement binary mode. In this mode no NUL
byte gets added to writes and seeks from the end use the length of
the buffer and not the currently terminating NUL byte.

[BZ #6634]
* login/utmp_file.c (getutent_r_file): Take additional parameter.
Set to true if locking failed.
Expand Down
5 changes: 5 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ Version 2.9
* Implement "e" option for popen to open file descriptor with the
close-on-exec flag set. Implemented by Ulrich Drepper.

* Implement "b" mode for fmemopen. In this mode writes writes don't
implicitly add a NUL byte and seeks from the end of the buffer really
use the buffer end, not the string length as the basis.
Implemented by Ulrich Drepper.

* Many functions, exported and internal, now atomically set the close-on-exec
flag when run on a sufficiently new kernel. Implemented by Ulrich Drepper.

Expand Down
11 changes: 7 additions & 4 deletions libio/fmemopen.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* Fmemopen implementation.
Copyright (C) 2000, 2002, 2005, 2006 Free Software Foundation, Inc.
Copyright (C) 2000, 2002, 2005, 2006, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Hanno Mueller, kontakt@hanno.de, 2000.
Contributed by Hanno Mueller, kontakt@hanno.de, 2000.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
Expand Down Expand Up @@ -82,6 +82,7 @@ struct fmemopen_cookie_struct
{
char *buffer;
int mybuffer;
int binmode;
size_t size;
_IO_off64_t pos;
size_t maxpos;
Expand Down Expand Up @@ -120,7 +121,7 @@ fmemopen_write (void *cookie, const char *b, size_t s)

c = (fmemopen_cookie_t *) cookie;

addnullc = s == 0 || b[s - 1] != '\0';
addnullc = c->binmode == 0 && (s == 0 || b[s - 1] != '\0');

if (c->pos + s + addnullc > c->size)
{
Expand Down Expand Up @@ -165,7 +166,7 @@ fmemopen_seek (void *cookie, _IO_off64_t *p, int w)
break;

case SEEK_END:
np = c->maxpos - *p;
np = (c->binmode ? c->size : c->maxpos) - *p;
break;

default:
Expand Down Expand Up @@ -248,6 +249,8 @@ fmemopen (void *buf, size_t len, const char *mode)
else
c->pos = 0;

c->binmode = mode[0] != '\0' && mode[1] == 'b';

iof.read = fmemopen_read;
iof.write = fmemopen_write;
iof.seek = fmemopen_seek;
Expand Down

0 comments on commit 7b3ba2c

Please sign in to comment.