Unix.st
author claus
Sat, 05 Feb 1994 13:27:58 +0100
changeset 51 9b7ae5e18f3e
parent 42 e33491f6f260
child 63 1f0cdefb013f
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1988 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
Object subclass:#OperatingSystem
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       category:'System-Support'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
OperatingSystem comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
    22
COPYRIGHT (c) 1988 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
             All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
    25
$Header: /cvs/stx/stx/libbasic/Attic/Unix.st,v 1.11 1994-02-05 12:27:58 claus Exp $
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
written 1988 by claus
a27a279701f8 Initial revision
claus
parents:
diff changeset
    28
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
#ifdef transputer
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
# define unlink(f)      ((remove(f) == 0) ? 0 : -1)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    34
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
# include <signal.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
# ifdef SYSV
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
#  include <sys/types.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
#  include <sys/param.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
#  include <sys/times.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
#  if ! defined(sco3_2)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
#   include <unistd.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
#  endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    44
#  if defined(isc3_2) || defined(sco3_2)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
#   include <sys/time.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    46
#  endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    47
#  if !defined(isc3_2)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    48
#   if defined(PCS) && defined(mips)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    49
#    include "/usr/include/bsd/sys/time.h"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
#    include "/usr/include/sys/time.h"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    51
#   else
a27a279701f8 Initial revision
claus
parents:
diff changeset
    52
#    include <time.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    53
#   endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    54
#  endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    55
#  if defined(isc3_2)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
#   include <sys/bsdtypes.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
#  endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
#  ifdef FAST_TIMER
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
#   include <ft.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    60
    static int timer_fd = -1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    61
#  endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    62
# else /* not SYSV */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    63
#  include <sys/time.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    64
#  include <sys/types.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
# include <pwd.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
# include <grp.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
# include <sys/stat.h>
10
claus
parents: 5
diff changeset
    70
# include <errno.h>
claus
parents: 5
diff changeset
    71
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
# ifndef S_IXUSR
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
#  define S_IXUSR S_IEXEC
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
#  define S_IXGRP (S_IEXEC>>3)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
#  define S_IXOTH (S_IEXEC>>6)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    76
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    77
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
10
claus
parents: 5
diff changeset
    80
/*
claus
parents: 5
diff changeset
    81
 * on some systems errno is a macro ... check for it here
claus
parents: 5
diff changeset
    82
 */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
#ifndef errno
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
 extern errno;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
#include <stdio.h>
10
claus
parents: 5
diff changeset
    88
#include <fcntl.h>
claus
parents: 5
diff changeset
    89
claus
parents: 5
diff changeset
    90
/*
claus
parents: 5
diff changeset
    91
 * some (old) systems do not define this ...
claus
parents: 5
diff changeset
    92
 */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
#ifndef R_OK
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
# define R_OK    4       /* Test for Read permission */ 
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
# define W_OK    2       /* Test for Write permission */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
# define X_OK    1       /* Test for eXecute permission */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
# define F_OK    0       /* Test for existence of File */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
2
claus
parents: 1
diff changeset
   101
!OperatingSystem class methodsFor:'documentation'!
claus
parents: 1
diff changeset
   102
claus
parents: 1
diff changeset
   103
documentation
claus
parents: 1
diff changeset
   104
"
claus
parents: 1
diff changeset
   105
this class gives access to some operating system services;
claus
parents: 1
diff changeset
   106
some of it is very specific for unix. 
claus
parents: 1
diff changeset
   107
claus
parents: 1
diff changeset
   108
"
claus
parents: 1
diff changeset
   109
! !
claus
parents: 1
diff changeset
   110
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
!OperatingSystem class methodsFor:'misc'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
exit
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
    "shutdown smalltalk immediately"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
    mainExit(0);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
    "OperatingSystem exit - dont evaluate this"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
exit:exitCode
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
    "shutdown smalltalk immediately returning an exit-code"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
    if (! _isSmallInteger(exitCode))
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
        exit(1);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
    mainExit(_intVal(exitCode));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
    "OperatingSystem exit:1 - dont evaluate this"
10
claus
parents: 5
diff changeset
   131
! !
claus
parents: 5
diff changeset
   132
claus
parents: 5
diff changeset
   133
!OperatingSystem class methodsFor:'os queries'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
getEnvironment:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
    "get an environment string"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
    char *env;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
    if (_isString(aString)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
        env =  (char *)getenv(_stringVal(aString));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
        if (env) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
            RETURN ( _MKSTRING(env COMMA_CON) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
    "OperatingSystem getEnvironment:'LANG'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
getProcessId
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
    "return the processId"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
    int pid = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
#ifndef transputer
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
    pid = getpid();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
    RETURN ( _MKSMALLINT(pid) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
    "OperatingSystem getProcessId"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
getCPUType
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
    "return a string giving the type of machine we're running on"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
    |cpu|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
    
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
    cpu := 'unknown'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
#ifdef vax
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
    cpu = _MKSTRING("vax" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
#ifdef mips
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
    cpu = _MKSTRING("mips" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
#ifdef i386
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
    cpu = _MKSTRING("i386" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
#ifdef ns32k
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
    cpu = _MKSTRING("ns32k" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
#ifdef mc68k
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
    cpu = _MKSTRING("mc68k" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   191
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
#ifdef sparc
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
    cpu = _MKSTRING("sparc" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
#endif
42
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   195
#if defined(hppa)
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   196
    cpu = _MKSTRING("hppa" COMMA_CON);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
#ifdef rs6000
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
    cpu = _MKSTRING("rs6000" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
#ifdef alpha
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
    cpu = _MKSTRING("alpha" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
#ifdef transputer
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
    cpu = _MKSTRING("transputer" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
    ^ cpu
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
    "OperatingSystem getCPUType"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   212
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
a27a279701f8 Initial revision
claus
parents:
diff changeset
   214
getOSType
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
    "return a string giving the type of os we're running on"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
    |os|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   218
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
    os := 'unknown'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
%{  /* NOCONTEXT */
10
claus
parents: 5
diff changeset
   222
#ifdef MSDOS
claus
parents: 5
diff changeset
   223
  os = _MKSTRING("msdos" COMMA_CON);
claus
parents: 5
diff changeset
   224
#endif
claus
parents: 5
diff changeset
   225
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
#ifdef sinix
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
  os = _MKSTRING("sinix" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
#ifdef ultrix
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
  os = _MKSTRING("ultrix" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
#ifdef sco
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
  os = _MKSTRING("sco" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   237
42
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   238
#ifdef hpux
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   239
  os = _MKSTRING("hpux" COMMA_CON);
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   240
#endif
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   241
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
#ifdef LINUX
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
  os = _MKSTRING("linux" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   245
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
#ifdef BSD
a27a279701f8 Initial revision
claus
parents:
diff changeset
   247
# ifdef MACH
a27a279701f8 Initial revision
claus
parents:
diff changeset
   248
  os = _MKSTRING("mach" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   249
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
a27a279701f8 Initial revision
claus
parents:
diff changeset
   251
# ifdef sunos
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
  os = _MKSTRING("sunos" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   253
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   254
a27a279701f8 Initial revision
claus
parents:
diff changeset
   255
# ifdef IRIS
a27a279701f8 Initial revision
claus
parents:
diff changeset
   256
  os = _MKSTRING("irix" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   257
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   258
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
  if (os == nil) os = _MKSTRING("bsd" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
#ifdef SYSV
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
# ifdef SYSV3
a27a279701f8 Initial revision
claus
parents:
diff changeset
   264
  os = _MKSTRING("sys5.3" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
# else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   266
#  ifdef SYSV4
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
    os = _MKSTRING("sys5.4" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
#  else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
    os = _MKSTRING("sys5" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   270
#  endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
    ^ os
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
    "OperatingSystem getOSType"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   278
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   279
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
getSystemType
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
    "return a string giving the type of system we're running on"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
    |sys|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
a27a279701f8 Initial revision
claus
parents:
diff changeset
   285
    sys := 'unknown'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
%{  /* NOCONTEXT */
10
claus
parents: 5
diff changeset
   288
#ifdef MSDOS
claus
parents: 5
diff changeset
   289
  sys = _MKSTRING("msdos" COMMA_CON);
claus
parents: 5
diff changeset
   290
#endif
claus
parents: 5
diff changeset
   291
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
#ifdef sinix
a27a279701f8 Initial revision
claus
parents:
diff changeset
   293
  sys = _MKSTRING("sinix" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   294
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   295
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
#ifdef ultrix
a27a279701f8 Initial revision
claus
parents:
diff changeset
   297
  sys = _MKSTRING("ultrix" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   298
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   299
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
#ifdef sco
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
  sys = _MKSTRING("sco" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   302
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
#ifdef sunos
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
  sys = _MKSTRING("sunos" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
#ifdef solaris
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
  sys = _MKSTRING("solaris" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   311
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
#ifdef NEXT
a27a279701f8 Initial revision
claus
parents:
diff changeset
   313
  sys = _MKSTRING("next" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
#ifdef IRIS
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
  sys = _MKSTRING("iris" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
#ifdef LINUX
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
  sys = _MKSTRING("linux" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
42
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   324
#ifdef hpux
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   325
  sys = _MKSTRING("hpux" COMMA_CON);
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   326
#endif
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   327
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
#ifdef BSD
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
# ifdef MACH
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
  if (sys == nil) sys = _MKSTRING("mach" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
  if (sys == nil) sys = _MKSTRING("bsd" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
#ifdef SYSV
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
# ifdef SYSV3
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
  if (sys == nil) sys = _MKSTRING("sys5.3" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
# else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
#  ifdef SYSV4
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
    if (sys == nil) sys = _MKSTRING("sys5.4" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
#  else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   342
    if (sys == nil) sys = _MKSTRING("sys5" COMMA_CON);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   343
#  endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   348
    ^ sys
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
    "OperatingSystem getSystemType"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
10
claus
parents: 5
diff changeset
   353
getHostName
claus
parents: 5
diff changeset
   354
    "return the hostname we are running on - if there is
claus
parents: 5
diff changeset
   355
     a HOST environment variable, we are much faster here ..."
claus
parents: 5
diff changeset
   356
claus
parents: 5
diff changeset
   357
    |name p|
claus
parents: 5
diff changeset
   358
claus
parents: 5
diff changeset
   359
    name := self getEnvironment:'HOST'.
claus
parents: 5
diff changeset
   360
    name isNil ifTrue:[
claus
parents: 5
diff changeset
   361
        "since fork might be slow on some machines, give a warning ..."
claus
parents: 5
diff changeset
   362
        'please set the HOST shell variable for faster startup' printNewline.
claus
parents: 5
diff changeset
   363
claus
parents: 5
diff changeset
   364
        p := PipeStream readingFrom:'hostname'.
claus
parents: 5
diff changeset
   365
        p notNil ifTrue:[
claus
parents: 5
diff changeset
   366
            name := p nextLine.
claus
parents: 5
diff changeset
   367
            p close
claus
parents: 5
diff changeset
   368
        ]
claus
parents: 5
diff changeset
   369
    ].
claus
parents: 5
diff changeset
   370
    name isNil ifTrue:[
claus
parents: 5
diff changeset
   371
        'cannot find out hostname' printNewline.
claus
parents: 5
diff changeset
   372
    ].
claus
parents: 5
diff changeset
   373
    ^name
claus
parents: 5
diff changeset
   374
!
claus
parents: 5
diff changeset
   375
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
isBSDlike
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
    "return true, if the OS we're running on is a real unix."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   378
a27a279701f8 Initial revision
claus
parents:
diff changeset
   379
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   380
a27a279701f8 Initial revision
claus
parents:
diff changeset
   381
#ifdef BSD
a27a279701f8 Initial revision
claus
parents:
diff changeset
   382
    RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   383
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   384
#ifdef SYSV4
a27a279701f8 Initial revision
claus
parents:
diff changeset
   385
    RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   386
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   387
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
    ^ false
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
maxFileNameLength
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
    "return the max number of characters in a filename."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
%{  /* NOCONTEXT */
42
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   396
#if defined(BSD) || defined(SYSV4) || defined(LONGFILENAMES)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
    RETURN ( _MKSMALLINT(255) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
# ifdef SYSV
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
    RETURN ( _MKSMALLINT(14) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   402
# ifdef MSDOS
a27a279701f8 Initial revision
claus
parents:
diff changeset
   403
    RETURN ( _MKSMALLINT(9) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   404
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   408
    ^ 14
10
claus
parents: 5
diff changeset
   409
!
claus
parents: 5
diff changeset
   410
claus
parents: 5
diff changeset
   411
supportsIOInterrupts
claus
parents: 5
diff changeset
   412
    "return true, if the OS supports IO availability interrupts 
42
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   413
     (i.e. SIGPOLL/SIGIO).
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   414
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   415
     Currently, this mechanism does not work at all ..."
10
claus
parents: 5
diff changeset
   416
claus
parents: 5
diff changeset
   417
%{  /* NOCONTEXT */
42
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   418
#ifdef NOTDEF
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   419
10
claus
parents: 5
diff changeset
   420
#if defined(SIGPOLL) || defined(SIGIO)
claus
parents: 5
diff changeset
   421
# if defined(F_GETFL) && defined(F_SETFL)
claus
parents: 5
diff changeset
   422
#  if defined(FASYNC)
claus
parents: 5
diff changeset
   423
/*
claus
parents: 5
diff changeset
   424
 * mhmh they seem to NOT work on NS2.1
claus
parents: 5
diff changeset
   425
 */
claus
parents: 5
diff changeset
   426
#   if !defined(NEXT)
claus
parents: 5
diff changeset
   427
    RETURN (true);
claus
parents: 5
diff changeset
   428
#   endif
claus
parents: 5
diff changeset
   429
#  endif
claus
parents: 5
diff changeset
   430
# endif
claus
parents: 5
diff changeset
   431
#endif
42
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   432
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   433
#endif
10
claus
parents: 5
diff changeset
   434
%}
claus
parents: 5
diff changeset
   435
.
claus
parents: 5
diff changeset
   436
    ^ false
claus
parents: 5
diff changeset
   437
!
claus
parents: 5
diff changeset
   438
claus
parents: 5
diff changeset
   439
supportsNonBlockingIO
claus
parents: 5
diff changeset
   440
    "return true, if the OS supports nonblocking IO"
claus
parents: 5
diff changeset
   441
claus
parents: 5
diff changeset
   442
%{  /* NOCONTEXT */
claus
parents: 5
diff changeset
   443
#if defined(F_GETFL) && defined(F_SETFL)
claus
parents: 5
diff changeset
   444
# if defined(FNDELAY)
claus
parents: 5
diff changeset
   445
    RETURN (true);
claus
parents: 5
diff changeset
   446
# endif
claus
parents: 5
diff changeset
   447
#endif
claus
parents: 5
diff changeset
   448
%}
claus
parents: 5
diff changeset
   449
.
claus
parents: 5
diff changeset
   450
    ^ false
claus
parents: 5
diff changeset
   451
!
claus
parents: 5
diff changeset
   452
claus
parents: 5
diff changeset
   453
supportsSelect
claus
parents: 5
diff changeset
   454
    "return true, if the OS supports selecting on multiple
claus
parents: 5
diff changeset
   455
     filedescriptors via select."
claus
parents: 5
diff changeset
   456
claus
parents: 5
diff changeset
   457
%{  /* NOCONTEXT */
claus
parents: 5
diff changeset
   458
#if defined(sco)
claus
parents: 5
diff changeset
   459
    /*
claus
parents: 5
diff changeset
   460
     * sco has a broken select - always waiting 1 second
claus
parents: 5
diff changeset
   461
     */
claus
parents: 5
diff changeset
   462
    RETURN(false);
claus
parents: 5
diff changeset
   463
#endif
claus
parents: 5
diff changeset
   464
%}
claus
parents: 5
diff changeset
   465
.
claus
parents: 5
diff changeset
   466
    ^ true
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   468
2
claus
parents: 1
diff changeset
   469
!OperatingSystem class methodsFor:'users & groups'!
claus
parents: 1
diff changeset
   470
claus
parents: 1
diff changeset
   471
getLoginName
claus
parents: 1
diff changeset
   472
    "return a string with the users name"
claus
parents: 1
diff changeset
   473
claus
parents: 1
diff changeset
   474
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   475
claus
parents: 1
diff changeset
   476
    char *name = "you";
claus
parents: 1
diff changeset
   477
#ifndef transputer
claus
parents: 1
diff changeset
   478
    name = (char *)getlogin();
26
8dba727d8981 *** empty log message ***
claus
parents: 18
diff changeset
   479
    if (! name || (name[0] == 0)) {
2
claus
parents: 1
diff changeset
   480
        name = (char *)getenv("LOGNAME");
claus
parents: 1
diff changeset
   481
    }
claus
parents: 1
diff changeset
   482
#endif
claus
parents: 1
diff changeset
   483
    RETURN ( _MKSTRING(name COMMA_CON) );
claus
parents: 1
diff changeset
   484
%}
claus
parents: 1
diff changeset
   485
    "OperatingSystem getLogin"
claus
parents: 1
diff changeset
   486
!
claus
parents: 1
diff changeset
   487
claus
parents: 1
diff changeset
   488
getUserNameFromID:aNumber
claus
parents: 1
diff changeset
   489
    "return the user-name-string for a given numeric user-id"
claus
parents: 1
diff changeset
   490
claus
parents: 1
diff changeset
   491
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   492
claus
parents: 1
diff changeset
   493
#ifndef transputer
claus
parents: 1
diff changeset
   494
    struct passwd *p;
claus
parents: 1
diff changeset
   495
claus
parents: 1
diff changeset
   496
    if (_isSmallInteger(aNumber)) {
claus
parents: 1
diff changeset
   497
        p = getpwuid(_intVal(aNumber));
claus
parents: 1
diff changeset
   498
        if (p) {
claus
parents: 1
diff changeset
   499
            RETURN ( _MKSTRING(p->pw_name COMMA_CON) );
claus
parents: 1
diff changeset
   500
        }
claus
parents: 1
diff changeset
   501
    }
claus
parents: 1
diff changeset
   502
#endif
claus
parents: 1
diff changeset
   503
%}
claus
parents: 1
diff changeset
   504
.
claus
parents: 1
diff changeset
   505
    ^ '???'
claus
parents: 1
diff changeset
   506
claus
parents: 1
diff changeset
   507
    "OperatingSystem getUserNameFromID:0"
claus
parents: 1
diff changeset
   508
!
claus
parents: 1
diff changeset
   509
claus
parents: 1
diff changeset
   510
getGroupNameFromID:aNumber
claus
parents: 1
diff changeset
   511
    "return the group-name-string for a given numeric group-id"
claus
parents: 1
diff changeset
   512
claus
parents: 1
diff changeset
   513
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   514
claus
parents: 1
diff changeset
   515
#ifndef transputer
claus
parents: 1
diff changeset
   516
    struct group *g;
claus
parents: 1
diff changeset
   517
claus
parents: 1
diff changeset
   518
    if (_isSmallInteger(aNumber)) {
claus
parents: 1
diff changeset
   519
        g = getgrgid(_intVal(aNumber));
claus
parents: 1
diff changeset
   520
        if (g) {
claus
parents: 1
diff changeset
   521
            RETURN ( _MKSTRING(g->gr_name COMMA_CON) );
claus
parents: 1
diff changeset
   522
        }
claus
parents: 1
diff changeset
   523
    }
claus
parents: 1
diff changeset
   524
#endif
claus
parents: 1
diff changeset
   525
%}
claus
parents: 1
diff changeset
   526
.
claus
parents: 1
diff changeset
   527
    ^ '???'
claus
parents: 1
diff changeset
   528
claus
parents: 1
diff changeset
   529
    "OperatingSystem getGroupNameFromID:0"
claus
parents: 1
diff changeset
   530
!
claus
parents: 1
diff changeset
   531
claus
parents: 1
diff changeset
   532
getHomeDirectory
10
claus
parents: 5
diff changeset
   533
    "return the name of the users home directory"
2
claus
parents: 1
diff changeset
   534
claus
parents: 1
diff changeset
   535
    ^ OperatingSystem getEnvironment:'HOME'
claus
parents: 1
diff changeset
   536
claus
parents: 1
diff changeset
   537
    "OperatingSystem getHomeDirectory"
claus
parents: 1
diff changeset
   538
! !
claus
parents: 1
diff changeset
   539
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
!OperatingSystem class methodsFor:'error messages'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   542
lastErrorString
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   543
    "return a message string describing the last error"
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   544
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   545
    ^ self errorTextForNumber:ErrorNumber
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   546
!
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   547
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
errorTextForNumber:errNr
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
    "return a message string from a unix errorNumber 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
     (as returned by a system call). Should be replaced by
a27a279701f8 Initial revision
claus
parents:
diff changeset
   551
     a resource lookup."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   552
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
    |msg messages|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
a27a279701f8 Initial revision
claus
parents:
diff changeset
   555
    (Language == #german) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   556
        messages := #('keine superuser Berechtigung'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   557
                      'ungueltiger Datei- oder VerzeichnisName'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   558
                      nil "'ungueltige Prozessnummer'  "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   559
                      nil "'unterbrochener systemcall' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   560
                      'E/A Fehler'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
                      nil "'Geraet existiert nicht' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
                      'zu viele Argumente'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
                      'nicht ausfuehrbar'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
                      nil "'falscher FileDescriptor'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
                      nil "'kein Kindprozess'       "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   566
                      'zu viele Prozesse oder zu wenig Speicher'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   567
                      'zu wenig Speicher'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
                      'keine ZugriffsBerechtigung'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
                      nil "'falsche Adresse'        "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   570
                      nil "'kein Blockgeraet'       "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
                      nil "'Platte noch im Zugriff' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
                      'Datei existiert bereits'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
                      nil "'Link ueber Plattengrenzen hinweg' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   574
                      'Geraet existiert nicht'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
                      'ist kein Verzeichnis'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
                      'ist ein Verzeichnis'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   577
                      nil "'ungueltiges Argument' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   578
                      'zu viele Dateien offen'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   579
                      'zu viele Dateien offen'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   580
                      nil "'kein Terminalgeraet'  "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   581
                      'Datei wird gerade ausgefuehrt'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   582
                      'Datei zu gross'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   583
                      'Platte ist voll'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   584
                      'ungueltige Positionierung'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   585
                      'Platte ist schreibgeschuetzt'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   586
                      'zu viele Links'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   587
                      'Pipe unterbrochen'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   588
                      'argument nicht im gueltigen Bereich'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   589
                      'Ergebnis nicht im gueltigen Bereich')
a27a279701f8 Initial revision
claus
parents:
diff changeset
   590
    ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   591
        messages := #('Not super-user'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   592
                      'No such file or directory'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   593
                      nil "'No such process'   "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   594
                      nil "'interrupted system call' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   595
                      'I/O error'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   596
                      nil "'No such device or address' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
                      'Arg list too long'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   598
                      'Exec format error'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
                      nil "'Bad file number'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   600
                      nil "'No children'       "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   601
                      'No more processes'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   602
                      'Not enough core'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   603
                      'Permission denied'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   604
                      nil "'Bad address'        "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   605
                      nil "'Block device required'       "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   606
                      nil "'Mount device busy' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   607
                      'File exists'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   608
                      nil "'Cross-device link' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   609
                      'No such device'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   610
                      'Not a directory'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   611
                      'Is a directory'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   612
                      nil 'Invalid argument'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   613
                      'File table overflow'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   614
                      'Too many open files'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   615
                      nil "'Not a typewriter' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   616
                      'Text file busy'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   617
                      'File too large'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   618
                      'No space left on device'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   619
                      'Illegal seek'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   620
                      'Read only file system'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   621
                      'Too many links'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   622
                      'Broken pipe'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   623
                      'Math arg out of domain of func'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   624
                      'Math result not representable')
a27a279701f8 Initial revision
claus
parents:
diff changeset
   625
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   626
a27a279701f8 Initial revision
claus
parents:
diff changeset
   627
    (errNr between:1 and:messages size) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   628
        msg := messages at:errNr
a27a279701f8 Initial revision
claus
parents:
diff changeset
   629
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   630
    msg isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   631
        ^ ('ErrorNr: ' , errNr printString)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   632
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   633
    ^ msg
a27a279701f8 Initial revision
claus
parents:
diff changeset
   634
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   635
a27a279701f8 Initial revision
claus
parents:
diff changeset
   636
!OperatingSystem class methodsFor:'interrupts'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   637
10
claus
parents: 5
diff changeset
   638
blockInterrupts
claus
parents: 5
diff changeset
   639
    "needed, for proper semaphore handling"
claus
parents: 5
diff changeset
   640
%{
claus
parents: 5
diff changeset
   641
    BLOCKINTERRUPTS();
claus
parents: 5
diff changeset
   642
%}
claus
parents: 5
diff changeset
   643
!
claus
parents: 5
diff changeset
   644
claus
parents: 5
diff changeset
   645
unblockInterrupts
claus
parents: 5
diff changeset
   646
    "needed, for proper semaphore handling"
claus
parents: 5
diff changeset
   647
%{
claus
parents: 5
diff changeset
   648
    UNBLOCKINTERRUPTS();
claus
parents: 5
diff changeset
   649
%}
claus
parents: 5
diff changeset
   650
!
claus
parents: 5
diff changeset
   651
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   652
enableUserInterrupts
a27a279701f8 Initial revision
claus
parents:
diff changeset
   653
    "enable userInterrupt (^C) handling;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   654
     after enabling, ^C will send the message 'userInterrupt'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   655
     to the UserInterruptHandler object."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   656
a27a279701f8 Initial revision
claus
parents:
diff changeset
   657
%{  /* NOCONTEXT */
10
claus
parents: 5
diff changeset
   658
    extern void userInterrupt();
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   659
a27a279701f8 Initial revision
claus
parents:
diff changeset
   660
    signal(SIGINT, userInterrupt);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   661
    /* signal(SIGQUIT, userInterrupt); */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   662
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   663
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   664
a27a279701f8 Initial revision
claus
parents:
diff changeset
   665
enableFpExceptionInterrupts
a27a279701f8 Initial revision
claus
parents:
diff changeset
   666
    "enable floating point exception interrupts (if the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   667
     architecture supports it).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   668
     after enabling, fpu-exceptions will send the message 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   669
     'fpuExceptionInterrupt' to the FPUExceptionInterruptHandler object."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   670
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   672
    extern void fpExceptionInterrupt();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   673
a27a279701f8 Initial revision
claus
parents:
diff changeset
   674
    signal(SIGFPE, fpExceptionInterrupt);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   675
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   676
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   677
a27a279701f8 Initial revision
claus
parents:
diff changeset
   678
enableSignalInterrupts
a27a279701f8 Initial revision
claus
parents:
diff changeset
   679
    "enable signal exception interrupts (trap, buserror & segm. violation).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   680
     after enabling, these exceptions will send the message 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   681
     'signalInterrupt' to the SignalInterruptHandler object."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   682
a27a279701f8 Initial revision
claus
parents:
diff changeset
   683
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   684
    extern void signalPIPEInterrupt();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   685
    extern void signalBUSInterrupt();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   686
    extern void signalSEGVInterrupt();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   687
a27a279701f8 Initial revision
claus
parents:
diff changeset
   688
    signal(SIGPIPE, signalPIPEInterrupt);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   689
#ifdef SIGBUS
a27a279701f8 Initial revision
claus
parents:
diff changeset
   690
    signal(SIGBUS,  signalBUSInterrupt);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   691
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   692
    signal(SIGSEGV, signalSEGVInterrupt);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   693
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   694
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   695
10
claus
parents: 5
diff changeset
   696
enableIOInterruptsOn:fd
claus
parents: 5
diff changeset
   697
    "turn on IO interrupts for a filedescriptor"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   698
a27a279701f8 Initial revision
claus
parents:
diff changeset
   699
%{  /* NOCONTEXT */
10
claus
parents: 5
diff changeset
   700
claus
parents: 5
diff changeset
   701
    int ret, flags;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   702
    extern void ioInterrupt();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   703
10
claus
parents: 5
diff changeset
   704
#if defined(F_GETFL) && defined(F_SETFL)
claus
parents: 5
diff changeset
   705
# if defined(FASYNC)
claus
parents: 5
diff changeset
   706
    if (_isSmallInteger(fd)) {
claus
parents: 5
diff changeset
   707
#  ifdef SIGPOLL
claus
parents: 5
diff changeset
   708
        signal(SIGPOLL, ioInterrupt);
claus
parents: 5
diff changeset
   709
#  endif
claus
parents: 5
diff changeset
   710
#  ifdef SIGIO
claus
parents: 5
diff changeset
   711
        signal(SIGIO,  ioInterrupt);
claus
parents: 5
diff changeset
   712
#  endif
claus
parents: 5
diff changeset
   713
        flags = fcntl(_intVal(fd), F_GETFL, 0);
claus
parents: 5
diff changeset
   714
        ret = fcntl(_intVal(fd), F_SETFL, flags | FASYNC);
claus
parents: 5
diff changeset
   715
        if (ret >= 0) ret = flags;
claus
parents: 5
diff changeset
   716
        RETURN ( _MKSMALLINT(ret) );
claus
parents: 5
diff changeset
   717
    }
claus
parents: 5
diff changeset
   718
# endif
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   719
#endif
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   720
#ifdef SIGURG
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   721
        signal(SIGURG,  ioInterrupt);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   722
#endif
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   723
%}
10
claus
parents: 5
diff changeset
   724
.
claus
parents: 5
diff changeset
   725
    self primitiveFailed
claus
parents: 5
diff changeset
   726
!
claus
parents: 5
diff changeset
   727
claus
parents: 5
diff changeset
   728
disableIOInterruptsOn:fd
claus
parents: 5
diff changeset
   729
    "turn off IO interrupts for a filedescriptor"
claus
parents: 5
diff changeset
   730
claus
parents: 5
diff changeset
   731
%{  /* NOCONTEXT */
claus
parents: 5
diff changeset
   732
claus
parents: 5
diff changeset
   733
    int ret, flags;
claus
parents: 5
diff changeset
   734
claus
parents: 5
diff changeset
   735
#if defined(F_GETFL) && defined(F_SETFL)
claus
parents: 5
diff changeset
   736
# if defined(FASYNC)
claus
parents: 5
diff changeset
   737
    if (_isSmallInteger(fd)) {
claus
parents: 5
diff changeset
   738
        flags = fcntl(_intVal(fd), F_GETFL, 0);
claus
parents: 5
diff changeset
   739
        ret = fcntl(_intVal(fd), F_SETFL, flags & ~FASYNC);
claus
parents: 5
diff changeset
   740
        if (ret >= 0) ret = flags;
claus
parents: 5
diff changeset
   741
        RETURN ( _MKSMALLINT(ret) );
claus
parents: 5
diff changeset
   742
    }
claus
parents: 5
diff changeset
   743
# endif
claus
parents: 5
diff changeset
   744
#endif
claus
parents: 5
diff changeset
   745
%}
claus
parents: 5
diff changeset
   746
.
claus
parents: 5
diff changeset
   747
    self primitiveFailed
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   748
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   749
2
claus
parents: 1
diff changeset
   750
enableChildSignalInterrupts
claus
parents: 1
diff changeset
   751
    "enable childSignal interrupts 
claus
parents: 1
diff changeset
   752
     (SIGCHLD, if the architecture supports it).
claus
parents: 1
diff changeset
   753
     after enabling, these signals will send the message 
claus
parents: 1
diff changeset
   754
     'childSignalInterrupt' to the ChildSignalInterruptHandler object."
claus
parents: 1
diff changeset
   755
claus
parents: 1
diff changeset
   756
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   757
    extern void signalChildInterrupt();
claus
parents: 1
diff changeset
   758
claus
parents: 1
diff changeset
   759
#ifdef SIGCHLD
claus
parents: 1
diff changeset
   760
    signal(SIGCHLD, signalChildInterrupt);
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   761
    RETURN(true);
2
claus
parents: 1
diff changeset
   762
#else
claus
parents: 1
diff changeset
   763
# ifdef SIGCLD
claus
parents: 1
diff changeset
   764
    signal(SIGCLD, signalChildInterrupt);
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   765
    RETURN(true);
2
claus
parents: 1
diff changeset
   766
# endif
claus
parents: 1
diff changeset
   767
#endif
claus
parents: 1
diff changeset
   768
%}
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   769
.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   770
    ^ false
2
claus
parents: 1
diff changeset
   771
!
claus
parents: 1
diff changeset
   772
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   773
startSpyTimer
a27a279701f8 Initial revision
claus
parents:
diff changeset
   774
    "trigger a spyInterrupt, to be signalled after some (short) time.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   775
     This is used by MessageTally for profiling."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   776
a27a279701f8 Initial revision
claus
parents:
diff changeset
   777
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   778
a27a279701f8 Initial revision
claus
parents:
diff changeset
   779
    extern void spyInterrupt();
10
claus
parents: 5
diff changeset
   780
#if defined(ITIMER_VIRTUAL)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   781
    struct itimerval dt;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   782
a27a279701f8 Initial revision
claus
parents:
diff changeset
   783
    dt.it_interval.tv_sec = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   784
    dt.it_interval.tv_usec = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   785
    dt.it_value.tv_sec = 0;
2
claus
parents: 1
diff changeset
   786
    dt.it_value.tv_usec = 1000;   /* 1000 Hz */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   787
    setitimer(ITIMER_VIRTUAL, &dt, 0);
42
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   788
#ifndef SYSV4
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   789
# if defined(BSD) || defined(HAS_SIGSETMASK)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   790
    sigsetmask(0);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   791
#  endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   792
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   793
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   794
# ifdef SIGVTALRM
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   795
    signal(SIGVTALRM, spyInterrupt);
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   796
# else
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   797
    signal(SIGALRM, spyInterrupt);
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   798
# endif
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   799
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   800
    RETURN (true);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   801
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   802
%}
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   803
.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   804
    ^ false
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   805
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   806
a27a279701f8 Initial revision
claus
parents:
diff changeset
   807
stopSpyTimer
a27a279701f8 Initial revision
claus
parents:
diff changeset
   808
    "stop spy timing"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   809
a27a279701f8 Initial revision
claus
parents:
diff changeset
   810
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   811
10
claus
parents: 5
diff changeset
   812
#if defined(ITIMER_VIRTUAL)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   813
    struct itimerval dt;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   814
a27a279701f8 Initial revision
claus
parents:
diff changeset
   815
    dt.it_interval.tv_sec = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   816
    dt.it_interval.tv_usec = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   817
    dt.it_value.tv_sec = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   818
    dt.it_value.tv_usec = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   819
    setitimer(ITIMER_VIRTUAL, &dt, 0);
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   820
    RETURN (true);
10
claus
parents: 5
diff changeset
   821
#endif
claus
parents: 5
diff changeset
   822
%}
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   823
.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   824
    ^ false
10
claus
parents: 5
diff changeset
   825
!
claus
parents: 5
diff changeset
   826
claus
parents: 5
diff changeset
   827
enableTimer:millis
claus
parents: 5
diff changeset
   828
    "trigger a timerInterrupt, to be signalled after some time."
claus
parents: 5
diff changeset
   829
claus
parents: 5
diff changeset
   830
%{  /* NOCONTEXT */
claus
parents: 5
diff changeset
   831
claus
parents: 5
diff changeset
   832
    extern void timerInterrupt();
claus
parents: 5
diff changeset
   833
#if defined(ITIMER_REAL)
claus
parents: 5
diff changeset
   834
    struct itimerval dt;
claus
parents: 5
diff changeset
   835
claus
parents: 5
diff changeset
   836
    dt.it_interval.tv_sec = 0;
claus
parents: 5
diff changeset
   837
    dt.it_interval.tv_usec = 0;
claus
parents: 5
diff changeset
   838
    dt.it_value.tv_sec = _intVal(millis) / 1000;
claus
parents: 5
diff changeset
   839
    dt.it_value.tv_usec = (_intVal(millis) % 1000) * 1000;  
claus
parents: 5
diff changeset
   840
    setitimer(ITIMER_REAL, &dt, 0);
42
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   841
#ifndef SYSV4
e33491f6f260 *** empty log message ***
claus
parents: 26
diff changeset
   842
# if defined(BSD) || defined(HAS_SIGSETMASK)
10
claus
parents: 5
diff changeset
   843
    sigsetmask(0);
claus
parents: 5
diff changeset
   844
#  endif
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   845
# endif
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   846
    signal(SIGALRM, timerInterrupt);
10
claus
parents: 5
diff changeset
   847
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   848
    RETURN (true);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   849
#endif
10
claus
parents: 5
diff changeset
   850
%}
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   851
.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   852
    ^ false
10
claus
parents: 5
diff changeset
   853
!
claus
parents: 5
diff changeset
   854
claus
parents: 5
diff changeset
   855
disableTimer
claus
parents: 5
diff changeset
   856
    "disable timer interrupt"
claus
parents: 5
diff changeset
   857
claus
parents: 5
diff changeset
   858
%{  /* NOCONTEXT */
claus
parents: 5
diff changeset
   859
claus
parents: 5
diff changeset
   860
#if defined(ITIMER_REAL)
claus
parents: 5
diff changeset
   861
    struct itimerval dt;
claus
parents: 5
diff changeset
   862
claus
parents: 5
diff changeset
   863
    dt.it_interval.tv_sec = 0;
claus
parents: 5
diff changeset
   864
    dt.it_interval.tv_usec = 0;
claus
parents: 5
diff changeset
   865
    dt.it_value.tv_sec = 0;
claus
parents: 5
diff changeset
   866
    dt.it_value.tv_usec = 0;
claus
parents: 5
diff changeset
   867
    setitimer(ITIMER_REAL, &dt, 0);
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   868
    RETURN (true);
10
claus
parents: 5
diff changeset
   869
#endif
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   870
%}
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   871
.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   872
    ^ false
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   873
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   874
a27a279701f8 Initial revision
claus
parents:
diff changeset
   875
!OperatingSystem class methodsFor:'time and date'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   876
a27a279701f8 Initial revision
claus
parents:
diff changeset
   877
getTimeLow
a27a279701f8 Initial revision
claus
parents:
diff changeset
   878
    "return low 16 bits of current time. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   879
     Obsolete: Dont use this method, use getTimeParts below.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   880
     This method will not always return the correct time 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   881
     if used together with getTimeHi.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   882
     (a wrap between the two getTimeXXX calls could occur)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   883
a27a279701f8 Initial revision
claus
parents:
diff changeset
   884
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   885
a27a279701f8 Initial revision
claus
parents:
diff changeset
   886
    RETURN ( _MKSMALLINT(time(0) & 0xFFFF) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   887
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   888
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   889
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   890
a27a279701f8 Initial revision
claus
parents:
diff changeset
   891
    "OperatingSystem getTimeLow"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   892
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   893
a27a279701f8 Initial revision
claus
parents:
diff changeset
   894
getTimeHi
a27a279701f8 Initial revision
claus
parents:
diff changeset
   895
    "return hi 16 bits of current time. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   896
     Obsolete: Dont use this method, use getTimeParts below. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   897
     This method will NOT always return the correct time
a27a279701f8 Initial revision
claus
parents:
diff changeset
   898
     if used together with getTimeHi.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   899
     (a wrap between the two getTimeXXX calls could occur)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   900
a27a279701f8 Initial revision
claus
parents:
diff changeset
   901
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   902
a27a279701f8 Initial revision
claus
parents:
diff changeset
   903
    RETURN ( _MKSMALLINT((time(0) >> 16) & 0xFFFF) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   904
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   905
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   906
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   907
a27a279701f8 Initial revision
claus
parents:
diff changeset
   908
    "OperatingSystem getTimeHi"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   909
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   910
a27a279701f8 Initial revision
claus
parents:
diff changeset
   911
getTimeInto:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   912
    "evaluate the argument aBlock, passing the time-parts of
a27a279701f8 Initial revision
claus
parents:
diff changeset
   913
     the current time as arguments."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   914
a27a279701f8 Initial revision
claus
parents:
diff changeset
   915
    |low hi|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   916
%{ 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   917
    int now;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   918
a27a279701f8 Initial revision
claus
parents:
diff changeset
   919
    now = time(0);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   920
    hi  = _MKSMALLINT((now >> 16) & 0xFFFF);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   921
    low = _MKSMALLINT(now & 0xFFFF);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   922
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   923
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   924
    aBlock value:low value:hi
a27a279701f8 Initial revision
claus
parents:
diff changeset
   925
a27a279701f8 Initial revision
claus
parents:
diff changeset
   926
    "OperatingSystem getTimeTimeInto:[:low :hi | low printNewline. hi printNewline]"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   927
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   928
a27a279701f8 Initial revision
claus
parents:
diff changeset
   929
getTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   930
    "return current Time (in seconds since 1970).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   931
     This might return a LargeInteger some time."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   932
a27a279701f8 Initial revision
claus
parents:
diff changeset
   933
    ^ self getTimeHi * 16r10000 + self getTimeLow
a27a279701f8 Initial revision
claus
parents:
diff changeset
   934
a27a279701f8 Initial revision
claus
parents:
diff changeset
   935
    "OperatingSystem getTime"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   936
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   937
a27a279701f8 Initial revision
claus
parents:
diff changeset
   938
computeDatePartsOf:timeLow and:timeHi for:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   939
    "compute year, month and day from the time-parts timeLow and
a27a279701f8 Initial revision
claus
parents:
diff changeset
   940
     timeHi and evaluate the argument, a 3-arg block with these.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   941
     This method was added to avoid LargeInteger arithmetic; the time-parts
a27a279701f8 Initial revision
claus
parents:
diff changeset
   942
     are those returned by getTimeLow and getTimeHi."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   943
a27a279701f8 Initial revision
claus
parents:
diff changeset
   944
    |year month day|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   945
a27a279701f8 Initial revision
claus
parents:
diff changeset
   946
    ((timeLow isMemberOf:SmallInteger) and:[timeHi isMemberOf:SmallInteger])
a27a279701f8 Initial revision
claus
parents:
diff changeset
   947
    ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   948
        ^ self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   949
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   950
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   951
    struct tm *tmPtr;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   952
    long t;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   953
a27a279701f8 Initial revision
claus
parents:
diff changeset
   954
    t = (_intVal(timeHi) << 16) | _intVal(timeLow);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   955
    tmPtr = localtime(&t);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   956
    year = _MKSMALLINT(tmPtr->tm_year + 1900);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   957
    month = _MKSMALLINT(tmPtr->tm_mon + 1);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   958
    day = _MKSMALLINT(tmPtr->tm_mday);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   959
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   960
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   961
    aBlock value:year value:month value:day
a27a279701f8 Initial revision
claus
parents:
diff changeset
   962
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   963
a27a279701f8 Initial revision
claus
parents:
diff changeset
   964
computeTimePartsOf:timeLow and:timeHi for:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   965
    "compute hours, minutes and seconds from the time-parts timeLow and
a27a279701f8 Initial revision
claus
parents:
diff changeset
   966
     timeHi and evaluate the argument, a 3-arg block with these."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   967
a27a279701f8 Initial revision
claus
parents:
diff changeset
   968
    |hours minutes seconds|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   969
a27a279701f8 Initial revision
claus
parents:
diff changeset
   970
    ((timeLow isMemberOf:SmallInteger) and:[timeHi isMemberOf:SmallInteger])
a27a279701f8 Initial revision
claus
parents:
diff changeset
   971
    ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   972
        ^ self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   973
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   974
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   975
    struct tm *tmPtr;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   976
    long t;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   977
a27a279701f8 Initial revision
claus
parents:
diff changeset
   978
    t = (_intVal(timeHi) << 16) | _intVal(timeLow);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   979
    tmPtr = localtime(&t);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   980
    hours = _MKSMALLINT(tmPtr->tm_hour);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   981
    minutes = _MKSMALLINT(tmPtr->tm_min);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   982
    seconds = _MKSMALLINT(tmPtr->tm_sec);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   983
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   984
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   985
    aBlock value:hours value:minutes value:seconds
a27a279701f8 Initial revision
claus
parents:
diff changeset
   986
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   987
a27a279701f8 Initial revision
claus
parents:
diff changeset
   988
getMillisecondTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   989
    "since range is limited to 0..1ffffff and value is wrapping around
a27a279701f8 Initial revision
claus
parents:
diff changeset
   990
     at 1fffffff, this can only be used for relative time deltas.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   991
     Use methods below to compare and add time deltas (should move to Time)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   992
a27a279701f8 Initial revision
claus
parents:
diff changeset
   993
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   994
a27a279701f8 Initial revision
claus
parents:
diff changeset
   995
    long t;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   996
#ifdef SYSV
a27a279701f8 Initial revision
claus
parents:
diff changeset
   997
# ifdef HZ
a27a279701f8 Initial revision
claus
parents:
diff changeset
   998
    /* sys5 time */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   999
    long ticks;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1000
    struct tms tb;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1001
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1002
    ticks = times(&tb);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1003
    t = (ticks * 1000) / HZ;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1004
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1005
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1006
    /* bsd time */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1007
    struct timeval tb;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1008
    struct timezone tzb;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1009
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1010
    gettimeofday(&tb, &tzb);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1011
    t = tb.tv_sec*1000 + tb.tv_usec/1000;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1012
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1013
    RETURN ( _MKSMALLINT(t & 0x0FFFFFFF) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1014
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1015
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1016
    self error:'time not available'
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1017
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1018
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1019
millisecondTimeDeltaBetween:msTime1 and:msTime2
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1020
    "subtract two millisecond times (such as returned getMillisecondTime).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1021
     The returned value is msTime1 - msTime2 where a wrap occurs at:16r0FFFFFFF."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1022
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1023
    (msTime1 > msTime2) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1024
        ^ msTime1 - msTime2
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1025
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1026
    ^ msTime1 + 16r10000000 - msTime2
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1027
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1028
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1029
millisecondTime:msTime1 isAfter:msTime2
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1030
    "return true if msTime1 is after msTime2, false if not.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1031
     handling wrap at 16r0FFFFFFF. The two arguments are
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1032
     millisecond times (such as returned getMillisecondTime)."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1033
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1034
    (msTime1 > msTime2) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1035
        ((msTime1 - msTime2) > 16r08000000) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1036
            ^ false
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1037
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1038
        ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1039
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1040
    ((msTime2 - msTime1) > 16r08000000) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1041
        ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1042
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1043
    ^ false
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1044
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1045
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1046
millisecondTimeAdd:msTime1 and:msTime2
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1047
    "add two millisecond times (such as returned getMillisecondTime).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1048
     The returned value is msTime1 + msTime2 where a wrap occurs at:16r0FFFFFFF."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1049
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1050
    |sum|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1051
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1052
    sum := msTime1 + msTime2.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1053
    (sum > 16r0FFFFFFF) ifTrue:[^ sum - 16r10000000].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1054
    (sum < 0) ifTrue:[^ sum + 16r10000000].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1055
    ^ sum
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1056
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1057
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1058
millisecondDelay:millis
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1059
    "delay execution for millis milliseconds."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1060
10
claus
parents: 5
diff changeset
  1061
    self selectOn:nil withTimeOut:millis
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1062
10
claus
parents: 5
diff changeset
  1063
    "OperatingSystem millisecondDelay:2000"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1064
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1065
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1066
sleep:numberOfSeconds
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1067
    "cease any action for some time. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1068
     Not really useful since not even low-prio processes and interrupt
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1069
     handling will run during the sleep - use millisecondDelay:."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1070
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1071
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1072
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1073
    if (_isSmallInteger(numberOfSeconds)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1074
        sleep(_intVal(numberOfSeconds));
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1075
        RETURN ( self );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1076
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1077
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1078
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1079
    self primitiveFailed
10
claus
parents: 5
diff changeset
  1080
! !
claus
parents: 5
diff changeset
  1081
claus
parents: 5
diff changeset
  1082
!OperatingSystem class methodsFor:'waiting for events'!
claus
parents: 5
diff changeset
  1083
claus
parents: 5
diff changeset
  1084
setBlocking:aBoolean on:fd
claus
parents: 5
diff changeset
  1085
    "set/clear the blocking attribute - if set (which is the default)
claus
parents: 5
diff changeset
  1086
     a read on the fileDescriptor will block until data is available.
claus
parents: 5
diff changeset
  1087
     If cleared, a read operation will immediately return with a value of
claus
parents: 5
diff changeset
  1088
     nil."
claus
parents: 5
diff changeset
  1089
claus
parents: 5
diff changeset
  1090
%{  /* NOCONTEXT */
claus
parents: 5
diff changeset
  1091
claus
parents: 5
diff changeset
  1092
    int ret, flags;
claus
parents: 5
diff changeset
  1093
    int savInt;
claus
parents: 5
diff changeset
  1094
claus
parents: 5
diff changeset
  1095
#if defined(F_GETFL) && defined(F_SETFL)
claus
parents: 5
diff changeset
  1096
# if defined(FNDELAY)
claus
parents: 5
diff changeset
  1097
    if (_isSmallInteger(fd)) {
claus
parents: 5
diff changeset
  1098
        flags = fcntl(_intVal(fd), F_GETFL, 0);
claus
parents: 5
diff changeset
  1099
        if (aBoolean == true) {
claus
parents: 5
diff changeset
  1100
            ret = fcntl(_intVal(fd), F_SETFL, flags & ~FNDELAY);
claus
parents: 5
diff changeset
  1101
        } else {
claus
parents: 5
diff changeset
  1102
            ret = fcntl(_intVal(fd), F_SETFL, flags | FNDELAY);
claus
parents: 5
diff changeset
  1103
        }
claus
parents: 5
diff changeset
  1104
        if (ret >= 0) ret = flags;
claus
parents: 5
diff changeset
  1105
        RETURN ( _MKSMALLINT(ret) );
claus
parents: 5
diff changeset
  1106
    }
claus
parents: 5
diff changeset
  1107
# endif
claus
parents: 5
diff changeset
  1108
#endif
claus
parents: 5
diff changeset
  1109
%}
claus
parents: 5
diff changeset
  1110
.
claus
parents: 5
diff changeset
  1111
    self primitiveFailed
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1112
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1113
10
claus
parents: 5
diff changeset
  1114
readCheck:fd
claus
parents: 5
diff changeset
  1115
    "return true, if data is available on a filedescriptor"
claus
parents: 5
diff changeset
  1116
claus
parents: 5
diff changeset
  1117
    (self selectOnAnyReadable:(Array with:fd)
claus
parents: 5
diff changeset
  1118
                     writable:nil
claus
parents: 5
diff changeset
  1119
                        error:nil
claus
parents: 5
diff changeset
  1120
                  withTimeOut:0) == fd
claus
parents: 5
diff changeset
  1121
        ifTrue:[^ true].
claus
parents: 5
diff changeset
  1122
    ^ false
claus
parents: 5
diff changeset
  1123
!
claus
parents: 5
diff changeset
  1124
claus
parents: 5
diff changeset
  1125
writeCheck:fd
claus
parents: 5
diff changeset
  1126
    "return true, if filedescriptor can be written without blocking"
claus
parents: 5
diff changeset
  1127
claus
parents: 5
diff changeset
  1128
    (self selectOnAnyReadable:nil
claus
parents: 5
diff changeset
  1129
                     writable:(Array with:fd)
claus
parents: 5
diff changeset
  1130
                        error:nil
claus
parents: 5
diff changeset
  1131
                  withTimeOut:0) == fd
claus
parents: 5
diff changeset
  1132
        ifTrue:[^ true].
claus
parents: 5
diff changeset
  1133
    ^ false
claus
parents: 5
diff changeset
  1134
!
claus
parents: 5
diff changeset
  1135
claus
parents: 5
diff changeset
  1136
selectOn:fd withTimeOut:millis
claus
parents: 5
diff changeset
  1137
    "wait for aFileDesriptor to become ready; timeout after t milliseconds.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1138
     Return true, if i/o ok, false if timed-out or interrupted.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1139
     With 0 as timeout argument, this can be used to check for availability
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1140
     of read-data.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1141
     Experimental."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1142
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1143
    ^ self selectOnAnyReadable:(Array with:fd)
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1144
                      writable:(Array with:fd)
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1145
                         error:nil
10
claus
parents: 5
diff changeset
  1146
                   withTimeOut:millis
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1147
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1148
10
claus
parents: 5
diff changeset
  1149
selectOn:fd1 and:fd2 withTimeOut:millis
claus
parents: 5
diff changeset
  1150
    "wait for any fd to become ready; timeout after t milliseconds.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1151
     Return fd if i/o ok, nil if timed-out or interrupted.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1152
     Experimental."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1153
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1154
    ^ self selectOnAnyReadable:(Array with:fd1 with:fd2)
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1155
                      writable:(Array with:fd1 with:fd2)
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1156
                         error:nil
10
claus
parents: 5
diff changeset
  1157
                   withTimeOut:millis
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1158
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1159
10
claus
parents: 5
diff changeset
  1160
selectOnAnyReadable:fdArray withTimeOut:millis
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1161
    "wait for any fd in fdArray (an Array of integers) to become ready for reading;
10
claus
parents: 5
diff changeset
  1162
     timeout after t milliseconds. An empty set will always wait.
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1163
     Return first ready fd if i/o ok, nil if timed-out or interrupted.
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1164
     Experimental."
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1165
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1166
    ^ self selectOnAnyReadable:fdArray 
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1167
                      writable:nil 
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1168
                         error:nil
10
claus
parents: 5
diff changeset
  1169
                   withTimeOut:millis
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1170
!
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1171
10
claus
parents: 5
diff changeset
  1172
selectOnAny:fdArray withTimeOut:millis
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1173
    "wait for any fd in fdArray (an Array of integers) to become ready;
10
claus
parents: 5
diff changeset
  1174
     timeout after t milliseconds. An empty set will always wait.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1175
     Return first ready fd if i/o ok, nil if timed-out or interrupted.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1176
     Experimental."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1177
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1178
    ^ self selectOnAnyReadable:fdArray
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1179
                      writable:fdArray
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1180
                         error:nil
10
claus
parents: 5
diff changeset
  1181
                   withTimeOut:millis
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1182
! 
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1183
10
claus
parents: 5
diff changeset
  1184
selectOnAnyReadable:readFdArray writable:writeFdArray error:errorFdArray withTimeOut:millis
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1185
    "wait for any fd in readFdArray (an Array of integers) to become ready for reading,
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1186
     writeFdArray to become ready for writing.
10
claus
parents: 5
diff changeset
  1187
     timeout after t milliseconds. Empty sets will always wait.
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1188
     Return first ready fd if i/o ok, nil if timed-out or interrupted.
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1189
     Experimental."
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1190
10
claus
parents: 5
diff changeset
  1191
    |rcount wcount ecount|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1192
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1193
    (readFdArray notNil and:[readFdArray class ~~ Array]) ifTrue:[
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1194
        ^ self error:'argument must be nil or an Array'
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1195
    ].
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1196
    (writeFdArray notNil and:[writeFdArray class ~~ Array]) ifTrue:[
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1197
        ^ self error:'argument must be nil or an Array'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1198
    ].
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1199
    (errorFdArray notNil and:[errorFdArray class ~~ Array]) ifTrue:[
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1200
        ^ self error:'argument must be nil or an Array'
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1201
    ].
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1202
    rcount := readFdArray size.
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1203
    wcount := writeFdArray size.
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1204
    ecount := errorFdArray size.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1205
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1206
    fd_set rset, wset, eset;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1207
    int t, f, maxF, i, lX, bX;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1208
    struct timeval wt;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1209
    OBJ fd, retFd;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1210
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1211
    if (_isSmallInteger(millis)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1212
        FD_ZERO(&rset);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1213
        FD_ZERO(&wset);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1214
        FD_ZERO(&eset);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1215
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1216
        maxF = -1;
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1217
        for (i=0; i<_intVal(rcount);i++) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1218
            fd = _ArrayInstPtr(readFdArray)->a_element[i];
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1219
            if (fd != nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1220
                f = _intVal(fd);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1221
                if ((f >= 0) && (f < FD_SETSIZE)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1222
                    FD_SET(f, &rset);
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1223
                    if (f > maxF) maxF = f;
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1224
                }
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1225
            }
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1226
        }
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1227
        for (i=0; i<_intVal(wcount);i++) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1228
            fd = _ArrayInstPtr(writeFdArray)->a_element[i];
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1229
            if (fd != nil) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1230
                f = _intVal(fd);
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1231
                if ((f >= 0) && (f < FD_SETSIZE)) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1232
                    FD_SET(f, &wset);       
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1233
                    if (f > maxF) maxF = f;
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1234
                }
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1235
            }
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1236
        }
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1237
        for (i=0; i<_intVal(ecount);i++) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1238
            fd = _ArrayInstPtr(errorFdArray)->a_element[i];
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1239
            if (fd != nil) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1240
                f = _intVal(fd);
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1241
                if ((f >= 0) && (f < FD_SETSIZE)) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1242
                    FD_SET(f, &eset);       
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1243
                    if (f > maxF) maxF = f;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1244
                }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1245
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1246
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1247
        t = _intVal(millis);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1248
        wt.tv_sec = t / 1000;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1249
        wt.tv_usec = (t % 1000) * 1000;
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1250
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1251
        if (select(maxF+1, &rset, &wset, &eset, &wt)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1252
            for (i=0; i <= maxF; i++) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1253
                if (FD_ISSET(i, &rset)
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1254
                 || FD_ISSET(i, &wset)
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1255
                 || FD_ISSET(i, &eset)) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1256
                    RETURN ( _MKSMALLINT(i) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1257
                }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1258
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1259
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1260
        RETURN ( nil );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1261
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1262
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1263
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1264
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1265
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1266
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1267
!OperatingSystem class methodsFor:'executing commands'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1268
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1269
fork
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1270
    "fork a new process"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1271
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1272
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1273
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1274
    int pid;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1275
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1276
    pid = fork();
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1277
    RETURN ( _MKSMALLINT(pid) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1278
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1279
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1280
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1281
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1282
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1283
exec:aPath withArguments:argArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1284
    "execute the unix command specified by the argument, aPath, with
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1285
     arguments in argArray.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1286
     If successful, this method does not return and smalltalk is gone.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1287
     If not sucessfull, false is returned. Normal use is with fork."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1288
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1289
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1290
    char *argv[64];
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1291
    int nargs, i;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1292
    OBJ arg;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1293
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1294
    if (_isString(aPath) && _isArray(argArray)) {
2
claus
parents: 1
diff changeset
  1295
        nargs = _arraySize(argArray);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1296
        for (i=0; i < nargs; i++) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1297
            arg = _ArrayInstPtr(argArray)->a_element[i];
2
claus
parents: 1
diff changeset
  1298
            if (_isString(arg)) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1299
                argv[i] = (char *) _stringVal(arg);
2
claus
parents: 1
diff changeset
  1300
            }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1301
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1302
        argv[i] = NULL;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1303
        execv(_stringVal(aPath), argv);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1304
        /* should not be reached */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1305
        RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1306
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1307
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1308
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1309
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1310
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1311
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1312
executeCommand:aCommandString
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1313
    "execute the unix command specified by the argument, aCommandString.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1314
     Return true if successful, false otherwise. Smalltalk is suspended,
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1315
     while the command is executing."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1316
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1317
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1318
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1319
    int status;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1320
    extern OBJ ErrorNumber;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1321
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1322
    if (_isString(aCommandString)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1323
        status = system((char *) _stringVal(aCommandString));
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1324
        if (status == 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1325
            RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1326
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1327
        ErrorNumber = _MKSMALLINT(errno);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1328
        RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1329
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1330
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1331
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1332
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1333
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1334
    "OperatingSystem executeCommand:'pwd'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1335
    "OperatingSystem executeCommand:'ls -l'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1336
    "OperatingSystem executeCommand:'invalidCommand'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1337
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1338
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1339
!OperatingSystem class methodsFor:'file access'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1340
10
claus
parents: 5
diff changeset
  1341
getCharacter
claus
parents: 5
diff changeset
  1342
    "read a character from keyboard - this is a blocking low-level
claus
parents: 5
diff changeset
  1343
     read provided for debugger and fatal conditions. Use Stdin or
claus
parents: 5
diff changeset
  1344
     (even better) the event mechanisms provided."
claus
parents: 5
diff changeset
  1345
claus
parents: 5
diff changeset
  1346
%{  /* NOCONTEXT */
claus
parents: 5
diff changeset
  1347
claus
parents: 5
diff changeset
  1348
    RETURN ( _MKSMALLINT(getchar()) );
claus
parents: 5
diff changeset
  1349
%}
claus
parents: 5
diff changeset
  1350
!
claus
parents: 5
diff changeset
  1351
2
claus
parents: 1
diff changeset
  1352
fileSeparator
claus
parents: 1
diff changeset
  1353
    "return the character used to separate names in a path.
claus
parents: 1
diff changeset
  1354
     This character differs for MSDOS and other systems,
claus
parents: 1
diff changeset
  1355
     (but those are currently not supported)"
claus
parents: 1
diff changeset
  1356
claus
parents: 1
diff changeset
  1357
    ^ $/
claus
parents: 1
diff changeset
  1358
!
claus
parents: 1
diff changeset
  1359
claus
parents: 1
diff changeset
  1360
baseNameOf:aPathString
claus
parents: 1
diff changeset
  1361
    "return the baseName of the argument, aPathString
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1362
     - thats the file/directory name without leading parent-dirs
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1363
     (i.e. OperatingSystem baseNameOf:'/usr/lib/st/file' -> 'file'
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1364
       and OperatingSystem baseNameOf:'/usr/lib' -> lib).
2
claus
parents: 1
diff changeset
  1365
     This method does not check if the path is valid 
claus
parents: 1
diff changeset
  1366
     (i.e. if these directories really exist)."
claus
parents: 1
diff changeset
  1367
claus
parents: 1
diff changeset
  1368
    |prev index sep|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1369
2
claus
parents: 1
diff changeset
  1370
    sep := self fileSeparator.
claus
parents: 1
diff changeset
  1371
    ((aPathString size == 1) and:[(aPathString at:1) == sep]) ifTrue:[
claus
parents: 1
diff changeset
  1372
        ^ aPathString
claus
parents: 1
diff changeset
  1373
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1374
    prev := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1375
    [true] whileTrue:[
10
claus
parents: 5
diff changeset
  1376
        index := aPathString indexOf:sep startingAt:prev.
2
claus
parents: 1
diff changeset
  1377
        index == 0 ifTrue:[
claus
parents: 1
diff changeset
  1378
            ^ aPathString copyFrom:prev
claus
parents: 1
diff changeset
  1379
        ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1380
        prev := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1381
    ]
2
claus
parents: 1
diff changeset
  1382
claus
parents: 1
diff changeset
  1383
    "OperatingSystem baseNameOf:'/fee/foo/bar'"
claus
parents: 1
diff changeset
  1384
    "OperatingSystem baseNameOf:'foo/bar'"
claus
parents: 1
diff changeset
  1385
    "OperatingSystem baseNameOf:'../../foo/bar'"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1386
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1387
2
claus
parents: 1
diff changeset
  1388
directoryNameOf:aPathString
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1389
    "return the directoryName of the argument, aPath
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1390
     - thats the name of the directory where aPath is
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1391
     (i.e. OperatingSystem directoryNameOf:'/usr/lib/st/file' -> '/usr/lib/st'
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1392
       and OperatingSystem directoryNameOf:'/usr/lib' -> /usr').
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1393
     This method does not check if the path is valid (i.e. if these directories
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1394
     really exist)."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1395
2
claus
parents: 1
diff changeset
  1396
    |last index sep sepString|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1397
2
claus
parents: 1
diff changeset
  1398
    sep := self fileSeparator.
claus
parents: 1
diff changeset
  1399
    sepString := sep asString.
claus
parents: 1
diff changeset
  1400
    (aPathString = sepString) ifTrue:[
claus
parents: 1
diff changeset
  1401
        ^ aPathString
claus
parents: 1
diff changeset
  1402
    ].
claus
parents: 1
diff changeset
  1403
    (aPathString startsWith:sepString) ifFalse:[
claus
parents: 1
diff changeset
  1404
        (aPathString endsWith:sepString) ifTrue:[
claus
parents: 1
diff changeset
  1405
            ^ aPathString copyFrom:1 to:(aPathString size - 1)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1406
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1407
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1408
    last := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1409
    [true] whileTrue:[
10
claus
parents: 5
diff changeset
  1410
        index := aPathString indexOf:sep startingAt:(last + 1).
2
claus
parents: 1
diff changeset
  1411
        index == 0 ifTrue:[
claus
parents: 1
diff changeset
  1412
            (last == 1) ifTrue:[^ sepString].
claus
parents: 1
diff changeset
  1413
            ^ aPathString copyFrom:1 to:(last - 1)
claus
parents: 1
diff changeset
  1414
        ].
claus
parents: 1
diff changeset
  1415
        last := index.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1416
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1417
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1418
    "OperatingSystem directoryNameOf:'/fee/foo/bar'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1419
    "OperatingSystem directoryNameOf:'foo/bar'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1420
    "OperatingSystem directoryNameOf:'../../foo/bar'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1421
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1422
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1423
isValidPath:aPathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1424
    "return true, if 'aPathName' is a valid path name
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1425
     (i.e. the file or directory exists)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1426
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1427
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1428
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1429
    struct stat buf;
10
claus
parents: 5
diff changeset
  1430
    int ret;
claus
parents: 5
diff changeset
  1431
    extern errno;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1432
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1433
    if (_isString(aPathName)) {
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1434
        do {
10
claus
parents: 5
diff changeset
  1435
            ret = stat((char *) _stringVal(aPathName), &buf);
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1436
        } while (ret < 0 && errno == EINTR);
10
claus
parents: 5
diff changeset
  1437
        RETURN ( ret ? false : true );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1438
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1439
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1440
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1441
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1442
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1443
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1444
isDirectory:aPathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1445
    "return true, if 'aPathName' is a valid directory path name.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1446
     (i.e. exists and is a directory)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1447
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1448
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1449
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1450
    struct stat buf;
10
claus
parents: 5
diff changeset
  1451
    int ret;
claus
parents: 5
diff changeset
  1452
    extern errno;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1453
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1454
    if (_isString(aPathName)) {
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1455
        do {
10
claus
parents: 5
diff changeset
  1456
            ret = stat((char *) _stringVal(aPathName), &buf);
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1457
        } while (ret < 0 && errno == EINTR);
10
claus
parents: 5
diff changeset
  1458
        if ((ret < 0) || ((buf.st_mode & S_IFMT) != S_IFDIR)) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1459
            RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1460
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1461
        RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1462
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1463
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1464
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1465
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1466
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1467
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1468
isReadable:aPathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1469
    "return true, if the file/dir 'aPathName' is readable."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1470
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1471
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1472
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1473
    extern OBJ ErrorNumber;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1474
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1475
    if (_isString(aPathName)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1476
        if (access(_stringVal(aPathName), R_OK) == 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1477
            RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1478
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1479
        ErrorNumber = _MKSMALLINT(errno);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1480
        RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1481
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1482
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1483
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1484
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1485
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1486
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1487
isWritable:aPathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1488
    "return true, if the given file is writable"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1489
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1490
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1491
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1492
    extern OBJ ErrorNumber;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1493
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1494
    if (_isString(aPathName)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1495
        if (access(_stringVal(aPathName), W_OK) == 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1496
            RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1497
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1498
        ErrorNumber = _MKSMALLINT(errno);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1499
        RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1500
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1501
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1502
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1503
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1504
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1505
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1506
isExecutable:aPathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1507
    "return true, if the given file is executable"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1508
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1509
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1510
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1511
    extern OBJ ErrorNumber;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1512
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1513
    if (_isString(aPathName)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1514
        if (access(_stringVal(aPathName), X_OK) == 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1515
            RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1516
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1517
        ErrorNumber = _MKSMALLINT(errno);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1518
        RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1519
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1520
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1521
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1522
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1523
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1524
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1525
infoOf:aPathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1526
    "return an dictionary filled with info for the file 'aPathName';
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1527
     info is: (type->t mode->n uid->u gid->g size->s id->ino).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1528
     return nil if such a file does not exist. A dictionary is returned,
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1529
     since we might need to add more info in the future without affecting
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1530
     existing applications."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1531
2
claus
parents: 1
diff changeset
  1532
    |info type mode uid gid size id atimeLow atimeHi mtimeLow mtimeHi|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1533
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1534
    "{ Symbol: directory }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1535
    "{ Symbol: regular }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1536
    "{ Symbol: characterSpecial }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1537
    "{ Symbol: blockSpecial }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1538
    "{ Symbol: fifo }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1539
    "{ Symbol: socket }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1540
    "{ Symbol: symbolicLink }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1541
    "{ Symbol: unknown }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1542
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1543
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1544
    struct stat buf;
10
claus
parents: 5
diff changeset
  1545
    int ret;
claus
parents: 5
diff changeset
  1546
    extern errno;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1547
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1548
    if (_isString(aPathName)) {
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1549
        do {
10
claus
parents: 5
diff changeset
  1550
            ret = stat((char *) _stringVal(aPathName), &buf);
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1551
        } while (ret < 0 && errno == EINTR);
10
claus
parents: 5
diff changeset
  1552
        if (ret < 0) {
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1553
            ErrorNumber = _MKSMALLINT(errno);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1554
            RETURN ( nil );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1555
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1556
        switch (buf.st_mode & S_IFMT) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1557
            case S_IFDIR:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1558
                type = _directory;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1559
                break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1560
            case S_IFCHR:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1561
                type = _characterSpecial;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1562
                break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1563
            case S_IFBLK:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1564
                type = _blockSpecial;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1565
                break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1566
            case S_IFREG:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1567
                type = _regular;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1568
                break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1569
#ifdef S_IFLNK
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1570
            case S_IFLNK:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1571
                type = _symbolicLink;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1572
                break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1573
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1574
#ifdef S_IFSOCK
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1575
            case S_IFSOCK:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1576
                type = _socket;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1577
                break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1578
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1579
#ifdef S_IFIFO
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1580
            case S_IFIFO:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1581
                type = _fifo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1582
                break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1583
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1584
            default:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1585
                type = _unknown;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1586
                break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1587
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1588
        mode = _MKSMALLINT(buf.st_mode & 0777);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1589
        uid = _MKSMALLINT(buf.st_uid);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1590
        gid = _MKSMALLINT(buf.st_gid);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1591
        size = _MKSMALLINT(buf.st_size);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1592
        id = _MKSMALLINT(buf.st_ino);
2
claus
parents: 1
diff changeset
  1593
        atimeLow = _MKSMALLINT(buf.st_atime & 0xFFFF);
claus
parents: 1
diff changeset
  1594
        atimeHi = _MKSMALLINT((buf.st_atime >> 16) & 0xFFFF);
claus
parents: 1
diff changeset
  1595
        mtimeLow = _MKSMALLINT(buf.st_mtime & 0xFFFF);
claus
parents: 1
diff changeset
  1596
        mtimeHi = _MKSMALLINT((buf.st_mtime >> 16) & 0xFFFF);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1597
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1598
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1599
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1600
    mode notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1601
        info := IdentityDictionary new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1602
        info at:#type put:type.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1603
        info at:#mode put:mode.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1604
        info at:#uid put:uid.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1605
        info at:#gid put:gid.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1606
        info at:#size put:size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1607
        info at:#id put:id.
2
claus
parents: 1
diff changeset
  1608
        info at:#accessTime       put:(Time fromUnixTimeLow:atimeLow and:atimeHi).
claus
parents: 1
diff changeset
  1609
        info at:#modificationTime put:(Time fromUnixTimeLow:mtimeLow and:mtimeHi).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1610
        ^ info
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1611
   ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1612
   self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1613
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1614
   "OperatingSystem infoOf:'/'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1615
   "(OperatingSystem infoOf:'/') at:#uid"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1616
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1617
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1618
accessModeOf:aPathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1619
    "return a number representing access rights rwxrwxrwx for owner,
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1620
     group and others. return nil if such a file does not exist."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1621
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1622
    "
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1623
     this could have been implemented as:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1624
        (self infoOf:aPathName) at:#mode
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1625
     but for huge directory searches the code below is faster
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1626
    "
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1627
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1628
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1629
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1630
    struct stat buf;
10
claus
parents: 5
diff changeset
  1631
    int ret;
claus
parents: 5
diff changeset
  1632
    extern errno;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1633
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1634
    if (_isString(aPathName)) {
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1635
        do {
10
claus
parents: 5
diff changeset
  1636
            ret = stat((char *) _stringVal(aPathName), &buf);
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1637
        } while (ret < 0 && errno == EINTR);
10
claus
parents: 5
diff changeset
  1638
        if (ret < 0) {
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1639
            ErrorNumber = _MKSMALLINT(errno);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1640
            RETURN ( nil );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1641
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1642
        RETURN ( _MKSMALLINT(buf.st_mode & 0777) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1643
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1644
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1645
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1646
   self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1647
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1648
   "(OperatingSystem accessModeOf:'/') printStringRadix:8"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1649
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1650
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1651
changeAccessModeOf:aPathName to:modeBits
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1652
    "change the access rights rwxrwxrwx for owner,
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1653
     group and others of aPathName. return true if changed, false
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1654
     if such a file does not exist or change was not allowd."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1655
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1656
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1657
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1658
    if (_isString(aPathName) && _isSmallInteger(modeBits)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1659
        RETURN ( (chmod((char *) _stringVal(aPathName), _intVal(modeBits) ) < 0) ?
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1660
                                false : true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1661
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1662
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1663
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1664
   self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1665
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1666
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1667
timeOfLastChange:aPathName
2
claus
parents: 1
diff changeset
  1668
    "return the time, when the file was last changed"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1669
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1670
    |timeLow timeHi|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1671
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1672
    struct stat buf;
10
claus
parents: 5
diff changeset
  1673
    int ret;
claus
parents: 5
diff changeset
  1674
    extern errno;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1675
    time_t mtime;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1676
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1677
    if (_isString(aPathName)) {
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1678
        do {
10
claus
parents: 5
diff changeset
  1679
            ret = stat((char *) _stringVal(aPathName), &buf);
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1680
        } while (ret < 0 && errno == EINTR);
10
claus
parents: 5
diff changeset
  1681
        if (ret >= 0) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1682
            timeLow = _MKSMALLINT(buf.st_mtime & 0xFFFF);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1683
            timeHi = _MKSMALLINT((buf.st_mtime >> 16) & 0xFFFF);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1684
        }
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1685
        ErrorNumber = _MKSMALLINT(errno);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1686
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1687
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1688
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1689
    timeLow notNil ifTrue:[^ Time fromUnixTimeLow:timeLow and:timeHi].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1690
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1691
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1692
    "OperatingSystem timeOfLastChange:'/'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1693
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1694
2
claus
parents: 1
diff changeset
  1695
timeOfLastAccess:aPathName
claus
parents: 1
diff changeset
  1696
    "return the time, when the file was last accessed"
claus
parents: 1
diff changeset
  1697
claus
parents: 1
diff changeset
  1698
    |timeLow timeHi|
claus
parents: 1
diff changeset
  1699
%{
claus
parents: 1
diff changeset
  1700
    struct stat buf;
claus
parents: 1
diff changeset
  1701
    time_t mtime;
10
claus
parents: 5
diff changeset
  1702
    int ret;
claus
parents: 5
diff changeset
  1703
    extern errno;
2
claus
parents: 1
diff changeset
  1704
claus
parents: 1
diff changeset
  1705
    if (_isString(aPathName)) {
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1706
        do {
10
claus
parents: 5
diff changeset
  1707
            ret = stat((char *) _stringVal(aPathName), &buf);
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1708
        } while (ret < 0 && errno == EINTR);
10
claus
parents: 5
diff changeset
  1709
        if (ret >= 0) {
2
claus
parents: 1
diff changeset
  1710
            timeLow = _MKSMALLINT(buf.st_atime & 0xFFFF);
claus
parents: 1
diff changeset
  1711
            timeHi = _MKSMALLINT((buf.st_atime >> 16) & 0xFFFF);
claus
parents: 1
diff changeset
  1712
        }
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1713
        ErrorNumber = _MKSMALLINT(errno);
2
claus
parents: 1
diff changeset
  1714
    }
claus
parents: 1
diff changeset
  1715
%}
claus
parents: 1
diff changeset
  1716
.
claus
parents: 1
diff changeset
  1717
    timeLow notNil ifTrue:[^ Time fromUnixTimeLow:timeLow and:timeHi].
claus
parents: 1
diff changeset
  1718
    self primitiveFailed
claus
parents: 1
diff changeset
  1719
claus
parents: 1
diff changeset
  1720
    "OperatingSystem timeOfLastAccess:'/'"
claus
parents: 1
diff changeset
  1721
!
claus
parents: 1
diff changeset
  1722
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1723
idOf:aPathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1724
    "return the fileNumber (i.e. inode number) of a file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1725
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1726
    "
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1727
     this could have been implemented as:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1728
        (self infoOf:aPathName) at:#id 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1729
     but for huge directory searches the code below is faster
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1730
    "
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1731
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1732
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1733
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1734
    struct stat buf;
10
claus
parents: 5
diff changeset
  1735
    int ret;
claus
parents: 5
diff changeset
  1736
    extern errno;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1737
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1738
    if (_isString(aPathName)) {
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1739
        do {
10
claus
parents: 5
diff changeset
  1740
            ret = stat((char *) _stringVal(aPathName), &buf);
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1741
        } while (ret < 0 && errno == EINTR);
10
claus
parents: 5
diff changeset
  1742
        if (ret >= 0) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1743
            RETURN (_MKSMALLINT(buf.st_ino));
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1744
        }
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1745
        ErrorNumber = _MKSMALLINT(errno);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1746
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1747
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1748
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1749
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1750
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1751
    "OperatingSystem idOf:'/'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1752
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1753
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1754
typeOf:aPathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1755
    "return the type of a file as a symbol"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1756
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1757
    "
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1758
     this could have been implemented as:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1759
        (self infoOf:aPathName) at:#type 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1760
     but for huge directory searches the code below is faster
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1761
    "
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1762
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1763
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1764
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1765
    struct stat buf;
10
claus
parents: 5
diff changeset
  1766
    int ret;
claus
parents: 5
diff changeset
  1767
    extern errno;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1768
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1769
    if (_isString(aPathName)) {
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1770
        do {
10
claus
parents: 5
diff changeset
  1771
            ret = stat((char *) _stringVal(aPathName), &buf);
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1772
        } while (ret < 0 && errno == EINTR);
10
claus
parents: 5
diff changeset
  1773
        if (ret < 0) {
17
b47449d01e5f *** empty log message ***
claus
parents: 13
diff changeset
  1774
            ErrorNumber = _MKSMALLINT(errno);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1775
            RETURN ( nil );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1776
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1777
        switch (buf.st_mode & S_IFMT) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1778
            case S_IFDIR:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1779
                RETURN ( _directory );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1780
            case S_IFCHR:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1781
                RETURN ( _characterSpecial );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1782
            case S_IFBLK:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1783
                RETURN ( _blockSpecial );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1784
            case S_IFREG:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1785
                RETURN ( _regular );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1786
#ifdef S_IFLNK
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1787
            case S_IFLNK:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1788
                RETURN ( _symbolicLink );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1789
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1790
#ifdef S_IFSOCK
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1791
            case S_IFSOCK:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1792
                RETURN ( _socket );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1793
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1794
#ifdef S_IFIFO
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1795
            case S_IFIFO:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1796
                RETURN ( _fifo );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1797
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1798
            default:
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1799
                RETURN ( _unknown );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1800
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1801
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1802
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1803
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1804
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1805
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1806
    "OperatingSystem typeOf:'/'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1807
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1808
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1809
createDirectory:newPathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1810
    "create a new directory with name 'newPathName'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1811
     Return true if successful, false if failed."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1812
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1813
    "since createDirectory is not used too often,
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1814
     you'll forgive me using mkdir ..."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1815
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1816
    ^ self executeCommand:('mkdir ' , newPathName)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1817
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1818
    "OperatingSystem createDirectory:'foo'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1819
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1820
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1821
recursiveCreateDirectory:dirName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1822
    "create a directory - with all parent dirs if needed.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1823
     Return true if successful, false otherwise. If false
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1824
     is returned, a partial created tree may be left,
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1825
     which is not cleaned-up here."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1826
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1827
    self createDirectory:dirName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1828
    (self isDirectory:dirName) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1829
        (self recursiveCreateDirectory:(self directoryNameOf:dirName)) ifFalse:[^ false].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1830
        ^ self createDirectory:dirName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1831
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1832
    ^ (self isDirectory:dirName)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1833
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1834
    "OperatingSystem recursiveCreateDirectory:'foo/bar/baz'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1835
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1836
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1837
removeFile:fullPathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1838
    "remove the file named 'fullPathName'; return true if successful"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1839
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1840
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1841
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1842
    if (_isString(fullPathName)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1843
        RETURN ( (unlink((char *) _stringVal(fullPathName)) >= 0) ? true : false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1844
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1845
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1846
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1847
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1848
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1849
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1850
removeDirectory:fullPathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1851
    "remove the directory named 'fullPathName'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1852
     Return true if successful, false if directory is not empty or no permission"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1853
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1854
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1855
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1856
    if (_isString(fullPathName)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1857
        RETURN ( (rmdir((char *) _stringVal(fullPathName)) >= 0) ? true : false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1858
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1859
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1860
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1861
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1862
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1863
18
e0994bb28ef5 added recursive rmdir
claus
parents: 17
diff changeset
  1864
recursiveRemoveDirectory:fullPathName
e0994bb28ef5 added recursive rmdir
claus
parents: 17
diff changeset
  1865
    "remove the directory named 'fullPathName' and all contained files/directories.
e0994bb28ef5 added recursive rmdir
claus
parents: 17
diff changeset
  1866
     Return true if successful."
e0994bb28ef5 added recursive rmdir
claus
parents: 17
diff changeset
  1867
e0994bb28ef5 added recursive rmdir
claus
parents: 17
diff changeset
  1868
    ^ self executeCommand:('rm -rf ' , fullPathName)
e0994bb28ef5 added recursive rmdir
claus
parents: 17
diff changeset
  1869
!
e0994bb28ef5 added recursive rmdir
claus
parents: 17
diff changeset
  1870
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1871
link:oldPath to:newPath
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1872
    "link the file 'oldPath' to 'newPath'. The link will be a hard link.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1873
     Return true if successful, false if not."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1874
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1875
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1876
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1877
    if (_isString(oldPath) && _isString(newPath)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1878
        RETURN ( (link((char *) _stringVal(oldPath), (char *) _stringVal(newPath)) >= 0) ?
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1879
                                true : false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1880
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1881
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1882
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1883
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1884
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1885
    "OperatingSystem link:'foo' to:'bar'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1886
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1887
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1888
rename:oldPath to:newPath
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1889
    "rename the file 'oldPath' to 'newPath'. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1890
     Return true if sucessfull, false if not"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1891
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1892
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1893
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1894
    if (_isString(oldPath) && _isString(newPath)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1895
#if defined(BSD)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1896
        if (rename((char *) _stringVal(oldPath), (char *) _stringVal(newPath)) >= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1897
            RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1898
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1899
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1900
        if (link((char *) _stringVal(oldPath), (char *) _stringVal(newPath)) >= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1901
            if (unlink((char *) _stringVal(oldPath)) >= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1902
                RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1903
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1904
            unlink((char *) _stringVal(newPath));
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1905
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1906
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1907
        RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1908
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1909
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1910
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1911
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1912
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1913
    "OperatingSystem rename:'foo' to:'bar'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1914
! !