Implement defopen and defread
authorDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Wed, 17 Sep 2008 06:37:39 +0000 (06:37 +0000)
committerDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Wed, 17 Sep 2008 06:37:39 +0000 (06:37 +0000)
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Makefile
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Versions
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/defcntl.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/deflt.h [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/defltP.h [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/defopen.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/defread.c [new file with mode: 0644]

index cb7b08b..b6b173a 100644 (file)
@@ -32,7 +32,7 @@ sysdep_routines +=  gethrtime mount umount umount2 systeminfo resolvepath \
     _so_connect _so_getpeername _so_getsockname _so_getsockopt _so_listen \
     _so_send _so_sendmsg _so_sendto _so_setsockopt _so_shutdown _so_socket \
     _so_socketpair _sysconfig rctl atomic door getexecname is_system_labeled \
     _so_connect _so_getpeername _so_getsockname _so_getsockopt _so_listen \
     _so_send _so_sendmsg _so_sendto _so_setsockopt _so_shutdown _so_socket \
     _so_socketpair _sysconfig rctl atomic door getexecname is_system_labeled \
-    privP mnttab modctl acl facl lltostr ulltostr
+    privP mnttab modctl acl facl lltostr ulltostr defopen defread defcntl
 sysdep_routines += sys_fdsync sys_brk sys_fcntl sys_utssys sys_lwp_private \
     sys_uname sys_getloadavg sys_utimes sys_getpeerucred sys_ucred_get \
     sys_privsys sys_putmsg sys_putpmsg sys_meminfo sys_pset_getloadavg \
 sysdep_routines += sys_fdsync sys_brk sys_fcntl sys_utssys sys_lwp_private \
     sys_uname sys_getloadavg sys_utimes sys_getpeerucred sys_ucred_get \
     sys_privsys sys_putmsg sys_putpmsg sys_meminfo sys_pset_getloadavg \
@@ -51,7 +51,7 @@ sysdep_headers += sys/feature_tests.h sys/mount.h sys/cred.h sys/ulimit.h \
     sys/port.h sys/machelf.h sys/zmod.h sys/inttypes.h sys/atomic.h \
     sys/ucred.h sys/port_impl.h sys/ttold.h sys/machtypes.h sys/dirent.h \
     sys/utime.h sys/vfstab sys/procfs.h
     sys/port.h sys/machelf.h sys/zmod.h sys/inttypes.h sys/atomic.h \
     sys/ucred.h sys/port_impl.h sys/ttold.h sys/machtypes.h sys/dirent.h \
     sys/utime.h sys/vfstab sys/procfs.h
-sysdep_headers += ucred.h priv.h bits/regset.h door.h zone.h \
+sysdep_headers += ucred.h priv.h bits/regset.h door.h zone.h deflt.h \
     rtld_db.h pcsample.h port.h atomic.h bits/machtypes.h
 headers := $(filter-out sys/sysinfo.h,$(headers))
 endif
     rtld_db.h pcsample.h port.h atomic.h bits/machtypes.h
 headers := $(filter-out sys/sysinfo.h,$(headers))
 endif
index 58af79e..81aea99 100644 (file)
@@ -17,9 +17,9 @@ libc {
     core_set_process_content; core_set_process_path;
 
     # d
     core_set_process_content; core_set_process_path;
 
     # d
-    _delete; door_bind; door_call; door_cred; door_create; door_getparam;
-    door_info; door_return; door_revoke; door_server_create; door_setparam;
-    door_ucred; door_unbind;
+    _delete; defcntl; defopen; defread; door_bind; door_call; door_cred;
+    door_create; door_getparam; door_info; door_return; door_revoke;
+    door_server_create; door_setparam; door_ucred; door_unbind;
 
     # f
     facl; fork1;
 
     # f
     facl; fork1;
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/defcntl.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/defcntl.c
new file mode 100644 (file)
index 0000000..ecaddd5
--- /dev/null
@@ -0,0 +1,30 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <defltP.h>
+#include <deflt.h>
+
+// TODO
+#if 0
+int defcntl (cmd, newflags)
+      int cmd;
+      int newflags;
+{
+}
+#endif
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/deflt.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/deflt.h
new file mode 100644 (file)
index 0000000..326ba7e
--- /dev/null
@@ -0,0 +1,41 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _DEFLT_H
+#define _DEFLT_H
+
+#include <features.h>
+
+#define DC_GETFLAGS    0
+#define DC_SETFLAGS    1
+
+#define DC_CASE                0x01
+#define DC_NOREWIND    0x02
+#define DC_STRIP_QUOTES        0x04
+#define DC_STD         DC_CASE
+
+__BEGIN_DECLS
+
+extern int defopen (char *);
+extern char *defread (char *);
+extern int defcntl (int, int);
+
+__END_DECLS
+
+#endif /* _DEFLT_H */
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/defltP.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/defltP.h
new file mode 100644 (file)
index 0000000..b349bc0
--- /dev/null
@@ -0,0 +1,38 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _DEFLTP_H
+#define _DEFLTP_H
+
+#include <stdio.h>
+
+#define _DEFLT_INIT                                 \
+    FILE *__deflt_fp = NULL;                        \
+    int __deflt_flags = 0;                          \
+    libc_freeres_ptr (char *__deflt_buf) = NULL;
+
+extern FILE *__deflt_fp;
+extern int __deflt_flags;
+extern char *__deflt_buf;
+
+#define _DEFLT(x)      __deflt_##x
+
+#define _DEFLT_BUFSIZE 1024
+
+#endif /* _DEFLTP_H */
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/defopen.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/defopen.c
new file mode 100644 (file)
index 0000000..0071558
--- /dev/null
@@ -0,0 +1,50 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <defltP.h>
+#include <deflt.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+_DEFLT_INIT
+
+int defopen (fn)
+      char *fn;
+{
+  /* Close old file if open.  */
+  if (_DEFLT (fp))
+    fclose (_DEFLT (fp));
+  if (fn == NULL)
+    return 0;
+
+  _DEFLT (fp) = fopen (fn, "r");
+  if (!_DEFLT (fp))
+    return -1;
+
+  /* Allocate line buffer.  */
+  if (_DEFLT (buf) == NULL)
+    {
+      _DEFLT (buf) = malloc (_DEFLT_BUFSIZE);
+      if (!_DEFLT (buf))
+        return -1;
+    }
+
+  /* Set default flags.  */
+  _DEFLT (flags) = DC_STD;
+}
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/defread.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/defread.c
new file mode 100644 (file)
index 0000000..45462de
--- /dev/null
@@ -0,0 +1,69 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <defltP.h>
+#include <deflt.h>
+#include <stdio.h>
+#include <string.h>
+
+char * defread (cp)
+      char *cp;
+{
+  if (_DEFLT (fp) == NULL)
+      return NULL;
+
+  size_t cplen = strlen (cp);
+  int (*strcmpfunc)(const char *, const char *, size_t) =
+      (_DEFLT (flags) & DC_CASE) ? strncmp : strncasecmp;
+  while (fgets (_DEFLT (buf), _DEFLT_BUFSIZE, _DEFLT (fp)))
+    {
+      /* Make sure we got the full line.  */
+      if (_DEFLT (buf)[strlen (_DEFLT (buf)) - 1] != '\n')
+        return NULL;
+
+      /* Eat spaces.  */
+      char *bufp = _DEFLT (buf);
+      while (*bufp++ == ' ') ;
+
+      if ((*strcmpfunc)(bufp, cp, cplen) == 0)
+        {
+          bufp += cplen;
+
+          /* Strip quotes.  */
+          if ((_DEFLT (flags) & DC_STRIP_QUOTES) && *bufp)
+            {
+              /* Strip leading quote.  */
+              if (*bufp == '"' || *bufp == '\'')
+                {
+                  char *bufp2 = bufp, *bufp3 = bufp;
+                  while ((*bufp2++ = *++bufp3)) ;
+                }
+
+              /* Strip trailing quote.  */
+              size_t len = strlen (bufp);
+              if (len && (bufp[len - 1] == '"' || bufp[len - 1] == '\''))
+                bufp[len - 1] = 0;
+            }
+
+          return bufp;
+        }
+    }
+
+  return NULL;
+}