Commit Graph

3980 Commits

Author SHA1 Message Date
Dmitri Vereshchagin
44f780a10f devdraw: use bigarrow as default cursor on X11 2026-03-29 09:54:26 -04:00
Roger Peppe
31b61f0fca src/cmd/acme: write dump file atomically
On a few occasions, I've found my acme.dump file overwritten
with zero-length content. I suspect it happens when the machine
is going down or under severe memory pressure, ending
with the file created but not written to.

Instead of opening and writing the file in place, create a temporary
file alongside the destination, write to that, then rename it over
the original. We take care to preserve the original permissions,
although ownership might change (that's probably not an issue in
practice). The underlying `mkstemp` call creates the temporary
file without any access rights for group or other, so there
shouldn't be any window of opportunity for an attacker to open it
before the permissions are changed.

Change-Id: Id0bc0e76c0acf5671c94b1b454cf23632b675586
2026-03-29 09:53:26 -04:00
Roger Peppe
4975178519 src/lib9: support renaming files
This is the standard plan 9 API for renaming files within
a directory.

Change-Id: Iae17af4b201220c7690e73bda88409fd041e7ff5
2026-03-29 09:53:26 -04:00
Roger Peppe
53b5ac1564 devdraw: fix stuck mouse button when using Ctrl/Alt+Click
When physical button 1 is remapped to button 2 (Ctrl) or 3 (Alt) on
ButtonPress, the ButtonRelease event still reports the physical button 1.
This caused the release to clear the wrong bit, leaving the simulated
button permanently stuck.

Fix by recording the button mapping on press and applying it on release.

Written mostly by Claude, but I've reviewed the code and it
seems like the right kind of fix, and it works for me.

Fixes #714.

Change-Id: I9f465e1dcbe766531a37088e0fc9df2570e1c01d
2026-03-29 09:51:54 -04:00
David du Colombier
0d87d4b75e devdraw, acme, snarfer: remove 64KB snarf buffer limit
The snarf code silently dropped text larger than SnarfSize (64KB),
causing paste to produce nothing. Replace the static clip buffer
with a dynamically allocated one, remove all the size checks, and
read the actual X11 property size instead of capping at SnarfSize.
2026-03-17 14:45:51 -04:00
AlternatePortal
ae4fdf4268 libthread: fix typo in _runthreadspawn 2026-03-16 15:13:57 -04:00
Russ Cox
6654cad3c5 libthread: copy exec args into malloc'ed memory
On Solaris, the child of fork does not have access to the stacks
of other threads that existed at the time of the fork, as demonstrated
by the C program below (fails on Solaris, works everywhere else).
Work around this by making a copy of everything the child needs
in malloc'ed memory, which is inherited properly.

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <sys/types.h>

    int *p;

    pthread_mutex_t mu = PTHREAD_MUTEX_INITIALIZER;
    pthread_cond_t ready = PTHREAD_COND_INITIALIZER;
    pthread_cond_t never = PTHREAD_COND_INITIALIZER;

    void*
    thread1(void *v)
    {
        int local = 42;
        pthread_mutex_lock(&mu);
        p = &local;
        pthread_cond_signal(&ready);
        pthread_cond_wait(&never, &mu);
        return 0;
    }

    void*
    thread2(void *v)
    {
        pthread_mutex_lock(&mu);
        while(p == 0)
            pthread_cond_wait(&ready, &mu);
        pthread_mutex_unlock(&mu);

        printf("parent: *p = %d\n", *p);

        int pid = fork();
        if (pid == 0) {
            printf("child: *p = %d\n", *p);
            exit(0);
        }
        printf("parent: pid = %d\n", pid);
        int status;
        waitpid(pid, &status, 0);
        if(WIFEXITED(status))
            printf("child exit %d\n", WEXITSTATUS(status));
        else if(WIFSIGNALED(status))
            printf("child signal %d\n", WTERMSIG(status));
        else
            printf("unexpected child status %d\n", status);
        return 0;
    }

    int
    main(void)
    {
        pthread_t t1, t2;
        pthread_create(&t1, 0, thread1, 0);
        pthread_create(&t2, 0, thread2, 0);
        void *v;
        pthread_join(t2, &v);
        return 0;
    }
2026-02-26 09:47:54 -05:00
Dmitri Vereshchagin
cb7001c8d2 win: fix spaces in Acme window tag
Acme adds a space after Look at the end of window tags.  Therefore, the
space before Send is not needed.  The space after Send is for consistency
and convenience.
2026-02-08 09:47:45 -05:00
user
a39606e324 devdraw: allow resize in xattach
The created window in xattach is missing the StructureNotifyMask,
if the WM does resize the window before mapping (like tiling WMs
do), the client will not get notified (and XGetWindowAttributes
in the same function will not get updated values)

Reproducible by starting acme in e.g. dwm.
2026-02-05 13:26:53 -05:00
MvA
b3741e6ce3 devdraw: repair incomplete repainting 2026-01-31 09:37:01 -05:00
G. Branden Robinson
f39a2407b6 troff: fix SIGFPE when using modulus operator
I uncovered this problem while writing unit tests for GNU troff's
delimited expression handling.  Plan 9 troff's numeric expression
evaluator handles division by zero but not modulus by zero.

Fixes:
$ echo '.if %0%0% .tm true' | 9 troff
Floating point exception (core dumped)
$ echo '.if 1%0 .tm true' | 9 troff
Floating point exception (core dumped)

After this patch:
$ echo '.if %0%0% .tm true' | 9 troff
x T utf
x res 720 1 1
x init
troff: modulus by zero.; stdin:1
troff: modulus by zero.; stdin:1
x trailer
V0
x stop
$ echo '.if 1%0 .tm true' | 9 troff
x T utf
x res 720 1 1
x init
troff: modulus by zero.; stdin:1
x trailer
V0
x stop
2025-11-09 14:25:48 -05:00
Scott Schwartz
37cd522b0a cmd/devdraw: handle X11 selections better
x11-screen.c accepts selection targets with the MIME type
"text/plain;charset-UTF8", but it should do so case insensitively. The
current code draws an error when working with xfce4-terminal 1.0.4,
which sends lower case.  To reproduce, run acme, snarf some text, then
paste in the terminal.  acme will report:
acme: cannot handle selection request for 'text/plain;charset=utf-8' (590)
2025-11-04 07:10:14 -05:00
G. Branden Robinson
46fbe4cd00 tmac/tmac.an*: work around formatter bug
...when rendering some man pages, such as those of ncurses.

I did not manage (nor seriously attempt) to identify the root cause of
this bug.  ncurses's use of `SH` and `SS` man(7) macros is
unremarkable.[1]  I cannot account for why the less(1) man page renders
fine and ncurses pages like insstr(3) do not.  But render badly they do,
emitting *roff logic as formatted output.

```
$ 9 nroff -man $(man -w insstr) | grep -F .ss | cat -v
     "'''if^GNAME^GSYNOPSIS^G .ss 18 NAME
     "'''if^GSYNOPSIS^GSYNOPSIS^G .ss 18 SYNOPSIS
     "'''if^GDESCRIPTION^GSYNOPSIS^G .ss 18 DESCRIPTION
     "'''if^GRETURN^GSYNOPSIS^G .ss 18 RETURN VALUE
     "'''if^GNOTES^GSYNOPSIS^G .ss 18 NOTES
     "'''if^GEXTENSIONS^GSYNOPSIS^G .ss 18 EXTENSIONS
     "'''if^GPORTABILITY^GSYNOPSIS^G .ss 18 PORTABILITY
     "'''if^GHISTORY^GSYNOPSIS^G .ss 18 HISTORY
     "'''if^GSEE^GSYNOPSIS^G .ss 18 SEE ALSO
```

With this patch:

```
$ 9 nroff -man $(man -w insstr) | grep -F .ss | cat -v | grep . || echo NO OUTPUT
NO OUTPUT
```

I do observe that the problem seems to correspond to the only use in the
package of the old-fashioned `'''` commenting convention _within a macro
definition_.  I have a notion of how GNU troff works, but little about
AT&T troff.  That said, if I were to try to get to the bottom of this
problem, I'd look into if and how the no-break command character is
handled differently in copy mode.  I see nothing in CSTR #54 to suggest
that the command characters have different meanings in copy mode and its
complement.[2]

My solution is to use idiomatic comment syntax inside macro definitions.

[1] d5dc8a4a7c/man/curs_insstr.3x (L47)

[2] unnamed in AT&T documentation but which I term "interpretation mode"
    in groff
2025-10-26 19:03:55 -04:00
Dan Cross
499efb270d nroff: bad symbold definition on command line.
`-DTDEVNAME=...` should be `-DNDEVNAME=...`.  We've been
defaulting for "37", probably forever.

Signed-off-by: Dan Cross <cross@gajendra.net>
2025-10-10 14:34:02 -04:00
G. Branden Robinson
e5b5757e64 tmac/tmac.an*: support lq, rq strings
The `lq` and `rq` strings are not a groffism, but _almost_ universally
portable to man(7) renderers.

They originate in 4BSD (1980).[1]  They entered Unix System V with SVR4
(1988 or 1989).[2]  mandoc(1) has supported them since its inception.[3]

* tmac/tmac.an:
* tmac/tmac.antimes: Do it.  Use U+201C and U+201D if the output device
  is "utf", otherwise define them as `` and ''.  Don't define them as
  `"` because that breaks when interpolating the strings in macro
  arguments.[4]

[1] https://minnie.tuhs.org/cgi-bin/utree.pl?file=4BSD/usr/lib/tmac/tmac.an.new
[2]
e68293af91/sysvr4/svr4/ucbcmd/troff/troff.d/tmac.d/an (L46)
[3] https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/mandoc/predefs.in?rev=1.1&content-type=text/x-cvsweb-markup
[4] https://www.gnu.org/software/groff/manual/groff.html.node/Calling-Macros.html

   "For the (neutral) double quote, you have recourse to an obscure
   syntactical feature of AT&T troff. ..."
2025-10-10 13:44:47 -04:00
Russ Cox
19263a1071 devdraw: work around XWayland pointer warping 2025-10-09 19:37:41 -04:00
Arusekk
00754b35a2 devdraw: fix dangling else
Because of a dangling else, after adding a name to an image with 'N',
it was immediately deleted, resulting in Enoname in response to 'n'.

This went mostly unnoticed, since plan9port itself does not use named
images, but it can break external applications like truedraw[1].

[1]: https://git.sr.ht/~arusekk/truedraw

Fixes: c66b52501b ("new draw server")
2025-10-09 09:29:12 -04:00
Anthony Sorace
80b7829854 man: remove -s from usage message 2025-09-23 17:52:58 -04:00
Jordan Niethe
bafcdddd31 B: Print usage message to stderr
B's usage message redirects its stderr to stdout instead of vice versa.
Fix this.

Signed-off-by: Jordan Niethe <jniethe5@gmail.com>
2025-09-06 05:33:17 -04:00
dependabot[bot]
a20cff92cf ci: bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-12 07:06:27 -04:00
dependabot[bot]
b83954eaf6 ci: bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-27 10:41:04 -04:00
Dmitri Vereshchagin
10564b1175 tmac/tmac.an: define .MR in a groff compatible way
groff 1.23.0 added .MR to its -man macro package.  The NEWS file states
that the inclusion of the macro "was prompted by its introduction to
Plan 9 from User Space's troff in August 2020."  From d32deab it seems
that the name for Plan 9 from User Space's implementation was suggested
by groff maintainer G. Brandon Robinson.

Not sure if the intention was to make these definitions compatible, but
it would be nice if they were.

Currently, Plan 9 from User Space's .MR expects its second argument to
be parenthesized.  groff's .MR does not.  This results in extra
parentheses appearing in manual references when viewing Plan 9 from User
Space's manual pages on a system using groff.
2025-07-27 09:58:50 -04:00
Kare Nuorteva
00446db7d8 ci: add Dependabot for GitHub Actions
Dependabot automatically maintains GitHub Actions workflows by sending
Pull Requests to project when action updates are released. Dependabot
labels the pull requests 'ci: bump actions/checkout from v3 to v4'.
Dependabot opens a maximum of five Pull Requests at a time and reviews
the need for PRs once a week.
2025-07-27 09:56:22 -04:00
lufia
8ff39da062 src/cmd/rc: import rc syntax `delim{cmd} for splitting commands from 9atom
Co-authored-by: <ori@eigenstate.org>
2025-07-27 09:55:45 -04:00
Kare Nuorteva
cc89d24235 .gitignore: ignore macOS .DS_Store files 2025-07-27 09:52:08 -04:00
Dan Cross
b2fc88d60a SunOS: silence some warnings
Give `-Wformat=0` on illumos/Solaris so that the build does not
complain about `execlp` not having a sentinel (it's nil).  Also
fix an integer size issue when casting to a void pointer.
2025-07-25 18:46:52 +00:00
Dan Cross
9d2e0d31f7 DragonFly: fix build
Fix the build for DragonFlyBSD.
2025-07-25 19:02:59 +00:00
Dan Cross
0bc66bfb3d libthread: remove check for LinuxThreads
libthread had code in `_pthreadinit` to test for LinuxThreads,
and error if it was in use.  This hasn't been relevant since
Linux 2.6, and I can't imagine there are many people trying to
build (recent) plan9port on systems that old.

Unfortunately, this code violated aliasing rules, and compilers
were complaining about it.  But, since it likely hasn't had much
relevance in 20ish years, we can probably just remove it.
2025-07-25 13:06:53 -04:00
Dan Cross
156e745be9 all: remove need for -fcommon
Use `extern` where appropriate so that we can remove `-fcommon`
on macOS and others.  On macOS, `-fcommon` generates a number of
linker warnings.

I've tested building on macOS, Linux, FreeBSD, NetBSD, OpenBSD
and illumos.  I am not in a position to test on AIX or other
more esoteric platforms, however.
2025-07-25 12:25:11 -04:00
Dan Cross
1e6e30e91e rio: proper prototypes in fns.h
Use proper function prototypes in `fns.h`, that include argument
type information.
2025-07-25 11:58:36 -04:00
Dan Cross
655f7c3184 all: clean up misleading indentation warnings
Misleading indentation warnings are actually useful, as they
will occasionally reveal actual bugs (cf the apple `goto fail`
security bug from a few years ago).  Newer versions of clang
(at least) are more aggressive about warnings in this regard,
which has exposed a few warnings that are annoying.  However,
they are easy to address.
2025-07-25 11:20:03 -04:00
Dan Cross
5a9ced10ee sort: rename kcmp to keycmp
Fixes: #648
Fixes: #655
2025-07-24 16:35:15 +00:00
Dan Cross
67dd74a964 INSTALL: set defaults for awk and egrep
Set defaults for `awk` and `egrep`, instead of
setting things multiple times when specializing on
OS, and using a default in a `case` statement.
This is cleaner and less error-prone.
2025-07-24 16:25:44 +00:00
Dan Cross
4089e29e89 warnings: fix warnings on newer compilers
Mostly turning the crank on fixing simple warnings: arrays, for
instance, can never be nil.  A couple of pointers should have been
initialized to `nil` before being tested.

Some logic in `troff` was simplified: basically, an `if` statement had
a condition that must have always been true if that section of code
were being executed at all.
2025-07-24 15:45:31 +00:00
Dan Cross
564d45b5a5 config: add $egrep
Introduce a new variable set in $PLAN9/config:
$egrep, which is conditionally set to either
`egrep` or `grep -E`, based on platform, and use
this when we want to invoke `egrep`.

This works around the endless warnings from GNU
grep stating that `egrep` is deprecated in favor
of `grep -E`, when run on e.g. Linux.
2025-07-23 19:44:54 +00:00
erentar
28690cd427 9c: change -std=c17 to -stc=c11 based on feedback in \#716 2025-07-22 12:12:39 +02:00
erentar
f97483e519 u.h: define __USE_POSIX to make glibc happy
glibc will only expose sigjmp_buf if __USE_POSIX is defined.
2025-07-22 12:12:39 +02:00
erentar
53ed65a982 9c: Explicitly set c standard as newer changes in c23 break compilation 2025-07-22 12:12:39 +02:00
erentar
6df4828542 9c: "-Wdeprecated-pragma" is only present in clang and is absent from gcc 2025-07-22 12:12:39 +02:00
Russ Cox
df9b195ebf libflate: fiz inflatezlibblock
This has obviously never been run.
2025-05-08 13:29:20 -04:00
Roger Peppe
9da5b44513 cmd/devdraw: avoid use of X button state field
This bug is an intermittent annoyance and does not seem likely to be
fixed soon. It means that every so often my acme becomes unusable
because it behaves as if a mouse button is permanently set.

Avoid that issue by keeping track of mouse button state directly.

While we're about it, fix another annoying issue: under Linux the
FocusOut event reset the kstate field but not the kbuttons field,
meaning that the buttons state could inappropriately persist. This
happened occasionally by accident, but was easy to reproduce: with the
mouse button held down, drag outside the window and click Alt-Tab to
switch away from the window. We see a KeyDown event followed by FocusOut
but no KeyUp event.

Change-Id: I3708316478c80c41806d7157ae9929c6cd84b662
2025-03-29 11:23:26 -04:00
Igor Burago
13582b1a89 .gitignore: add bin/mntgen 2025-02-17 20:15:27 -05:00
macie
776db626b6 dist/main.html: remove dead link to Belorussian translation
According to web.archive.org this link is dead since 2012/2013. According to
original issue (http://codereview.appspot.com/4251044) that translation could be
a machine translation.
2025-02-17 20:15:14 -05:00
Anthony Sorace
a5d6857a3b man: don't paginate when using nroff
This tells bin/man to set the register L to very high to avoid pagination
and updates tmac/tmac.an to use that value, if it's set, to set the page
length. This is per Plan 9's rc/bin/man and sys/lib/tmac/tmac.an.
2025-01-29 15:55:23 -05:00
Russ Cox
61e362add9 mac: arrange for arm64 run on arm64
Makes 9term.app work again (not put you in an x86_64 jail).
2024-10-22 08:11:37 -04:00
Russ Cox
a2567fcac9 devdraw: handle shift of real mouse buttons correctly 2024-06-17 09:28:40 -04:00
Russ Cox
e9cbe46fe6 lib9: skip buggy S_ISCHR check in disksize on OpenBSD
The portable code is already checking S_ISCHR anyway.
2024-06-15 22:15:06 -04:00
Russ Cox
e243a4c391 man: update indexes 2024-06-15 22:10:59 -04:00
Russ Cox
211de84701 acme: remove debug print 2024-06-15 22:10:55 -04:00
Russ Cox
0c79c32675 acme: shift button 3 for reverse search
An experiment. Let's see if it's any good.
Also document the Mac conventions in devdraw(3).
2024-06-15 10:57:45 -04:00