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