From 94d5ae9f713854eae65828df8d7144b5260a1674 Mon Sep 17 00:00:00 2001 From: steven-jenkins Date: Tue, 12 Feb 2002 15:49:39 +0000 Subject: [PATCH] GC_PROTECT'ed the necessary variables (specifically, where >1 arg to a function 'may GC') --- scsh/dirstuff1.c | 9 +++++---- scsh/flock1.c | 37 ++++++++++++++++++++++++++++--------- scsh/network1.c | 47 +++++++++++++++++++++++++++++------------------ scsh/time1.c | 13 ------------- scsh/tty1.c | 46 +++++++++++++++++++++++++++++----------------- 5 files changed, 91 insertions(+), 61 deletions(-) diff --git a/scsh/dirstuff1.c b/scsh/dirstuff1.c index 86d0379..1b4d576 100644 --- a/scsh/dirstuff1.c +++ b/scsh/dirstuff1.c @@ -19,10 +19,11 @@ s48_value open_dir(s48_value sch_dirname) struct dirent *dirent; DIR *d; s48_value dirlist = S48_NULL; + s48_value sch_d_name = S48_UNSPECIFIC; - S48_DECLARE_GC_PROTECT(1); + S48_DECLARE_GC_PROTECT(2); - S48_GC_PROTECT_1(dirlist); + S48_GC_PROTECT_2(dirlist, sch_d_name); if( NULL == (d = opendir(s48_extract_string (sch_dirname))) ) s48_raise_os_error_1 (errno, sch_dirname); @@ -31,8 +32,8 @@ s48_value open_dir(s48_value sch_dirname) if((strcmp(dirent->d_name,".") == 0) || (strcmp(dirent->d_name,"..") == 0)) continue; - dirlist = s48_cons (s48_enter_string (dirent->d_name), - dirlist); + sch_d_name = s48_enter_string(dirent->d_name); + dirlist = s48_cons (sch_d_name, dirlist); } if (closedir(d) == -1) diff --git a/scsh/flock1.c b/scsh/flock1.c index 821f214..0e2dc5d 100644 --- a/scsh/flock1.c +++ b/scsh/flock1.c @@ -34,21 +34,40 @@ s48_value get_lock(s48_value fd, s48_value cmd, s48_value type, { struct flock lock; int ret; + s48_value sch_type = S48_UNSPECIFIC; + s48_value sch_whence = S48_UNSPECIFIC; + s48_value sch_start = S48_UNSPECIFIC; + s48_value sch_len = S48_UNSPECIFIC; + s48_value sch_pid = S48_UNSPECIFIC; + s48_value sch_retval = S48_UNSPECIFIC; + + S48_DECLARE_GC_PROTECT(6); + + S48_GC_PROTECT_6(sch_type, sch_whence, sch_start, sch_len, + sch_pid, sch_retval); + lock.l_type = s48_extract_integer (type); lock.l_whence = s48_extract_integer (whence); lock.l_start = s48_extract_integer (start); lock.l_len = s48_extract_integer (len); ret = fcntl(s48_extract_fixnum (fd), F_GETLK, &lock); - if (ret == -1) + if (ret == -1) { + S48_GC_UNPROTECT(); s48_raise_os_error_6 (errno, fd, cmd, type, whence, start, len); - return - s48_cons (s48_enter_integer (lock.l_type), - s48_cons (s48_enter_integer (lock.l_whence), - s48_cons (s48_enter_integer (lock.l_start), - s48_cons (s48_enter_integer (lock.l_len), - s48_cons - (s48_enter_integer (lock.l_pid), - S48_NULL))))); + } else { + + sch_type = s48_enter_integer (lock.l_type); + sch_whence = s48_enter_integer (lock.l_whence); + sch_start = s48_enter_integer (lock.l_start); + sch_len = s48_enter_integer (lock.l_len); + sch_pid = s48_enter_integer (lock.l_pid); + + sch_retval = s48_list_5(sch_type, sch_whence, sch_start, sch_len, + sch_pid); + S48_GC_UNPROTECT(); + + return sch_retval; + } } void s48_init_flock(void) diff --git a/scsh/network1.c b/scsh/network1.c index 3eaddb5..11844fb 100644 --- a/scsh/network1.c +++ b/scsh/network1.c @@ -523,9 +523,11 @@ s48_value host_ent2host_info (struct hostent * host) { s48_value host_info = S48_FALSE; s48_value list = S48_FALSE; + s48_value sch_h_aliases = S48_UNSPECIFIC; + s48_value sch_h_addr_elt = S48_UNSPECIFIC; long * ptr; int i; - S48_DECLARE_GC_PROTECT (2); + S48_DECLARE_GC_PROTECT (4); if(host==NULL) { @@ -538,7 +540,7 @@ s48_value host_ent2host_info (struct hostent * host) host_info_type_binding = s48_get_imported_binding ("host-info-type"); } - S48_GC_PROTECT_2 (host_info, list); + S48_GC_PROTECT_4 (host_info, list, sch_h_aliases, sch_h_addr_elt); host_info = s48_make_record (host_info_type_binding); S48_RECORD_SET (host_info, 0, s48_enter_string (host->h_name)); @@ -548,7 +550,8 @@ s48_value host_ent2host_info (struct hostent * host) i = 0; while (*ptr) { - list = s48_cons (s48_enter_string (host->h_aliases[i]), list); + sch_h_aliases = s48_enter_string (host->h_aliases[i]); + list = s48_cons (sch_h_aliases, list); ptr++; i ++; } @@ -560,9 +563,11 @@ s48_value host_ent2host_info (struct hostent * host) i = 0; while (*ptr) { + sch_h_addr_elt = + s48_enter_unsigned_integer (ntohl ((unsigned long) *(long *)(host->h_addr_list[i]))); + list = - s48_cons (s48_enter_unsigned_integer (ntohl ((unsigned long) *(long *)(host->h_addr_list[i]))), - list); + s48_cons (sch_h_addr_elt, list); ptr++; i++; } @@ -609,9 +614,10 @@ s48_value netent2net_info(struct netent *net) { s48_value network_info = S48_FALSE; s48_value list = S48_FALSE; + s48_value sch_n_alias = S48_UNSPECIFIC; long * ptr; int i; - S48_DECLARE_GC_PROTECT (2); + S48_DECLARE_GC_PROTECT (3); if (net==NULL) return S48_FALSE; @@ -621,7 +627,7 @@ s48_value netent2net_info(struct netent *net) network_info_type_binding = s48_get_imported_binding ("network-info-type"); } - S48_GC_PROTECT_2 (network_info, list); + S48_GC_PROTECT_3 (network_info, list, sch_n_alias); network_info = s48_make_record (network_info_type_binding); S48_RECORD_SET (network_info, 0, s48_enter_string (net->n_name)); @@ -630,8 +636,9 @@ s48_value netent2net_info(struct netent *net) list = S48_NULL; i = 0; while (*ptr) - { - list = s48_cons (s48_enter_string (net->n_aliases[i]), list); + { + sch_n_alias = s48_enter_string (net->n_aliases[i]); + list = s48_cons (sch_n_alias, list); ptr++; i++; } @@ -670,9 +677,10 @@ s48_value servent2service_info(struct servent *serv) { s48_value service_info = S48_FALSE; s48_value list = S48_FALSE; + s48_value sch_s_alias = S48_UNSPECIFIC; long * ptr; int i; - S48_DECLARE_GC_PROTECT (2); + S48_DECLARE_GC_PROTECT (3); if (serv==NULL) return S48_FALSE; @@ -682,7 +690,7 @@ s48_value servent2service_info(struct servent *serv) service_info_type_binding = s48_get_imported_binding ("service-info-type"); } - S48_GC_PROTECT_2 (service_info, list); + S48_GC_PROTECT_3 (service_info, list, sch_s_alias); service_info = s48_make_record (service_info_type_binding); @@ -693,9 +701,10 @@ s48_value servent2service_info(struct servent *serv) i = 0; while (*ptr) { - list = s48_cons (s48_enter_string (serv->s_aliases[i]), list); - ptr++; - i++; + sch_s_alias = s48_enter_string (serv->s_aliases[i]); + list = s48_cons (sch_s_alias, list); + ptr++; + i++; } S48_RECORD_SET (service_info, 1, list); @@ -746,6 +755,7 @@ s48_value protoent2protocol_info(struct protoent *proto) { s48_value protocol_info = S48_FALSE; s48_value list = S48_FALSE; + s48_value sch_p_alias = S48_UNSPECIFIC; long * ptr; int i; S48_DECLARE_GC_PROTECT (2); @@ -758,7 +768,7 @@ s48_value protoent2protocol_info(struct protoent *proto) protocol_info_type_binding = s48_get_imported_binding ("protocol-info-type"); } - S48_GC_PROTECT_2 (protocol_info, list); + S48_GC_PROTECT_3 (protocol_info, list, sch_p_alias); protocol_info = s48_make_record (protocol_info_type_binding); @@ -769,9 +779,10 @@ s48_value protoent2protocol_info(struct protoent *proto) i = 0; while (*ptr) { - list = s48_cons (s48_enter_string (proto->p_aliases[i]), list); - ptr++; - i++; + sch_p_alias = s48_enter_string (proto->p_aliases[i]); + list = s48_cons (sch_p_alias, list); + ptr++; + i++; } S48_RECORD_SET (protocol_info, 1, list); diff --git a/scsh/time1.c b/scsh/time1.c index ee5acd7..f61c08c 100644 --- a/scsh/time1.c +++ b/scsh/time1.c @@ -113,19 +113,6 @@ s48_value scheme_time() return s48_enter_integer (t); } -/* should be part of the FFI interface */ -s48_value s48_list_11 (s48_value e1, s48_value e2, s48_value e3, - s48_value e4, s48_value e5, s48_value e6, - s48_value e7, s48_value e8, s48_value e9, - s48_value e10, s48_value e11) -{ - return - s48_cons (e1, s48_cons (e2, s48_cons (e3, s48_cons (e4, s48_cons - (e5, s48_cons (e6, s48_cons (e7, s48_cons (e8, s48_cons (e9, - s48_cons (e10, s48_cons (e11, S48_NULL))))))))))); -} - - /* Zone: ** #f Local time ** int Offset from GMT in seconds. diff --git a/scsh/tty1.c b/scsh/tty1.c index 58559d8..fe50e56 100644 --- a/scsh/tty1.c +++ b/scsh/tty1.c @@ -29,14 +29,6 @@ #include "tty1.h" /* Make sure the .h interface agrees with the code. */ /*****************************************************************************/ -/* should be part of the FFI interface */ -s48_value s48_list_6 (s48_value e1, s48_value e2, s48_value e3, - s48_value e4, s48_value e5, s48_value e6) -{ - return - s48_cons (e1, s48_cons (e2, s48_cons (e3, s48_cons (e4, s48_cons - (e5, s48_cons (e6, S48_NULL)))))); -} s48_value scheme_tcgetattr(s48_value sch_fd, s48_value sch_control_chars) /* int *iflag, @@ -48,19 +40,39 @@ s48_value scheme_tcgetattr(s48_value sch_fd, s48_value sch_control_chars) struct termios t; int result = tcgetattr(s48_extract_fixnum (sch_fd), &t); int i; + s48_value sch_iflag = S48_UNSPECIFIC; + s48_value sch_oflag = S48_UNSPECIFIC; + s48_value sch_cflag = S48_UNSPECIFIC; + s48_value sch_lflag = S48_UNSPECIFIC; + s48_value sch_ispeed = S48_UNSPECIFIC; + s48_value sch_ospeed = S48_UNSPECIFIC; + s48_value sch_retval = S48_UNSPECIFIC; + S48_DECLARE_GC_PROTECT(6); - if (result == -1) + S48_GC_PROTECT_6(sch_iflag, sch_oflag, sch_cflag, sch_lflag, sch_ispeed, + sch_ospeed); + + if (result == -1) { + S48_GC_UNPROTECT(); s48_raise_os_error_2 (errno, sch_fd, sch_control_chars); - + } + for (i = 0; i < NCCS; i++) S48_STRING_SET(sch_control_chars, i, t.c_cc[i]); - return - s48_list_6 (s48_enter_integer (t.c_iflag), - s48_enter_integer (t.c_oflag), - s48_enter_integer (t.c_cflag), - s48_enter_integer (t.c_lflag), - s48_enter_integer (cfgetispeed(&t)), - s48_enter_integer (cfgetospeed(&t))); + { + sch_iflag = s48_enter_integer(t.c_iflag); + sch_oflag = s48_enter_integer(t.c_oflag); + sch_cflag = s48_enter_integer(t.c_cflag); + sch_lflag = s48_enter_integer(t.c_lflag); + sch_ispeed = cfgetispeed(&t); + sch_ospeed = cfgetospeed(&t); + + sch_retval = s48_list_6 (sch_iflag, sch_oflag, sch_cflag, sch_lflag, + sch_ispeed, sch_ospeed); + S48_GC_UNPROTECT(); + + return sch_retval; + } } /* The Scheme caller of this is commented out...*/