| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- //go:build windows
- // +build windows
- package namedpipe
- import (
- "bufio"
- "fmt"
- log "github.com/sirupsen/logrus"
- "net"
- "sync/atomic"
- )
- const pipeNameDaemonAndSubPattern = `\\.\pipe\`
- const ONEAGENT = "cw-oneagent"
- const NETFLOW = "cw-netflow"
- const SERVERAGENT = "cw-serveragent"
- type NamedPipe4W struct {
- *namedPipe
- pipePath string
- listener *npipe.PipeListener
- conn net.Conn
- }
- /*
- ListenNpipe
- @Description: 创建命名管道文件,返回命名管道对象
- @param agent_type: from
- @param to_type: to
- @param isMaster: 是否为daemon创建的
- @param single: 是否为单文件模式
- @param rootPath: 命名管道文件夹路径
- @return *NamedPipe4U: 命名管道对象
- @return error: 错误信息
- */
- func ListenNpipe(agent_type, to_type string, isMaster, single bool, rootPath string) (*NamedPipe4W, error) {
- np, err := newNamePipe(agent_type, to_type, isMaster, single, rootPath)
- if err != nil {
- return nil, err
- }
- np4w := &NamedPipe4W{namedPipe: np}
- if err := np4w.initPipe(); err != nil {
- return nil, err
- }
- return np4w, nil
- }
- func (np *NamedPipe4W) getPipePath() (daemon2subPipe, sub2DaemonPipe string, err error) {
- daemon2subPipe = fmt.Sprintf("%s%s2%s", pipeNameDaemonAndSubPattern, np.fromType, np.toType)
- sub2DaemonPipe = fmt.Sprintf("%s%s2%s", pipeNameDaemonAndSubPattern, np.toType, np.fromType)
- return daemon2subPipe, sub2DaemonPipe, nil
- }
- func (np *NamedPipe4W) initPipe() error {
- daemon2subPipe, sub2DaemonPipe, err := np.getPipePath()
- if err != nil {
- return err
- }
- if np.isDaemon {
- // daemon进程进行建连
- ln, err := npipe.Listen(daemon2subPipe)
- if err != nil {
- return err
- }
- np.listener = ln
- // 过程可能会阻塞
- conn, err := ln.Accept()
- if err != nil {
- return err
- }
- np.conn = conn
- np.recvPipe = bufio.NewReader(conn)
- np.sendPipe = bufio.NewWriter(conn)
- } else {
- conn, err := npipe.Dial(sub2DaemonPipe)
- if err != nil {
- return err
- }
- np.conn = conn
- np.sendPipe = bufio.NewWriter(conn)
- np.recvPipe = bufio.NewReader(conn)
- }
- return nil
- }
- // only called when io.EOF occurs
- func (np *NamedPipe4W) FreeUp4EOF() {
- if !atomic.CompareAndSwapUint32(&np.quitFlag, 0, 1) {
- log.WithField("module", "namedPipe_Win").Warnf("named pipe(%s) already free", np.pipePath)
- return
- }
- log.WithField("module", "namedPipe_Win").Infof("named pipe(%s) free begin", np.pipePath)
- np.wg.Wait()
- conn := np.conn
- np.conn = nil
- if conn != nil {
- if err := conn.Close(); err != nil {
- log.WithField("module", "namedPipe_Win").Errorf("close named pipe(%s) conn error: %v", np.pipePath, err)
- }
- }
- listener := np.listener
- np.listener = nil
- if listener != nil {
- if err := listener.Close(); err != nil {
- log.WithField("module", "namedPipe_Win").Errorf("close named pipe(%s) listener error: %v", np.pipePath, err)
- }
- }
- np.sendPipe = nil
- np.recvPipe = nil
- log.WithField("module", "namedPipe_Win").Infof("named pipe free(%s) end", np.pipePath)
- }
|