The issue manifests in fork: POSIX fork mandates that a
fork'd process is created with a single thread. If a
multithreaded program forks, and some thread was in
malloc() when the fork() happened, then in the child
the lock will be held but there will be no thread to
release it.
We assume the system malloc() must already know how to
deal with this and is thread-safe, but it won't know about
our custom spinlock. Judging that this is no longer
necessary (the lock code was added 15 years ago) we remove
it.
Signed-off-by: Dan Cross <cross@gajendra.net>
The dump substitutes each \n in a multiline tag with a 0xff byte.
Since it is not valid UTF it cannot occur in an ordinary dump file.
Old acmes will just read it in as an error rune.
Fixes#135.
Fixes#153.
This hides the menu on dock on all screens which is more than we want.
The code was added to fix a problem with Catalina that I can no longer
reproduce, so I guess it works now.
Fixes#336.
There are many things we could do to make this work.
an environment variable to control the character.
Another option would be to use U+00A0 (non-breaking space),
which renders the same as space.
This change avoids changing the separator character and instead
assumes that if the left side of the tag already ends in " Del Snarf |"
then what comes before that is the file name.
Acme already aggressively preserves the "Del Snarf |",
so this should work decently well as a stop-gap.
We can always try something else later.
Fixes#26.
Fixes#104.
Fixes#329.
Real disk devices should be block devices anyway.
One user reported the disksize check causing a
system reboot during vac of a tree with an "interesting"
device.
Fixes#103.
This brings mk's behavior when using rc in line with Plan 9's.
The existing code is for Unix environment data structures but
also was assuming Unix shell semantics where empty and missing
variables are mostly equivalent.
The Plan 9 code (/sys/src/cmd/mk/plan9.c in the distribution)
explicitly removes /env/name (creating an empty list) when the
value is missing or an empty string.
Fixes#255.
Improved error message in case of unexpected open flags. The message
unexpected open flags requested=0100040 unhandled=040
prompted me to clear the FMODE_EXEC flag, although I wonder if I
shouldn't have set OEXEC (0x3) instead.
Now that we only have Metal, we can drop the -metal.
Also now that Carbon is gone we can drop the macargv.c,
and then the -objc from object file names.
We didn't start using Metal until macOS 10.14,
but it was available on 10.13, which is currently
the oldest Apple-supported version of macOS.
Simplify by deleting the old code.
The functions from <ctype.h> require that their argument be
representable as an unsigned char, anything else is an error.
Change-Id: I9dafc49c431b7a2550b041603f27bac3c0010eea
Some truetype fonts have good manual hinting.
Ignoring hinting makes the font render badly on low resolution screens.
This commit only disables the freetype autohinter, and allows hinting.
This splits a certain vtmallocz call in mkihash into two vtmallocz
calls. The first issue this fixes is that the C aliasing rules were not
respected in the code before this commit. The other thing is that this
enables better memory alignment guarantees.
Updates #313
Change-Id: Ia4f3e0fc85facc778193f5e977d4f99a1a9abd23
For pthread systems that are fussy about which stack is used,
this makes sure that threadmain runs on a system stack.
If you only use proccreate (never threadcreate), all threads run
on system stacks.
Under certain conditions it looks like frexp gets #defined
to something else on macOS during system headers,
which then breaks the declaration in libc.h.
Remote whitespace at the ends of lines.
Remove blank lines from the ends of files.
Change modes on source files so that they
are not executable.
Signed-off-by: Dan Cross <cross@gajendra.net>
In general, no space after `if` etc, and no
braces for a single statement inside of a loop
or conditional.
Signed-off-by: Dan Cross <cross@gajendra.net>
A loop is added for each structure field instead of accessing the other
fields through the first one in one loop.
Updates #313
Change-Id: I0e27e15feacb77391bc1decee7cf720d64d14586
GCC pointed this out with some "warning: ‘strncpy’ specified bound NUM
equals destination size [-Wstringop-truncation]" warnings.
Change-Id: Id8408b165f6e4ae82c96a77599d89f658d979b32
These make no sense and are not really needed at all.
Add a best-effort attempt to get at the gcc/clang macro
in lib9.h, but if it fails, no big deal.
Fixes#324.
This should prevent the issues of dist/buildmk and src/mkhdr getting out
of synchronization yet again.
I also add a rule for arm64 to the OBJTYPE sed command.
Fixes#243Fixes#320
Change-Id: I60f69a1f32b5ed5ae5ac8a1659c38e29debed005
Passing a null pointer to qsort is an error in C (GCC and Clang agree
with the standards there, so this is no joke).
Change-Id: Ia2b015793a75ea4e85ae8f47da6beead9c4290e6
Just added a pair of parentheses. I also ran cb on cb.c to beautify the
code.
This is actually on Gerrit from 2016:
https://plan9port-review.googlesource.com/c/plan9/+/1574
Change-Id: I5e234adba0f95c13d6eecb121bf11bba4bf54566
Temp file size is now declared in an enum; changing it from the
default introduces a subtle bug in putline(), which expects it to
be 32767.
Mask with NBLK-1 instead.
Page was hanging because ghostscript never closes the fd from which
we're reading BMP data. We close our end of the pipe so that ghostscript
will close its end.
Tested with ghostscript version 9.50.
Fixes#124
awk was splitting records into bytes instead of runes for empty FS.
For example, this was printing only the first byte of the utf-8 encoding
of é:
echo é | awk 'BEGIN{FS=""}{print $1}'
The change just copies how the `split` function handles runes.
Originally reported by kris on twitter:
https://twitter.com/p9luv/status/1180436083433201665
The code had a nested use of the follow() function that could cause +=+
and -=- to register as ++ and --. The first follow() to execute could
consume a character and match and then the second follow() could consume
another character and match. For example i-=-10 would result in a syntax
error and i-=- would decrement i.
When fetching, messages are sent to plumber as soon as the ENVELOPE part is read.
The date field of the message is sent when the INTERNALDATE part is read and
there is no guarantee that this will be read before the ENVELOPE.
This bug can be observed when using faces(1) which will retrieve messages with
a null date and then always display a 'Jan 1' date instead of the correct one.
The fix is to simply send the message to plumber after having read all parts,
thus ensuring the message is complete.
Instead of checking Fcall.data==nil, check Fcall.count==0.
The former check always fails after `gcc -O2` optimizations
(gcc version 8.3.0).
Also fix an out-of-bound read detected by valgrind:
```
==31162== Invalid read of size 1
==31162== at 0x11005E: morerules (rules.c:739)
==31162== by 0x110254: writerules (rules.c:775)
==31162== by 0x10D2FE: fsyswrite (fsys.c:848)
==31162== by 0x10C304: fsysproc (fsys.c:248)
==31162== by 0x112E8C: threadstart (thread.c:96)
==31162== by 0x4A682BF: ??? (in /usr/lib/libc-2.29.so)
==31162== Address 0x4ea984a is 0 bytes after a block of size 250 alloc'd
==31162== at 0x483AD7B: realloc (vg_replace_malloc.c:826)
==31162== by 0x1196F3: p9realloc (malloc.c:53)
==31162== by 0x10BDFD: erealloc (plumber.c:124)
==31162== by 0x10FCD9: concat (rules.c:642)
==31162== by 0x10FCD9: concat (rules.c:635)
==31162== by 0x110230: writerules (rules.c:773)
==31162== by 0x10D2FE: fsyswrite (fsys.c:848)
==31162== by 0x10C304: fsysproc (fsys.c:248)
==31162== by 0x112E8C: threadstart (thread.c:96)
==31162== by 0x4A682BF: ??? (in /usr/lib/libc-2.29.so)
```
Fixes#256
According to <https://askubuntu.com/a/309146>, use of `/proc/acpi` to
get battery usage is deprecated. This commit replaces the two files from
this API with the single file `/sys/class/power_supply/BAT0/capacity`,
simultaneously removing the need to calculate battery percentage.
The immediate display of the screen sometimes miss the update from
the CPU side memory. No obvious synchronization mechanism is available.
In order to make sure the screen updates properly, we set needsDisplay
again after 16ms delay to ensure a second screen update.
Just as look expands a click in /etc/passwd to the full name
(provided that file exists), it now expands a click in https://9fans.net/
to the full URL (provided the prefix is http:// or https://).
Probably more adjustment is needed.
Autoident mode is the leading cause of trailing spaces on lines.
Remove them during Put to make various picky tools happier.
The changes during Put are added as a separate entry to the
file history, so that the first Undo after Put restores the spaces.
* devdraw: cocoa metal screen uses a dirty hack to make everything smooth
* devdraw: cocoa metal screen uses a layer to make fullscreen applications behave
* devdraw: macOS cocoa metal fix resizeimg without img
* devdraw: macOS cocoa metal uses blit instead of render
We directly use the blit command encoder to copy texture to the
framebuffer. We no longer need to compile the metal shader every
time the application starts just for rendering a flat 2D surface.
* travis: add osx images covering 10.13 and 10.14
The commit that introduced this was pushed accidentally.
It is not a good idea to do this.
(It breaks programs that think that a clean window
means the body matches the on-disk file.)
It is possible to receive multiple screen resize events, and resizeimg
would be called for different sizes, before _flushmemscreen actually
gets called with rectangle sizes different from the most recent
resizeimg call. The size mismatch would trigger illegal memory
access inside _flushmemscreen.
This commit protects _flushmemscreen by returning early if the requested
rectangle is outside of the current texture rectangle.
Auto-indent mode leaves trailing spaces on blank lines
as you type past them, so silently elide them from the
window content as it gets written back to disk.
Another option would be to remove them from the
window entirely during Put, but they're actually nice
to have while editing, and to date Put has never
modified the window content.
If $font is not set, the default font is constructed from
font data linked into every libdraw binary. That process
was different from the usual openfont code, and so it was
not hidpi-aware, resulting in very tiny fonts out of the box
on hidpi systems, until users set $font.
Fix this by using openfont to construct the default font,
by recognizing the name *default* when looking for
font and subfont file contents. Then all the hidpi scaling
applies automatically.
As a side effect, the concept of a 'default subfont' is gone,
as are display->defaultsubfont, getdefont, and memgetdefont.
Paint first appeared in 9front. The 9front license is reproduced
in the related source files - the original repository is located at
https://code.9front.org/hg/plan9front.
Add a new macOS cocoa screen, cocoa-screen-metal.m.
Rewrite the macOS cocoa drawing code to use the builtin runloop,
and use Metal to push pixels with CAMetalLayer.
Remove all of the deprecated code, and simplify some of the logic.
Modify mkwsysrules.sh such that the new code is used only when
the system version is equal or higher than 10.14.
Allow touch events to simulate mouse clicks:
three finger tap for the middle mouse button;
four finger tap for the 2-1 chord.
Support Tresize.
Scale 16x16 Cursor up to 32x32 with an EPX algorithm.
Support macOS input sources including the basic dead keys and the
advanced CJK input methods.
Increase the communication buffers in cocoa-srv.c to allow more
input, especially for long sentences prepared by the macOS input
souces.
Both `upas/nfs` and `upas/smtp` call the currently broken `tlsClient()`
from libsec. This commit copies a fix from upas/nfs into upas/smtp.
In `imapdial()`, upas/nfs replaces a process call for tlsClient with
`stunnel3` when not on Plan 9. upas/smtp calls tlsClient directly
as a function, so imapdial was copied into mxdial.c as `smtpdial()`,
and tlsClient+dial replaced with a call to smtpdial.
This makes fontsrv use the PostScript font names on X11.
The PostScript font names contains only alphanumeric and
hyphens. This allows us to use the Font command in acme.
It also matches the font names used by fontsrv on macOS,
which has been using PostScript font names.
macOS Mojave version 10.14 starts to disable font smoothing.
We disable font smoothing for OSX_VERSION >= 101400 to match the
system default font rendering.
It also makes the font rendering on macOS similar to that on X11.
Opening /dev/ptyXX files fails on recent
FreeBSD versions.
Following the same fix being applied to
Linux, OpenBSD, and Darwin, we use openpty
to open a pseudoterminal in openpts.
* Avoid allocating empty images by adding 1 to width/height. This was
crashing fontsrv. The total width of the subfont image can be zero
even if the characters are present in the font. For example, all the
characters in x0300.bit (part of "Combining Diacritical Marks" Unicode
block) have zero width.
* Make sure U+0000 is always present in the font, otherwise libdraw
complains with: "stringwidth: bad character set for rune 0x0000 in ..."
* Use the same fallback glyph (pjw face) as OS X. This also fixes a bug
where advance was set to the total width of subfont instead of the
character.
Update #125 (most likely fixes the crash if in X11)
Change-Id: Icdc2b641b8b0c08644569006e91cf613b4d5477f
According to RFC 3501 the arguments to the LOGIN command should be
quoted strings (or length prefixed string literals). Without quoting,
authentication to some IMAP servers (e.g. Dovecot) will fail.
When plumbing an address like `3-`, Acme selects line 1,
and similarly `3+` selects line 5.
The same problem can be observed for character addresses (`#123+`)
but _not_ for ones like `+`, `.+` or `/foo/+`:
The problem only occurs when a number is followed by a direction (`-`/`+`).
Following along with the example `3-` through `address` (in addr.c):
We read `3` into `c` and match the `case` on line 239.
The `while` loop on line 242ff reads additional digits into `c`
and puts the first non-digit back by decrementing the index `q`.
Then we find the range for line 3 on line 251 and continue.
On the next iteration, we set `prevc` to the last `c`,
but since that part read ahead _into `c`_,
`c` is currently the _next_ character we will read, `-`,
and now `prevc` is too.
Then in the case block (line 210) the condition on line 211 holds
and Acme believes that it has read two `-` in sequence
and modifies the range to account for the “first” `-`.
The “second” `-` gets applied after the loop is done, on line 292.
So the general problem is:
While reading numbers, Acme reads the next character after the number into `c`.
It decrements the counter to ensure it will read it again on the next iteration,
but it still uses it to update `prevc`.
This change solves the problem by reading digits into `nc` instead.
This variable is used to similar effect in the block for directions (line 212)
and fills the role of “local `c` that we can safely use to read ahead” nicely.
For some fonts, using box-drawing characters in the representative
text for computing the line height results in it being uncomfortably
high. Replace them with accented capitals and tall lower-case letters
which lead to a more conservative increase in the line height.
Fixes#162.
Double the width returned by CTFontGetBoundingBox when drawing.
Add box drawing characters for determining the line height.
Call freememimage(1) for the character memimage.
Fixes#18.
Fixes#120.
Fixes#146.
TERM_PROGRAM is the customary way to identify which kind of terminal
emulator program one uses on macOS.
This change sets TERM_PROGRAM to termprog since both variables are used
for the same purpose.
rc on amd64 stores ulimit values as 32-bit int, but the limits on
OpenBSD amd64 can exceed 2^31, so "ulimit -a" shows some values as
negative. This is a problem when I want to increase my ulimit but
the hard ulimit values are printed as negative.
Before, executing Get in a file rewound the window offset and
selection to the start of the file.
After this CL, Get preserves the window offset and selection,
where preserve is defined as "the same line number and rune
offset within the line". So if the window started at line 10
before and the selection was line 13 chars 5-7, then that
will still be true after Get, provided the new content is large
enough.
This should help the common situation of plumbing a
compiler error, realizing the window is out of date,
clicking Get, and then losing the positioning from the
plumb operation.
Since macOS 10.13, opening the /dev/ptyXX files
always return ENOENT.
Consequently, we changed getpts to use openpty to
open a pseudoterminal, like on Linux and OpenBSD.
Fixes#90.
Fixes#110.
decode.c:146:8: warning: variable ‘argv’ set but not used
fs.c:953:47: warning: variable ‘reset’ set but not used
imap.c:348:6: warning: variable ‘prefix’ set but not used
Updates #114.
Bad remote file systems can change mtime unexpectedly,
and then there is the problem that git rebase and similar
operations like to change the files and then change them back,
modifying the mtimes but not the content.
Avoid spurious Put errors on both of those by checking file
content.
(False positive "modified since last read" make the real ones
difficult to notice.)
After making the build on macOS silent on commit 310ae03,
the build was broken on macOS lesser than 10.12 (Sierra).
This commit conditionally checks the version the of the
SDK before using the defined values for silent build.
Fixes#66.
Rename following .cvsignore files to .gitkeep since they are
required by the build (directories must exist before build):
- bin/fossil/.gitkeep
- bin/fs/.gitkeep
- bin/venti/.gitkeep
Change-Id: I9c2865058480cffb3a4613f25e2eca1f7e5578c0
A pixel is 32 bits wide in RGBA, regardless of system's word size.
Change-Id: Iea36a8dafdec9ce8d593f944ef5ed1ea08e11d25
Reviewed-on: https://plan9port-review.googlesource.com/2980
Reviewed-by: David du Colombier <0intro@gmail.com>
As written, it is passing a rune to strchr, which likely ignores
all but the bottom 8 bits of the rune. Long-standing Plan 9 bug too.
Fixes#87.
Change-Id: I6a833373b308bed8760d6989972c7f77b4ef3838
Reviewed-on: https://plan9port-review.googlesource.com/2921
Reviewed-by: Russ Cox <rsc@swtch.com>
This is an experiment.
Like tpic it's a copy-and-paste fork of pic.
Change-Id: Ia22772bd5881c7904a6d8f8e0b46fde8cea89cbd
Reviewed-on: https://plan9port-review.googlesource.com/2920
Reviewed-by: Russ Cox <rsc@swtch.com>
Fix a bug folding newlines in strings constants in C code snippets
in YACC. This code has existed since at least 2nd Edition Plan 9.
Change-Id: Iba17b89a6529ac9fa6610bf0b44f551904174c26
Signed-off-by: Dan Cross <cross@gajendra.net>
Reviewed-on: https://plan9port-review.googlesource.com/2840
Reviewed-by: Russ Cox <rsc@swtch.com>
The original buffer is f->nsubf*sizeof *subf bytes (oldsize) large.
Once it's full, a new buffer of (f->nsubf+DSUBF)*sizeof *subf
(newsize) is mallocated. Unfortunately memmove() reads (newsize)
bytes from the original (oldsize) buffer, causing a buffer overflow.
By switching to realloc(), we don't need to do buffer size calculation,
memmoving, and freeing of the original buffer.
Change-Id: Ibf85bc06abe1c8275b11acb1d7d346a14291d2cd
Reviewed-on: https://plan9port-review.googlesource.com/1520
Reviewed-by: Gleydson Soares <gsoares@gmail.com>
(el-sr) is the string length and (sizeof wdir - strlen(name) - 20)
is the buffer size. When the string length is greater than the
buffer size, the beginning of the string is supposed to be trimmed
to fit in the buffer size. Unfortunately a pair of parentheses were
missing, pointing sr outside the buffer, and the for loop below
then reads outside the buffer. For certain binary data printed in
a window, it causes a segfault.
Change-Id: Iffeaa348260ee2a5a36d9577308fb8d1c1688d05
Reviewed-on: https://plan9port-review.googlesource.com/1540
Reviewed-by: Gleydson Soares <gsoares@gmail.com>
Since Google (and a lot of the outside) is so engrained with using
^C as interrupt, I'd like to be able to use it in 9term if I've
stty'd my intr to ^C. Without this, hitting ^C still works but if
the program behind the window isn't reading from /dev/cons, it won't
take effect till after I hit a newline which is often very confusing.
I know this is a hack since it only works if I stty intr ^C but that
seems the only other character that gets used anyways.
Change-Id: I0597e63b2d7628f5668c648e6dba6f281e4b27fd
Reviewed-on: https://plan9port-review.googlesource.com/2742
Reviewed-by: Russ Cox <rsc@swtch.com>
9term now uses the low bit of ws.ws_ypixel to signal
whether this is a hidpi display, and mc adjusts the font
it uses for columnation accordingly.
Makes 'lc' work right on hidpi displays.
Change-Id: I52928871ffb7f4c6fd6722f3d59f1836379148c6
Reviewed-on: https://plan9port-review.googlesource.com/2760
Reviewed-by: Russ Cox <rsc@swtch.com>