]> granicus.if.org Git - nethack/commitdiff
*** empty log message ***
authorjwalz <jwalz>
Sat, 5 Jan 2002 21:05:58 +0000 (21:05 +0000)
committerjwalz <jwalz>
Sat, 5 Jan 2002 21:05:58 +0000 (21:05 +0000)
sys/share/pcunix.c [new file with mode: 0644]

diff --git a/sys/share/pcunix.c b/sys/share/pcunix.c
new file mode 100644 (file)
index 0000000..560d78a
--- /dev/null
@@ -0,0 +1,277 @@
+/*     SCCS Id: @(#)pcunix.c   3.3     94/11/07        */
+/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
+/* NetHack may be freely redistributed.  See license for details. */
+
+/* This file collects some Unix dependencies; pager.c contains some more */
+
+#include "hack.h"
+
+#include       <sys/stat.h>
+#if defined(WIN32) || defined(MSDOS)
+#include       <errno.h>
+#endif
+
+#if defined(WIN32) || defined(MSDOS)
+extern char orgdir[];
+# ifdef WIN32
+extern void NDECL(backsp);
+# endif
+extern void NDECL(clear_screen);
+#endif
+
+#ifdef OVLB
+
+#if 0
+static struct stat buf;
+#endif
+
+# ifdef WANT_GETHDATE
+static struct stat hbuf;
+# endif
+
+void
+gethdate(name)
+char *name;
+{
+# ifdef WANT_GETHDATE
+#if 0
+/* old version - for people short of space */
+
+register char *np;
+      if(stat(name, &hbuf))
+             error("Cannot get status of %s.",
+                     (np = rindex(name, '/')) ? np+1 : name);
+#endif
+/* version using PATH from: seismo!gregc@ucsf-cgl.ARPA (Greg Couch) */
+
+/*
+ * The problem with   #include  <sys/param.h> is that this include file
+ * does not exist on all systems, and moreover, that it sometimes includes
+ * <sys/types.h> again, so that the compiler sees these typedefs twice.
+ */
+#define         MAXPATHLEN      1024
+
+    register char *np, *path;
+    char filename[MAXPATHLEN+1], *getenv();
+    int pathlen;
+
+    if (index(name, '/') != (char *)0 || (path = getenv("PATH")) == (char *)0)
+       path = "";
+
+    for (;;) {
+       if ((np = index(path, ':')) == (char *)0)
+           np = path + strlen(path);       /* point to end str */
+       pathlen = np - path;
+       if (pathlen > MAXPATHLEN)
+           pathlen = MAXPATHLEN;
+       if (pathlen <= 1) {                  /* %% */
+           (void) strncpy(filename, name, MAXPATHLEN);
+       } else {
+           (void) strncpy(filename, path, pathlen);
+           filename[pathlen] = '/';
+           (void) strncpy(filename + pathlen + 1, name,
+                               (MAXPATHLEN - 1) - pathlen);
+       }
+       filename[MAXPATHLEN] = '\0';
+       if (stat(filename, &hbuf) == 0)
+           return;
+       if (*np == '\0')
+       path = "";
+       path = np + 1;
+    }
+    if (strlen(name) > BUFSZ/2)
+       name = name + strlen(name) - BUFSZ/2;
+    error("Cannot get status of %s.", (np = rindex(name, '/')) ? np+1 : name);
+# endif /* WANT_GETHDATE */
+}
+
+#if 0
+int
+uptodate(fd)
+int fd;
+{
+# ifdef WANT_GETHDATE
+    if(fstat(fd, &buf)) {
+       pline("Cannot get status of saved level? ");
+       return(0);
+    }
+    if(buf.st_mtime < hbuf.st_mtime) {
+       pline("Saved level is out of date. ");
+       return(0);
+    }
+# else
+#  if defined(MICRO) && !defined(NO_FSTAT)
+    if(fstat(fd, &buf)) {
+       if(moves > 1) pline("Cannot get status of saved level? ");
+       else pline("Cannot get status of saved game");
+       return(0);
+    } 
+    if(comp_times(buf.st_mtime)) { 
+       if(moves > 1) pline("Saved level is out of date");
+       else pline("Saved game is out of date. ");
+       /* This problem occurs enough times we need to give the player
+        * some more information about what causes it, and how to fix.
+        */
+#  ifdef MSDOS
+           pline("Make sure that your system's date and time are correct.");
+           pline("They must be more current than NetHack.EXE's date/time stamp.");
+#  endif /* MSDOS */
+       return(0);
+    }
+#  endif  /* MICRO */
+# endif /* WANT_GETHDATE */
+    return(1);
+}
+#endif
+
+#ifdef PC_LOCKING
+static int
+eraseoldlocks()
+{
+       register int i;
+
+       /* cannot use maxledgerno() here, because we need to find a lock name
+        * before starting everything (including the dungeon initialization
+        * that sets astral_level, needed for maxledgerno()) up
+        */
+       for(i = 1; i <= MAXDUNGEON*MAXLEVEL + 1; i++) {
+               /* try to remove all */
+               set_levelfile_name(lock, i);
+               (void) unlink(fqname(lock, LEVELPREFIX, 0));
+       }
+       set_levelfile_name(lock, 0);
+       if(unlink(fqname(lock, LEVELPREFIX, 0)))
+               return 0;                               /* cannot remove it */
+       return(1);                                      /* success! */
+}
+
+void
+getlock()
+{
+       register int fd, c, ci, ct;
+       char tbuf[BUFSZ];
+       const char *fq_lock;
+# if defined(MSDOS) && defined(NO_TERMS)
+       int grmode = iflags.grmode;
+# endif
+       
+       /* we ignore QUIT and INT at this point */
+       if (!lock_file(HLOCK, LOCKPREFIX, 10)) {
+               wait_synch();
+               chdirx(orgdir, 0);
+               error("Quitting.");
+       }
+
+       /* regularize(lock); */ /* already done in pcmain */
+       Sprintf(tbuf,fqname(lock, LEVELPREFIX, 0));
+       set_levelfile_name(lock, 0);
+       fq_lock = fqname(lock, LEVELPREFIX, 1);
+       if((fd = open(fq_lock,0)) == -1) {
+               if(errno == ENOENT) goto gotlock;    /* no such file */
+               chdirx(orgdir, 0);
+               perror(fq_lock);
+               unlock_file(HLOCK); 
+               error("Cannot open %s", fq_lock);
+       }
+
+       (void) close(fd);
+
+       if(iflags.window_inited) { 
+         pline("There is already a game in progress under your name.");
+         pline("You may be able to use \"recover %s\" to get it back.\n",tbuf);
+         c = yn("Do you want to destroy the old game?");
+       } else {
+# if defined(MSDOS) && defined(NO_TERMS)
+               grmode = iflags.grmode;
+               if (grmode) gr_finish();
+# endif
+               c = 'n';
+               ct = 0;
+               msmsg("\nThere is already a game in progress under your name.\n");
+               msmsg("If this is unexpected, you may be able to use \n");
+               msmsg("\"recover %s\" to get it back.",tbuf);
+               msmsg("\nDo you want to destroy the old game? [yn] ");
+               while ((ci=nhgetch()) != '\n') {
+                   if (ct > 0) {
+# if defined(WIN32CON)
+                       backsp();       /* \b is visible on NT */
+# else
+                       msmsg("\b \b");
+# endif
+                       ct = 0;
+                       c = 'n';
+                   }
+                   if (ci == 'y' || ci == 'n' || ci == 'Y' || ci == 'N') {
+                       ct = 1;
+                       c = ci;
+                       msmsg("%c",c);
+                   }
+               }
+       }
+       if(c == 'y' || c == 'Y')
+               if(eraseoldlocks()) {
+# if defined(WIN32CON)
+                       clear_screen();         /* display gets fouled up otherwise */
+# endif
+                       goto gotlock;
+               } else {
+                       unlock_file(HLOCK);
+                       chdirx(orgdir, 0);
+                       error("Couldn't destroy old game.");
+               }
+       else {
+               unlock_file(HLOCK);
+               chdirx(orgdir, 0);
+               error("%s", "");
+       }
+
+gotlock:
+       fd = creat(fq_lock, FCMASK);
+       unlock_file(HLOCK);
+       if(fd == -1) {
+               chdirx(orgdir, 0);
+               error("cannot creat lock file (%s.)", fq_lock);
+       } else {
+               if(write(fd, (char *) &hackpid, sizeof(hackpid))
+                   != sizeof(hackpid)){
+                       chdirx(orgdir, 0);
+                       error("cannot write lock (%s)", fq_lock);
+               }
+               if(close(fd) == -1) {
+                       chdirx(orgdir, 0);
+                       error("cannot close lock (%s)", fq_lock);
+               }
+       }
+# if defined(MSDOS) && defined(NO_TERMS)
+       if (grmode) gr_init();
+# endif
+}      
+# endif /* PC_LOCKING */
+
+# ifndef WIN32
+void
+regularize(s)
+/*
+ * normalize file name - we don't like .'s, /'s, spaces, and
+ * lots of other things
+ */
+register char *s;
+{
+       register char *lp;
+
+       for (lp = s; *lp; lp++)
+               if (*lp <= ' ' || *lp == '"' || (*lp >= '*' && *lp <= ',') ||
+                   *lp == '.' || *lp == '/' || (*lp >= ':' && *lp <= '?') ||
+# ifdef OS2
+                   *lp == '&' || *lp == '(' || *lp == ')' ||
+# endif
+                   *lp == '|' || *lp >= 127 || (*lp >= '[' && *lp <= ']'))
+                        *lp = '_';
+}
+# endif /* WIN32 */
+#endif /* OVLB */
+
+
+#ifdef __EMX__
+void seteuid(int i){;}
+#endif