src/hotspot/os/bsd/attachListener_bsd.cpp
author ysuenaga
Tue, 16 Jul 2019 07:29:12 +0900
changeset 55682 70fab3a8ff02
parent 50333 7cea35f78b50
permissions -rw-r--r--
8225690: Multiple AttachListener threads can be created Reviewed-by: sspitsyn, cjplummer
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     1
/*
55682
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
     2
 * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     4
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     7
 * published by the Free Software Foundation.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     8
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    13
 * accompanied this code).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    14
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    18
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    21
 * questions.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    22
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    23
 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    24
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    25
#include "precompiled.hpp"
49593
4dd58ecc9912 8200105: Remove cyclic dependency between oop.inline.hpp and collectedHeap.inline.hpp
stefank
parents: 49449
diff changeset
    26
#include "logging/log.hpp"
49449
ef5d5d343e2a 8199263: Split interfaceSupport.hpp to not require including .inline.hpp files
coleenp
parents: 47216
diff changeset
    27
#include "runtime/interfaceSupport.inline.hpp"
25468
5331df506290 8048241: Introduce umbrella header os.inline.hpp and clean up includes
goetz
parents: 19269
diff changeset
    28
#include "runtime/os.inline.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    29
#include "services/attachListener.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    30
#include "services/dtraceAttacher.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    31
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    32
#include <unistd.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    33
#include <signal.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    34
#include <sys/types.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    35
#include <sys/socket.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    36
#include <sys/un.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    37
#include <sys/stat.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    38
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    39
#ifndef UNIX_PATH_MAX
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    40
#define UNIX_PATH_MAX   sizeof(((struct sockaddr_un *)0)->sun_path)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    41
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    42
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    43
// The attach mechanism on Bsd uses a UNIX domain socket. An attach listener
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    44
// thread is created at startup or is created on-demand via a signal from
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    45
// the client tool. The attach listener creates a socket and binds it to a file
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    46
// in the filesystem. The attach listener then acts as a simple (single-
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    47
// threaded) server - it waits for a client to connect, reads the request,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    48
// executes it, and returns the response to the client via the socket
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    49
// connection.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    50
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    51
// As the socket is a UNIX domain socket it means that only clients on the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    52
// local machine can connect. In addition there are two other aspects to
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    53
// the security:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    54
// 1. The well known file that the socket is bound to has permission 400
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    55
// 2. When a client connect, the SO_PEERCRED socket option is used to
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    56
//    obtain the credentials of client. We check that the effective uid
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    57
//    of the client matches this process.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    58
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    59
// forward reference
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    60
class BsdAttachOperation;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    61
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    62
class BsdAttachListener: AllStatic {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    63
 private:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    64
  // the path to which we bind the UNIX domain socket
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    65
  static char _path[UNIX_PATH_MAX];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    66
  static bool _has_path;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    67
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    68
  // the file descriptor for the listening socket
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    69
  static int _listener;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    70
55682
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    71
  static bool _atexit_registered;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    72
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    73
  // reads a request from the given connected socket
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    74
  static BsdAttachOperation* read_request(int s);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    75
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    76
 public:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    77
  enum {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    78
    ATTACH_PROTOCOL_VER = 1                     // protocol version
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    79
  };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    80
  enum {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    81
    ATTACH_ERROR_BADVERSION     = 101           // error codes
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    82
  };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    83
55682
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    84
  static void set_path(char* path) {
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    85
    if (path == NULL) {
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    86
      _path[0] = '\0';
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    87
      _has_path = false;
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    88
    } else {
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    89
      strncpy(_path, path, UNIX_PATH_MAX);
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    90
      _path[UNIX_PATH_MAX-1] = '\0';
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    91
      _has_path = true;
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    92
    }
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    93
  }
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    94
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    95
  static void set_listener(int s)               { _listener = s; }
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
    96
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    97
  // initialize the listener, returns 0 if okay
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    98
  static int init();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    99
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   100
  static char* path()                   { return _path; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   101
  static bool has_path()                { return _has_path; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   102
  static int listener()                 { return _listener; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   103
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   104
  // write the given buffer to a socket
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   105
  static int write_fully(int s, char* buf, int len);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   106
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   107
  static BsdAttachOperation* dequeue();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   108
};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   109
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   110
class BsdAttachOperation: public AttachOperation {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   111
 private:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   112
  // the connection to the client
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   113
  int _socket;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   114
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   115
 public:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   116
  void complete(jint res, bufferedStream* st);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   117
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   118
  void set_socket(int s)                                { _socket = s; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   119
  int socket() const                                    { return _socket; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   120
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   121
  BsdAttachOperation(char* name) : AttachOperation(name) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   122
    set_socket(-1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   123
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   124
};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   125
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   126
// statics
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   127
char BsdAttachListener::_path[UNIX_PATH_MAX];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   128
bool BsdAttachListener::_has_path;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   129
int BsdAttachListener::_listener = -1;
55682
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   130
bool BsdAttachListener::_atexit_registered = false;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   131
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   132
// Supporting class to help split a buffer into individual components
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   133
class ArgumentIterator : public StackObj {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   134
 private:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   135
  char* _pos;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   136
  char* _end;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   137
 public:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   138
  ArgumentIterator(char* arg_buffer, size_t arg_size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   139
    _pos = arg_buffer;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   140
    _end = _pos + arg_size - 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   141
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   142
  char* next() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   143
    if (*_pos == '\0') {
49742
1196aa0be8be 8201247: Various cleanups in the attach framework
clanger
parents: 49593
diff changeset
   144
      // advance the iterator if possible (null arguments)
1196aa0be8be 8201247: Various cleanups in the attach framework
clanger
parents: 49593
diff changeset
   145
      if (_pos < _end) {
1196aa0be8be 8201247: Various cleanups in the attach framework
clanger
parents: 49593
diff changeset
   146
        _pos += 1;
1196aa0be8be 8201247: Various cleanups in the attach framework
clanger
parents: 49593
diff changeset
   147
      }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   148
      return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   149
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   150
    char* res = _pos;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   151
    char* next_pos = strchr(_pos, '\0');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   152
    if (next_pos < _end)  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   153
      next_pos++;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   154
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   155
    _pos = next_pos;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   156
    return res;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   157
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   158
};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   159
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   160
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   161
// atexit hook to stop listener and unlink the file that it is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   162
// bound too.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   163
extern "C" {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   164
  static void listener_cleanup() {
55682
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   165
    int s = BsdAttachListener::listener();
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   166
    if (s != -1) {
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   167
      BsdAttachListener::set_listener(-1);
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   168
      ::shutdown(s, SHUT_RDWR);
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   169
      ::close(s);
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   170
    }
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   171
    if (BsdAttachListener::has_path()) {
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   172
      ::unlink(BsdAttachListener::path());
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   173
      BsdAttachListener::set_path(NULL);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   174
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   175
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   176
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   177
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   178
// Initialization - create a listener socket and bind it to a file
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   179
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   180
int BsdAttachListener::init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   181
  char path[UNIX_PATH_MAX];          // socket file
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   182
  char initial_path[UNIX_PATH_MAX];  // socket file during setup
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   183
  int listener;                      // listener socket (file descriptor)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   184
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   185
  // register function to cleanup
55682
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   186
  if (!_atexit_registered) {
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   187
    _atexit_registered = true;
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   188
    ::atexit(listener_cleanup);
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   189
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   190
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   191
  int n = snprintf(path, UNIX_PATH_MAX, "%s/.java_pid%d",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   192
                   os::get_temp_directory(), os::current_process_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   193
  if (n < (int)UNIX_PATH_MAX) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   194
    n = snprintf(initial_path, UNIX_PATH_MAX, "%s.tmp", path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   195
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   196
  if (n >= (int)UNIX_PATH_MAX) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   197
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   198
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   199
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   200
  // create the listener socket
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   201
  listener = ::socket(PF_UNIX, SOCK_STREAM, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   202
  if (listener == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   203
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   204
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   205
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   206
  // bind socket
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   207
  struct sockaddr_un addr;
49742
1196aa0be8be 8201247: Various cleanups in the attach framework
clanger
parents: 49593
diff changeset
   208
  memset((void *)&addr, 0, sizeof(addr));
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   209
  addr.sun_family = AF_UNIX;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   210
  strcpy(addr.sun_path, initial_path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   211
  ::unlink(initial_path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   212
  int res = ::bind(listener, (struct sockaddr*)&addr, sizeof(addr));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   213
  if (res == -1) {
18078
10417cf9967d 7178026: os::close can restart ::close but that is not a restartable syscall
rdurbin
parents: 14286
diff changeset
   214
    ::close(listener);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   215
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   216
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   217
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   218
  // put in listen mode, set permissions, and rename into place
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   219
  res = ::listen(listener, 5);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   220
  if (res == 0) {
12155
e2a2328a872b 7152800: All tests using the attach API fail with "well-known file is not secure" on Mac OS X
sla
parents: 10565
diff changeset
   221
    RESTARTABLE(::chmod(initial_path, S_IREAD|S_IWRITE), res);
e2a2328a872b 7152800: All tests using the attach API fail with "well-known file is not secure" on Mac OS X
sla
parents: 10565
diff changeset
   222
    if (res == 0) {
e2a2328a872b 7152800: All tests using the attach API fail with "well-known file is not secure" on Mac OS X
sla
parents: 10565
diff changeset
   223
      // make sure the file is owned by the effective user and effective group
50067
88b76c19d8eb 8202650: Enforce group for attach listener file
clanger
parents: 49742
diff changeset
   224
      // e.g. default behavior on mac is that new files inherit the group of
88b76c19d8eb 8202650: Enforce group for attach listener file
clanger
parents: 49742
diff changeset
   225
      // the directory that they are created in
12155
e2a2328a872b 7152800: All tests using the attach API fail with "well-known file is not secure" on Mac OS X
sla
parents: 10565
diff changeset
   226
      RESTARTABLE(::chown(initial_path, geteuid(), getegid()), res);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   227
      if (res == 0) {
12155
e2a2328a872b 7152800: All tests using the attach API fail with "well-known file is not secure" on Mac OS X
sla
parents: 10565
diff changeset
   228
        res = ::rename(initial_path, path);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   229
      }
12155
e2a2328a872b 7152800: All tests using the attach API fail with "well-known file is not secure" on Mac OS X
sla
parents: 10565
diff changeset
   230
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   231
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   232
  if (res == -1) {
18078
10417cf9967d 7178026: os::close can restart ::close but that is not a restartable syscall
rdurbin
parents: 14286
diff changeset
   233
    ::close(listener);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   234
    ::unlink(initial_path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   235
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   236
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   237
  set_path(path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   238
  set_listener(listener);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   239
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   240
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   241
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   242
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   243
// Given a socket that is connected to a peer we read the request and
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   244
// create an AttachOperation. As the socket is blocking there is potential
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   245
// for a denial-of-service if the peer does not response. However this happens
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   246
// after the peer credentials have been checked and in the worst case it just
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   247
// means that the attach listener thread is blocked.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   248
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   249
BsdAttachOperation* BsdAttachListener::read_request(int s) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   250
  char ver_str[8];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   251
  sprintf(ver_str, "%d", ATTACH_PROTOCOL_VER);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   252
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   253
  // The request is a sequence of strings so we first figure out the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   254
  // expected count and the maximum possible length of the request.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   255
  // The request is:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   256
  //   <ver>0<cmd>0<arg>0<arg>0<arg>0
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   257
  // where <ver> is the protocol version (1), <cmd> is the command
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   258
  // name ("load", "datadump", ...), and <arg> is an argument
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   259
  int expected_str_count = 2 + AttachOperation::arg_count_max;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   260
  const int max_len = (sizeof(ver_str) + 1) + (AttachOperation::name_length_max + 1) +
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   261
    AttachOperation::arg_count_max*(AttachOperation::arg_length_max + 1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   262
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   263
  char buf[max_len];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   264
  int str_count = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   265
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   266
  // Read until all (expected) strings have been read, the buffer is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   267
  // full, or EOF.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   268
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   269
  int off = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   270
  int left = max_len;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   271
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   272
  do {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   273
    int n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   274
    RESTARTABLE(read(s, buf+off, left), n);
49742
1196aa0be8be 8201247: Various cleanups in the attach framework
clanger
parents: 49593
diff changeset
   275
    assert(n <= left, "buffer was too small, impossible!");
1196aa0be8be 8201247: Various cleanups in the attach framework
clanger
parents: 49593
diff changeset
   276
    buf[max_len - 1] = '\0';
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   277
    if (n == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   278
      return NULL;      // reset by peer or other error
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   279
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   280
    if (n == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   281
      break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   282
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   283
    for (int i=0; i<n; i++) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   284
      if (buf[off+i] == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   285
        // EOS found
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   286
        str_count++;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   287
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   288
        // The first string is <ver> so check it now to
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   289
        // check for protocol mis-match
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   290
        if (str_count == 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   291
          if ((strlen(buf) != strlen(ver_str)) ||
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   292
              (atoi(buf) != ATTACH_PROTOCOL_VER)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   293
            char msg[32];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   294
            sprintf(msg, "%d\n", ATTACH_ERROR_BADVERSION);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   295
            write_fully(s, msg, strlen(msg));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   296
            return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   297
          }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   298
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   299
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   300
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   301
    off += n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   302
    left -= n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   303
  } while (left > 0 && str_count < expected_str_count);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   304
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   305
  if (str_count != expected_str_count) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   306
    return NULL;        // incomplete request
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   307
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   308
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   309
  // parse request
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   310
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   311
  ArgumentIterator args(buf, (max_len)-left);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   312
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   313
  // version already checked
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   314
  char* v = args.next();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   315
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   316
  char* name = args.next();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   317
  if (name == NULL || strlen(name) > AttachOperation::name_length_max) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   318
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   319
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   320
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   321
  BsdAttachOperation* op = new BsdAttachOperation(name);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   322
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   323
  for (int i=0; i<AttachOperation::arg_count_max; i++) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   324
    char* arg = args.next();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   325
    if (arg == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   326
      op->set_arg(i, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   327
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   328
      if (strlen(arg) > AttachOperation::arg_length_max) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   329
        delete op;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   330
        return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   331
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   332
      op->set_arg(i, arg);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   333
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   334
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   335
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   336
  op->set_socket(s);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   337
  return op;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   338
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   339
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   340
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   341
// Dequeue an operation
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   342
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   343
// In the Bsd implementation there is only a single operation and clients
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   344
// cannot queue commands (except at the socket level).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   345
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   346
BsdAttachOperation* BsdAttachListener::dequeue() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   347
  for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   348
    int s;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   349
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   350
    // wait for client to connect
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   351
    struct sockaddr addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   352
    socklen_t len = sizeof(addr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   353
    RESTARTABLE(::accept(listener(), &addr, &len), s);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   354
    if (s == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   355
      return NULL;      // log a warning?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   356
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   357
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   358
    // get the credentials of the peer and check the effective uid/guid
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   359
    uid_t puid;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   360
    gid_t pgid;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   361
    if (::getpeereid(s, &puid, &pgid) != 0) {
49742
1196aa0be8be 8201247: Various cleanups in the attach framework
clanger
parents: 49593
diff changeset
   362
      log_debug(attach)("Failed to get peer id");
18078
10417cf9967d 7178026: os::close can restart ::close but that is not a restartable syscall
rdurbin
parents: 14286
diff changeset
   363
      ::close(s);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   364
      continue;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   365
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   366
50333
7cea35f78b50 8197387: jcmd started by "root" must be allowed to access all VM processes
dtitov
parents: 50067
diff changeset
   367
    if (!os::Posix::matches_effective_uid_and_gid_or_root(puid, pgid)) {
7cea35f78b50 8197387: jcmd started by "root" must be allowed to access all VM processes
dtitov
parents: 50067
diff changeset
   368
      log_debug(attach)("euid/egid check failed (%d/%d vs %d/%d)", puid, pgid,
7cea35f78b50 8197387: jcmd started by "root" must be allowed to access all VM processes
dtitov
parents: 50067
diff changeset
   369
              geteuid(), getegid());
18078
10417cf9967d 7178026: os::close can restart ::close but that is not a restartable syscall
rdurbin
parents: 14286
diff changeset
   370
      ::close(s);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   371
      continue;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   372
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   373
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   374
    // peer credential look okay so we read the request
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   375
    BsdAttachOperation* op = read_request(s);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   376
    if (op == NULL) {
18078
10417cf9967d 7178026: os::close can restart ::close but that is not a restartable syscall
rdurbin
parents: 14286
diff changeset
   377
      ::close(s);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   378
      continue;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   379
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   380
      return op;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   381
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   382
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   383
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   384
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   385
// write the given buffer to the socket
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   386
int BsdAttachListener::write_fully(int s, char* buf, int len) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   387
  do {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   388
    int n = ::write(s, buf, len);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   389
    if (n == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   390
      if (errno != EINTR) return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   391
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   392
      buf += n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   393
      len -= n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   394
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   395
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   396
  while (len > 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   397
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   398
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   399
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   400
// Complete an operation by sending the operation result and any result
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   401
// output to the client. At this time the socket is in blocking mode so
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   402
// potentially we can block if there is a lot of data and the client is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   403
// non-responsive. For most operations this is a non-issue because the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   404
// default send buffer is sufficient to buffer everything. In the future
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   405
// if there are operations that involves a very big reply then it the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   406
// socket could be made non-blocking and a timeout could be used.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   407
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   408
void BsdAttachOperation::complete(jint result, bufferedStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   409
  JavaThread* thread = JavaThread::current();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   410
  ThreadBlockInVM tbivm(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   411
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   412
  thread->set_suspend_equivalent();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   413
  // cleared by handle_special_suspend_equivalent_condition() or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   414
  // java_suspend_self() via check_and_wait_while_suspended()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   415
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   416
  // write operation result
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   417
  char msg[32];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   418
  sprintf(msg, "%d\n", result);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   419
  int rc = BsdAttachListener::write_fully(this->socket(), msg, strlen(msg));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   420
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   421
  // write any result data
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   422
  if (rc == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   423
    BsdAttachListener::write_fully(this->socket(), (char*) st->base(), st->size());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   424
    ::shutdown(this->socket(), 2);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   425
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   426
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   427
  // done
18078
10417cf9967d 7178026: os::close can restart ::close but that is not a restartable syscall
rdurbin
parents: 14286
diff changeset
   428
  ::close(this->socket());
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   429
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   430
  // were we externally suspended while we were waiting?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   431
  thread->check_and_wait_while_suspended();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   432
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   433
  delete this;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   434
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   435
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   436
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   437
// AttachListener functions
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   438
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   439
AttachOperation* AttachListener::dequeue() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   440
  JavaThread* thread = JavaThread::current();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   441
  ThreadBlockInVM tbivm(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   442
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   443
  thread->set_suspend_equivalent();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   444
  // cleared by handle_special_suspend_equivalent_condition() or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   445
  // java_suspend_self() via check_and_wait_while_suspended()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   446
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   447
  AttachOperation* op = BsdAttachListener::dequeue();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   448
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   449
  // were we externally suspended while we were waiting?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   450
  thread->check_and_wait_while_suspended();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   451
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   452
  return op;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   453
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   454
18931
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   455
// Performs initialization at vm startup
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   456
// For BSD we remove any stale .java_pid file which could cause
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   457
// an attaching process to think we are ready to receive on the
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   458
// domain socket before we are properly initialized
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   459
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   460
void AttachListener::vm_start() {
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   461
  char fn[UNIX_PATH_MAX];
19269
59693d90fd61 8021771: warning stat64 is deprecated - when building on OSX 10.7.5
dsamersoff
parents: 18931
diff changeset
   462
  struct stat st;
18931
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   463
  int ret;
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   464
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   465
  int n = snprintf(fn, UNIX_PATH_MAX, "%s/.java_pid%d",
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   466
           os::get_temp_directory(), os::current_process_id());
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   467
  assert(n < (int)UNIX_PATH_MAX, "java_pid file name buffer overflow");
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   468
19269
59693d90fd61 8021771: warning stat64 is deprecated - when building on OSX 10.7.5
dsamersoff
parents: 18931
diff changeset
   469
  RESTARTABLE(::stat(fn, &st), ret);
18931
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   470
  if (ret == 0) {
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   471
    ret = ::unlink(fn);
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   472
    if (ret == -1) {
40625
6b45fb9188f9 8157236: attach on ARMv7 fails with com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file
dsamersoff
parents: 25468
diff changeset
   473
      log_debug(attach)("Failed to remove stale attach pid file at %s", fn);
18931
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   474
    }
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   475
  }
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   476
}
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18078
diff changeset
   477
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   478
int AttachListener::pd_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   479
  JavaThread* thread = JavaThread::current();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   480
  ThreadBlockInVM tbivm(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   481
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   482
  thread->set_suspend_equivalent();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   483
  // cleared by handle_special_suspend_equivalent_condition() or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   484
  // java_suspend_self() via check_and_wait_while_suspended()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   485
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   486
  int ret_code = BsdAttachListener::init();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   487
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   488
  // were we externally suspended while we were waiting?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   489
  thread->check_and_wait_while_suspended();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   490
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   491
  return ret_code;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   492
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   493
55682
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   494
bool AttachListener::check_socket_file() {
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   495
  int ret;
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   496
  struct stat st;
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   497
  ret = stat(BsdAttachListener::path(), &st);
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   498
  if (ret == -1) { // need to restart attach listener.
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   499
    log_debug(attach)("Socket file %s does not exist - Restart Attach Listener",
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   500
                      BsdAttachListener::path());
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   501
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   502
    listener_cleanup();
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   503
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   504
    // wait to terminate current attach listener instance...
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   505
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   506
    while (AttachListener::transit_state(AL_INITIALIZING,
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   507
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   508
                                         AL_NOT_INITIALIZED) != AL_NOT_INITIALIZED) {
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   509
      os::naked_yield();
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   510
    }
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   511
    return is_init_trigger();
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   512
  }
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   513
  return false;
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   514
}
70fab3a8ff02 8225690: Multiple AttachListener threads can be created
ysuenaga
parents: 50333
diff changeset
   515
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   516
// Attach Listener is started lazily except in the case when
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   517
// +ReduseSignalUsage is used
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   518
bool AttachListener::init_at_startup() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   519
  if (ReduceSignalUsage) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   520
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   521
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   522
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   523
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   524
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   525
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   526
// If the file .attach_pid<pid> exists in the working directory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   527
// or /tmp then this is the trigger to start the attach mechanism
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   528
bool AttachListener::is_init_trigger() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   529
  if (init_at_startup() || is_initialized()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   530
    return false;               // initialized at startup or already initialized
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   531
  }
40625
6b45fb9188f9 8157236: attach on ARMv7 fails with com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file
dsamersoff
parents: 25468
diff changeset
   532
  char fn[PATH_MAX + 1];
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   533
  int ret;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   534
  struct stat st;
40625
6b45fb9188f9 8157236: attach on ARMv7 fails with com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file
dsamersoff
parents: 25468
diff changeset
   535
  snprintf(fn, PATH_MAX + 1, "%s/.attach_pid%d",
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   536
           os::get_temp_directory(), os::current_process_id());
40625
6b45fb9188f9 8157236: attach on ARMv7 fails with com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file
dsamersoff
parents: 25468
diff changeset
   537
  RESTARTABLE(::stat(fn, &st), ret);
6b45fb9188f9 8157236: attach on ARMv7 fails with com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file
dsamersoff
parents: 25468
diff changeset
   538
  if (ret == -1) {
6b45fb9188f9 8157236: attach on ARMv7 fails with com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file
dsamersoff
parents: 25468
diff changeset
   539
    log_debug(attach)("Failed to find attach file: %s", fn);
6b45fb9188f9 8157236: attach on ARMv7 fails with com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file
dsamersoff
parents: 25468
diff changeset
   540
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   541
  if (ret == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   542
    // simple check to avoid starting the attach mechanism when
50333
7cea35f78b50 8197387: jcmd started by "root" must be allowed to access all VM processes
dtitov
parents: 50067
diff changeset
   543
    // a bogus non-root user creates the file
7cea35f78b50 8197387: jcmd started by "root" must be allowed to access all VM processes
dtitov
parents: 50067
diff changeset
   544
    if (os::Posix::matches_effective_uid_or_root(st.st_uid)) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   545
      init();
49742
1196aa0be8be 8201247: Various cleanups in the attach framework
clanger
parents: 49593
diff changeset
   546
      log_trace(attach)("Attach triggered by %s", fn);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   547
      return true;
40625
6b45fb9188f9 8157236: attach on ARMv7 fails with com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file
dsamersoff
parents: 25468
diff changeset
   548
    } else {
6b45fb9188f9 8157236: attach on ARMv7 fails with com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file
dsamersoff
parents: 25468
diff changeset
   549
      log_debug(attach)("File %s has wrong user id %d (vs %d). Attach is not triggered", fn, st.st_uid, geteuid());
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   550
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   551
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   552
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   553
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   554
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   555
// if VM aborts then remove listener
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   556
void AttachListener::abort() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   557
  listener_cleanup();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   558
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   559
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   560
void AttachListener::pd_data_dump() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   561
  os::signal_notify(SIGQUIT);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   562
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   563
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   564
AttachOperationFunctionInfo* AttachListener::pd_find_operation(const char* n) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   565
  return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   566
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   567
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   568
jint AttachListener::pd_set_flag(AttachOperation* op, outputStream* out) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   569
  out->print_cr("flag '%s' cannot be changed", op->arg(0));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   570
  return JNI_ERR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   571
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   572
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   573
void AttachListener::pd_detachall() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   574
  // do nothing for now
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   575
}