Skip to content

Commit

Permalink
strlcpy() should be defined directly in libtrufflerubytrampoline
Browse files Browse the repository at this point in the history
  • Loading branch information
eregon committed Oct 26, 2023
1 parent 047f6bd commit 17b439b
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/main/c/cext-trampoline/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ LDFLAGS := -m64
ROOT := $(realpath ../../../..)
RUBY_HDR_DIR := $(ROOT)/lib/cext/include

OBJECT_FILES := trampoline.o st.o cext_constants.o
OBJECT_FILES := trampoline.o st.o strlcpy.o cext_constants.o

libtrufflerubytrampoline.$(SOEXT): $(OBJECT_FILES) Makefile
$(Q) $(CC) -shared $(LDFLAGS) -o $@ $(OBJECT_FILES)
Expand Down
51 changes: 51 additions & 0 deletions src/main/c/cext-trampoline/strlcpy.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/* $OpenBSD: strlcpy.c,v 1.12 2015/01/15 03:54:12 millert Exp $ */

/*
* Copyright (c) 1998, 2015 Todd C. Miller <[email protected]>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

#include "ruby/missing.h"
#include <sys/types.h>
#include <string.h>

#ifndef HAVE_STRLCPY
/*
* Copy string src to buffer dst of size dsize. At most dsize-1
* chars will be copied. Always NUL terminates (unless dsize == 0).
* Returns strlen(src); if retval >= dsize, truncation occurred.
*/
size_t strlcpy(char *dst, const char *src, size_t dsize) {
const char *osrc = src;
size_t nleft = dsize;

/* Copy as many bytes as will fit. */
if (nleft != 0) {
while (--nleft != 0) {
if ((*dst++ = *src++) == '\0')
break;
}
}

/* Not enough room in dst, add NUL and traverse rest of src. */
if (nleft == 0) {
if (dsize != 0)
*dst = '\0'; /* NUL-terminate dst */
while (*src++)
;
}

return(src - osrc - 1); /* count does not include NUL */
}
#endif
2 changes: 1 addition & 1 deletion tool/generate-cext-trampoline.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
functions = []

Dir["src/main/c/cext/*.c"].sort.each do |file|
next if %w[cext_constants.c wrappers.c ruby.c st.c].include?(File.basename(file))
next if %w[cext_constants.c wrappers.c ruby.c st.c strlcpy.c].include?(File.basename(file))

contents = File.read(file)
found_functions = contents.scan(function_regexp)
Expand Down

0 comments on commit 17b439b

Please sign in to comment.