"go.stargrave.org/mmc"
)
-const CmdFile = "/FILE "
-
var (
Newwin = flag.String("newwin", "cmd/newwin", "Path to newwin command")
DebugFd *os.File
}
}
+func mkFifo(pth string) {
+ if _, err := os.Stat(pth); err == nil {
+ return
+ }
+ if err := syscall.Mkfifo(pth, 0666); err != nil {
+ log.Fatalln(err)
+ }
+}
+
func main() {
entrypoint := flag.String("entrypoint", mmc.GetEntrypoint(), "Entrypoint")
notifyCmd := flag.String("notify", "cmd/notify", "Path to notification handler")
UmaskCur = syscall.Umask(0)
syscall.Umask(UmaskCur)
- os.Remove("debug")
- err := syscall.Mkfifo("debug", 0666)
- if err != nil {
- log.Fatalln(err)
- }
+ mkFifo("debug")
+ var err error
DebugFd, err = os.OpenFile(
"debug", os.O_WRONLY|os.O_APPEND, os.FileMode(0666),
)
}
usersPth := path.Join(pth, "users")
- os.Remove(usersPth)
- if err := syscall.Mkfifo(usersPth, 0666); err != nil {
- log.Fatalln(err)
- }
+ mkFifo(usersPth)
go func(ch *model.Channel) {
for {
time.Sleep(mmc.SleepTime)
}(ch)
pth = path.Join(pth, "in")
- os.Remove(pth)
- if err := syscall.Mkfifo(pth, 0666); err != nil {
- log.Fatalln(err)
- }
+ mkFifo(pth)
go func(ch *model.Channel) {
for {
fd, err := os.OpenFile(pth, os.O_RDONLY, os.FileMode(0666))
}
statusPth := path.Join(pth, "status")
- os.Remove(statusPth)
- if err := syscall.Mkfifo(statusPth, 0666); err != nil {
- log.Fatalln(err)
- }
+ mkFifo(statusPth)
go func(u *model.User) {
for {
time.Sleep(mmc.SleepTime)
}(u)
pth = path.Join(pth, "in")
- os.Remove(pth)
- if err := syscall.Mkfifo(pth, 0666); err != nil {
- log.Fatalln(err)
- }
+ mkFifo(pth)
go func(u *model.User) {
var dc *model.Channel
for {
var UserStatusM sync.RWMutex
go func() {
pth := path.Join("users", "status")
- os.Remove(pth)
- if err := syscall.Mkfifo(pth, 0666); err != nil {
- log.Fatalln(err)
- }
+ mkFifo(pth)
for {
time.Sleep(mmc.SleepTime)
fd, err := os.OpenFile(pth, os.O_WRONLY|os.O_APPEND, os.FileMode(0666))
log.Println("OpenFile:", pth, err)
continue
}
- statuses := make(map[string][]string)
+ agg := make(map[string][]string)
UserStatusM.RLock()
for name, status := range UserStatus {
- statuses[status] = append(statuses[status], name)
+ agg[status] = append(agg[status], name)
}
UserStatusM.RUnlock()
- for status := range statuses {
- sort.Strings(statuses[status])
- fmt.Fprintln(fd, status+":", strings.Join(statuses[status], " "))
+ statuses := make([]string, 0, len(agg))
+ for status := range agg {
+ sort.Strings(agg[status])
+ statuses = append(statuses, status)
+ }
+ sort.Strings(statuses)
+ for _, status := range statuses {
+ fmt.Fprintln(fd, status+":", strings.Join(agg[status], " "))
}
fd.Close()
}
go func() {
os.MkdirAll("file", 0777)
pthGet := path.Join("file", "get")
- os.Remove(pthGet)
- if err := syscall.Mkfifo(pthGet, 0666); err != nil {
- log.Fatalln(err)
- }
+ mkFifo(pthGet)
pthOut := path.Join("file", "out")
- os.Remove(pthOut)
- if err := syscall.Mkfifo(pthOut, 0666); err != nil {
- log.Fatalln(err)
- }
+ mkFifo(pthOut)
for {
time.Sleep(mmc.SleepTime)
fd, err := os.OpenFile(pthGet, os.O_RDONLY, os.FileMode(0666))